type
TModalResult = (mrNone, mrOK, mrCancel, ……);
TMyButton = class(TButton)
private
FMyModalResult: TModalResult;
published
MyModalResult: TModalResult read FMyModalResult write FMyModalResult;
end;这样写了之后,属性窗口中就会自动列出这些枚举值供你选择。
TModalResult = (mrNone, mrOK, mrCancel, ……);
TMyButton = class(TButton)
private
FMyModalResult: TModalResult;
published
MyModalResult: TModalResult read FMyModalResult write FMyModalResult;
end;这样写了之后,属性窗口中就会自动列出这些枚举值供你选择。
解决方案 »
- 那位大虾解释下这句代码,小虾米看不懂
- 数据库的问题 一个简单的复制!怎么出错了 DUPLICATE entry 0 for 1 100分
- 如何用DBImage存储BMP或者Jpeg图片?
- 江湖救急!!谁有 paradox 数据库的修复工具?谢谢了
- 帮我看看,到底在哪里出错?
- 如何判断光驱的盘符???
- 如何实现.ini文件在access数据库中的备注字段的存取(在线等)
- 谁能给我一个完整的数据备份和清除历史记录的代码???
- 字符串操作 有技术含量 高手进
- 请教一个小问题,好像dxDbgrid中的column type 设为TdxDBGridDateColumn后,它自带的那个时间控件实在太难看了!
- 如何将查询出的数据导入excel中??要求有源码,因为我很菜:(
- COM
I: Integer;
P: PTypeInfo;
begin
P := TypeInfo(TPosition); //测试 TPosition 类型
with GetTypeData(P)^ do
for I := MinValue to MaxValue do
Memo1.Lines.Add(Format('%d: %s', [I, GetEnumName(P , I)]));
end;
var
ClassTypeInfo:pTypeInfo;
ClassTypeData:PTypeData;
PropInfo:PPropInfo;
// i:integer;
// Numprops:integer;
begin
ClassTypeInfo:=aClass.ClassInfo;
ClassTypeData:=GetTypeData(ClassTypeInfo);
if ClassTypeData.PropCount<>0 then begin
PropInfo:=GetPropInfo(ClassTypeInfo,aProp);
if propInfo<>nil then begin
List.Add(Format('%s ,%s',[propInfo^.Name,propinfo^.proptype^.name]));
if propinfo^.proptype^.Kind=tkEnumeration then begin
List.Add('it is a enum');
end;
end
else
List.Add('no this prop..');
end;
end;
要uses typinfo
没时间了。老板来了。还没达到要求,自己看者办吧。
TModalResult怎么不一样呢?TModalResult = Low(Integer)..High(Integer);只能关注
if propinfo^.proptype^.Kind=tkEnumeration then begin
// List.Add('it is a enum');
with GetTypeData(Propinfo^.proptype^)^ do
for i := MinValue to MaxValue do
List.Add(Format('%d: %s', [i, GetEnumName(Propinfo^.Proptype^ , i)]));
end;
对TModalResult无效,咋办?
TModalResult = Low(Integer)..High(Integer);看一看TCursor,跟这差不多
TCursor = -32768..32767;Delphi也提供了相应的CursorToString来转换为相应的string;
也就是从一个Cursors的名称映射表,转换
我不知道
但delphi都做了个Cursors的映射表,我想也只能这么做
仿照ColorToString弄个函数
function ModalResultToStr(AValue: TModalResult): string;
const
ModalResults : array[0..10] of TIdentMapEntry = (
(Value: mrNone; Name: 'mrNone'),
(Value: mrOk; Name: 'mrOk'),
(Value: mrCancel; Name: 'mrCancel'),
(Value: mrAbort; Name: 'mrAbort'),
(Value: mrRetry; Name: 'mrRetry'),
(Value: mrIgnore; Name: 'mrIgnore'),
(Value: mrYes; Name: 'mrYes'),
(Value: mrNo; Name: 'mrNo'),
(Value: mrAll; Name: 'mrAll'),
(Value: mrNoToAll; Name: 'mrNoToAll'),
(Value: mrYesToAll; Name: 'mrYesToAll'));
begin
if Not IntToIdent(AValue, Result, ModalResults) then
FmtStr(Result, '%s%.8x', [HexDisplayPrefix, AValue]);
end;
很累阿
TypeInfo;function IntegerSet(const mValue; mSize: Word): TIntegerSet;
var
I: Integer;
begin
Result := [];
for I := 0 to mSize - 1 do
Integer(Result) := Integer(Result) + TByteArray(mValue)[I]
end; { IntegerSet }function GetSetStr(mTypeInfo: PTypeInfo; const mValue; mSize: Word;
mBrackets: Boolean = True): string;
var
vCompType: PTypeInfo;
I: Integer;
S: TIntegerSet;
begin
Result := '';
S := IntegerSet(mValue, mSize);
vCompType := GetTypeData(mTypeInfo)^.CompType^;
for I := GetTypeData(vCompType).MinValue to GetTypeData(vCompType).MaxValue do
if I in S then
Result := Result + ',' + GetEnumName(vCompType, I);
Delete(Result, 1, 1);
if mBrackets then Result := '[' + Result + ']';
end; { GetSetStr }function GetSetAll(mTypeInfo: PTypeInfo;
mBrackets: Boolean = True): string;
var
vCompType: PTypeInfo;
I: Integer;
S: TIntegerSet;
begin
Result := '';
S := IntegerSet(mValue, mSize);
vCompType := GetTypeData(mTypeInfo)^.CompType^;
for I := GetTypeData(vCompType).MinValue to GetTypeData(vCompType).MaxValue do
Result := Result + ',' + GetEnumName(vCompType, I);
Delete(Result, 1, 1);
if mBrackets then Result := '[' + Result + ']';
end; { GetSetStr }
你只有判断其属性名是'ModalResult'后,再进行翻译。这就是只能比较土了,用case或子域判断(in)(在定义的范围之内)
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, FuncUnit, StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}uses
TypInfo;function IntegerSet(const mValue; mSize: Word): TIntegerSet;
var
I: Integer;
begin
Result := [];
for I := 0 to mSize - 1 do
Integer(Result) := Integer(Result) + TByteArray(mValue)[I]
end; { IntegerSet }function GetSetStr(mTypeInfo: PTypeInfo; const mValue; mSize: Word;
mBrackets: Boolean = True): string;
var
vCompType: PTypeInfo;
I: Integer;
S: TIntegerSet;
begin
Result := '';
S := IntegerSet(mValue, mSize);
vCompType := GetTypeData(mTypeInfo)^.CompType^;
for I := GetTypeData(vCompType).MinValue to GetTypeData(vCompType).MaxValue do
if I in S then
Result := Result + ',' + GetEnumName(vCompType, I);
Delete(Result, 1, 1);
if mBrackets then Result := '[' + Result + ']';
end; { GetSetStr }function GetSetAll(mTypeInfo: PTypeInfo;
mBrackets: Boolean = True): string;
var
vCompType: PTypeInfo;
I: Integer;
begin
Result := '';
vCompType := GetTypeData(mTypeInfo)^.CompType^;
for I := GetTypeData(vCompType).MinValue to GetTypeData(vCompType).MaxValue do
Result := Result + ',' + GetEnumName(vCompType, I);
Delete(Result, 1, 1);
if mBrackets then Result := '[' + Result + ']';
end; { GetSetAll }type
TMyType = set of (MyType1, MyType2, MyType3, MyType4, MyType5, MyType6);procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add(GetSetStr(TypeInfo(TMyType), [MyType2, MyType5], SizeOf([MyType2, MyType5])));
Memo1.Lines.Add(GetSetAll(TypeInfo(TMyType)));
end;end.
const
ModalResults: array[mrNone..mrYesToAll] of string = (
'mrNone',
'mrOk',
'mrCancel',
'mrAbort',
'mrRetry',
'mrIgnore',
'mrYes',
'mrNo',
'mrAll',
'mrNoToAll',
'mrYesToAll');
Memo1.Lines.Add(GetSetStr(TypeInfo(TModalResult), [mrok, mrcancel], SizeOf([mrok, mrcancel])));都不行嘞(TModalResult 不是集合类型吧?)
ModalResults: array[mrNone..mrYesToAll] of string = (
'mrNone',
'mrOk',
'mrCancel',
'mrAbort',
'mrRetry',
'mrIgnore',
'mrYes',
'mrNo',
'mrAll',
'mrNoToAll',
'mrYesToAll');function f: string
var
I: Integer;
begin
for I := mrNone to mrYesToAll do
Result := Result + ',' + ModalResults[I];
Delete(Result, 1, 1);
end;
直接写不是更好?