请帮助我。
我查找了存在的问题,但没有找到我如何在delphi类的动态数组中获取所有已发布的项目属性(声明为Class)(我使用的是Delphi 7 IDE(我不能使用其他版本))
我有这段代码:
TObjectList = array of TObject;
TSubClass = class(TObject)
private
FFirstName: string;
FLastName: string;
FDOB: TDateTime;
FArray : TObjectList;
published
property FirstName: string read FFirstName write FFirstName;
property LastName: string read FLastName write FLastName;
property DOB: TDateTime read FDOB write FDOB;
property MyArray : TObjectList read FArray write FArray ;
end;
TListSubClass = array of TSubClass;
TPersonList = class(TObject)
private
FSubClasses: TListSubClass;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property SubClasses: TListSubClass read FSubClasses write FSubClasses;
end;
我链接到了Eleers of TPersonList类(MyVariable:TPersonList)。
如何使用RTTI获取我的FSubClasses和FArray数组项的所有已发布属性的数据?
如何使用RTTI将新数据设置为FSubClasses?
谢谢你, 塞吉。
答案 0 :(得分:1)
你所谓的“动态数组”并不是Delphi世界中所谓的“动态数组”。 “动态数组”被定义为MyVar:例如整数数组。在你的课堂上,你只有TList后代。这些TList后代是某种动态存储,但它被称为TList(或TObjectList),而不是“动态数组”。
所以只需使用TypInfo单元。
对于类发布的属性,在调用GetObjectProp之后,检查返回的实例类型,并根据其类(TObjectList或TListSubClass)枚举其内容。
这是我们在开源ORM中使用的一种方法(我们专门为属性访问提供了一些面向对象的类,因此我们不需要typinfo单元)。见http://synopse.info/fossil/finfo?name=SQLite3/SQLite3Commons.pas
答案 1 :(得分:0)
查看单位GetDynArrayProp
的{{1}}和GetPropList
。
TypInfo
返回指向底层数组的指针,然后可以将其转换为正确的数组类型。
GetDynArrayProp
向您传入的类的所有属性返回指向属性信息数组的指针。
从GetPropList
返回的TPropInfo
记录包含与属性关联的getter和setter方法的地址信息,您可以使用它们分别调用getter或setter。
一般情况下,您应该深入了解Delphi帮助中的GetPropList
单元或在线文档: