Delphi:如何获取静态记录的地址
但是,我在上遇到一个编译器错误GetValue@TMyRecord-预期为E2029,但已找到 通常应使用记录的“实例”地址调用GetValue。但在这种情况下,记录是静态的。 我不想将此记录转换为普通记录、创建实例等。我正在尝试为静态记录解决此问题。Delphi:如何获取静态记录的地址,delphi,static,record,rtti,getvalue,Delphi,Static,Record,Rtti,Getvalue,但是,我在上遇到一个编译器错误GetValue@TMyRecord-预期为E2029,但已找到 通常应使用记录的“实例”地址调用GetValue。但在这种情况下,记录是静态的。 我不想将此记录转换为普通记录、创建实例等。我正在尝试为静态记录解决此问题。 如何获取应该传递给GetValue的地址?据我所知,类字段无法通过RTTI访问。据我所知,类字段无法通过RTTI访问。如另一个答案所述,使用RTTI访问类变量字段是不可能的 但只要稍作调整,仍有可能获得想要的解决方案: TMyRecord
如何获取应该传递给GetValue的地址?据我所知,类字段无法通过RTTI访问。据我所知,类字段无法通过RTTI访问。如另一个答案所述,使用RTTI访问类变量字段是不可能的 但只要稍作调整,仍有可能获得想要的解决方案:
TMyRecord
MyField1: string = Hello, world!
MyField2: integer = 123;
MyField3: extended = 3.1415927;
正如在另一个答案中所说的,使用RTTI访问类var字段是不可能的 但只要稍作调整,仍有可能获得想要的解决方案:
TMyRecord
MyField1: string = Hello, world!
MyField2: integer = 123;
MyField3: extended = 3.1415927;
感谢陆路的贡献!非常聪明,使用嵌套记录并声明一个本地类var‘r’,允许访问类型和实例 同时,我还提出了另一个解决方案,虽然它使用了一个带有外部实例的类而不是一个记录,但我不想这样做,但我没有看到其他方法,所以感谢您的解决方案
TMyRecord
MyField1: string = Hello, world!
MyField2: Integer = 123
MyField3: Extended = 3.1415927
感谢陆路的贡献!非常聪明,使用嵌套记录并声明一个本地类var‘r’,允许访问类型和实例 同时,我还提出了另一个解决方案,虽然它使用了一个带有外部实例的类而不是一个记录,但我不想这样做,但我没有看到其他方法,所以感谢您的解决方案
TMyRecord
MyField1: string = Hello, world!
MyField2: Integer = 123
MyField3: Extended = 3.1415927
既然可以直接获取字段值,为什么要使用RTTI?MyField1、MyField2、MyField3.1。因为我不仅对字段值感兴趣,还对字段名和字段类型感兴趣。2.因为这只是一个例子。在我的实际代码中,该记录包含974个字段。遍历这些字段需要5行代码。逐个访问它们需要974行代码。3.因为当新字段添加到记录中时,它们将自动包含在ToString的输出中。谢谢你解释动机。请看我的答案,它将解决您的问题。当您可以直接获取字段值时,为什么要使用RTTI?MyField1、MyField2、MyField3.1。因为我不仅对字段值感兴趣,还对字段名和字段类型感兴趣。2.因为这只是一个例子。在我的实际代码中,该记录包含974个字段。遍历这些字段需要5行代码。逐个访问它们需要974行代码。3.因为当新字段添加到记录中时,它们将自动包含在ToString的输出中。谢谢你解释动机。看看我的答案,它会解决你的问题。该死,我希望有一个不同的答案。但如果是这样的话。。。谢谢你的回答!根据你为什么要使用静态记录,你当然可以让一个普通的记录在其他单位看起来像一个静态记录。但如果是这样的话。。。谢谢你的回答!当然,根据您希望使用静态记录的原因,您可以使普通记录在其他单元中看起来像静态记录。
type
TMyRecord = class
private
constructor create;
public
MyField1: string;
MyField2: integer;
MyField3: extended;
function ToString: string;
end;
var
MyRecord: TMyRecord;
constructor TMyRecord.Create;
begin
MyField1 := 'Hello, world!';
MyField2 := 123;
MyField3 := 3.1415927;
end;
function TMyRecord.ToString: string;
var
Field: TRttiField;
begin
Result := sLineBreak;
for Field in TRTTIContext.Create.GetType(Self.ClassType).GetFields do
Result := Result + Format('%s: %s = %s', [Field.Name, Field.FieldType.ToString, Field.GetValue(Self).ToString]) + sLineBreak;
end;