如何获取不是组件的对象的属性列表(在运行时)。就像具有自己属性(字体、对齐等)的网格单元格一样。

像 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/

10-12 22:34