如何获取不是组件的对象的属性列表(在运行时)。就像具有自己属性(字体、对齐等)的网格单元格一样。
像 AdvStringGrid 或 AliGrid 或 Bergs NxGrid 这样的网格。
最佳答案
您要求访问对象的 RTTI(运行时类型信息)。
如果您使用的是 Delphi 2009 或更早版本,则 RTTI 仅公开已发布的属性和已发布的方法(即,事件处理程序)。查看 GetPropInfos()
单元中的 GetPropList()
或 System.TypInfo
函数。它们为您提供一组指向 TPropInfo
记录的指针,每个属性一个。 TPropInfo
有一个 Name
成员(除其他外)。
uses
TypInfo;
var
PropList: PPropList;
PropCount, I: Integer;
begin
PropCount := GetPropList(SomeObject, PropList);
try
for I := 0 to PropCount-1 do
begin
// use PropList[I]^ as needed...
ShowMessage(PropList[I].Name);
end;
finally
FreeMem(PropList);
end;
end;
请注意,这种 RTTI 仅适用于派生自
TPersistent
或应用了 {M+}
编译器指令(TPersistent
所做的)的类。如果您使用的是 Delphi 2010 或更高版本,则所有属性、方法和数据成员都由扩展 RTTI 公开,无论它们的可见性如何。查看
TRttiContext
单元中的 TRttiType
记录以及 TRttiProperty
和 System.Rtti
类。有关更多详细信息,请参阅 Embarcadero 的文档: Working with RTTI 。uses
System.Rtti;
var
Ctx: TRttiContext;
Typ: TRttiType;
Prop: TRttiProperty;
begin
Typ := Ctx.GetType(SomeObject.ClassType);
for Prop in Typ.GetProperties do
begin
// use Prop as needed...
ShowMessage(Prop.Name);
end;
for Prop in Typ.GetIndexedProperties do
begin
// use Prop as needed...
ShowMessage(Prop.Name);
end;
end;
关于delphi - 对象的属性列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29424176/