Sorry,我说错了,是可以的。下面是示例:
{注:代码来源于 macro cantu 的 《Delphi 3 高级开发指南》 第4章 运行时类型消息,略有更改}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
implementation
uses
TypInfo;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
pProps : PPropList;
nTotalProps, nProps, I : Longint;
begin
nTotalProps := GetTypeData(ClassInfo).PropCount; //读取 VMT 中的类型消息
GetMem(pProps, SizeOf(PPropInfo) * nTotalProps); //分配类型接收缓冲
try
nProps := GetPropList(ClassInfo,
[tkEnumeration], pProps); //获取 VMT 中枚举型属性表, 第二个参数是一个 TTypeKind,Pascal 类型表
for I := 0 to nProps - 1 do
ComboBox1.Items.Add(pProps.Name); //获取每个枚举型类型名
finally
FreeMem(pProps, SizeOf(PPropInfo) * nTotalProps);
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var
PropName : string;
PropInfo : PPropInfo;
ptd : PTypeData;
I : Longint;
PropValue : Longint;
begin
if Combobox1.Text <> '' then
PropName := ComboBox1.Text else Exit;
ListBox1.Items.Clear;
PropInfo := GetPropInfo(ClassInfo, PropName);
ptd := GetTypeData(PropInfo.PropType^); //获取选取项的类型消息
for I := ptd.MinValue to ptd.MaxValue do
ListBox1.Items.Add(GetEnumName(PropInfo.PropType^, I));
//上面这一段获取类型名:在结构 TTypeData 中,对于枚举项,保存了一个
//NameList: ShortStringBase 表,看来是保存枚举项的名称的。
PropValue := GetOrdProp(Self, PropInfo);
ListBox1.ItemIndex := ptd.MinValue + PropValue;
end;
end.
结束。