据我了解,自2010年Delphi以来,我不仅将RTTI用于出版,而且还可以在公共财产上使用。我有一个旧的Delphi 7代码,它也可以在XE7下工作,但是我仍然无法访问公共属性。
代码如下:
uses
System.TypInfo;
procedure TForm1.GetPublicProp;
var
AColumn: TcxGridDBColumn;
APropInfo: PPropInfo;
begin
AColumn := MycxGridDBTableView.Columns[0];
APropInfo := GetPropInfo(AColumn, 'Index');
if (APropInfo = nil) then
showmessage('not found');
end;
(TcxGridDBColumn是TcxGrid> DevExpress组件中的一列)
很明显我错过了一些东西,或者我完全误解了RTTI在XE下的工作方式,并且仍然无法访问公共财产?
答案 0 :(得分:3)
使用新的TRTTIContext记录作为入口点的类型,以获取类型及其属性。
请注意,它不需要显式的TypInfo单元。您可以使用原始的PTypeInfo获得RTTIType,但是可以仅传递AnyObject.ClassType,它将被视为PTypeInfo。
从类型中,您可以获得一个属性数组,我相信您必须迭代才能找到正确的属性。
uses
System.Rtti;
type
TColumn = class
private
FIndex: Integer;
public
property Index: Integer read FIndex write FIndex;
end;
var
AnyObject: TObject;
Context: TRttiContext;
RType: TRttiType;
Prop: TRttiProperty;
begin
AnyObject := TColumn.Create;
TColumn(AnyObject).Index := 10;
try
// Initialize the record. Doc says it's needed, works without, though.
Context := TRttiContext.Create;
// Get the type of any object
RType := Context.GetType(AnyObject.ClassType);
// Iterate its properties, including the public ones.
for Prop in RType.GetProperties do
if Prop.Name = 'Index' then
begin
// Getting the value.
// Note, I could have written AsInteger.ToString instead of StrToInt.
// Just AsString would compile too, but throw an error on int properties.
ShowMessage(IntToStr(Prop.GetValue(AnyObject).AsInteger));
// Setting the value.
Prop.SetValue(AnyObject, 30);
end;
finally
AnyObject.Free;
end;
end;