gpt4 book ai didi

delphi - 在公共(public)属性(property)上使用 GetPropInfo

转载 作者:行者123 更新时间:2023-12-03 15:53:38 25 4
gpt4 key购买 nike

据我了解,自 Delphi 2010 以来,我不仅能够在已发布的属性(property)上使用 RTTI,而且还能够在公共(public)属性(property)上使用 RTTI。我有一个旧的 Delphi 7 代码,它也可以在 XE7 下工作,但我仍然无法访问公共(public)属性。

这是代码:

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 下的工作原理,并且仍然无法访问公共(public)属性?

最佳答案

使用新的 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;

关于delphi - 在公共(public)属性(property)上使用 GetPropInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55557407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com