gpt4 book ai didi

freepascal - FPC : RTTI on records

转载 作者:行者123 更新时间:2023-12-03 20:49:44 24 4
gpt4 key购买 nike

这是我第一次在这个网站上。通常,我在旧帖子中找到回复没有问题,但我的实际问题没有成功。

我想知道如何使用 RTTI 函数在运行时知道 Lazarus/FPC 下记录的属性/成员?我知道如何为类(Tpersistent 后代和已发布的属性)执行此操作,但不知道如何为 FPC 执行此操作。一些链接指示如何在 Delphi 下执行(来自 D2010),但我不知道如何在 Lazarus 下转置它。

在此先感谢您的帮助和帮助。
萨利姆·拉里布。

To kevin:正如我之前所说,这是我的第一个要求。但是我明白。你是对的。这是我的代码

procedure TMainForm.btRecordTHashListClick(Sender: TObject);
var
pTData : PTypeData;
pTInfo : PTypeInfo;
TablePtr : PatableRecord;
Loop : Integer;
begin
// Set of Record pointers + HashList

// Create Container
if not Assigned(FTableRecList) then FTableRecList := TFPHashList.Create;

// Insert data
new(TablePtr);
TablePtr^.description := 'Dictionnaire des tables.';
FTableRecList.add('atable', TablePtr );

new(TablePtr);
TablePtr^.description := 'Dictionnaire des fonctions.';
FTableRecList.add('afunction', TablePtr );

new(TablePtr);
TablePtr^.description := 'Dictionnaire des listes d''option.';
FTableRecList.add('alist', TablePtr );

// Read records
for Loop:=0 to FTableRecList.Count-1 do
begin
TablePtr := FTableRecList[Loop];
ShowMessage('Parcours Index : ' + TablePtr^.description);
end;

// Find records
try
TablePtr := FTableRecList.Find('ddafunction');
ShowMessage('Record finded : ' + TablePtr^.description);
except
ShowMessage('Not such record .');
end;
try
TablePtr := FTableRecList.Find('afunction');
ShowMessage('Record finded : ' + TablePtr^.description);
except
ShowMessage('No such record.');
end;

// Free memory : To put later in TFPHashList wrapper
for Loop:=0 to FTableRecList.Count-1 do Dispose(PatableRecord(FTableRecList[Loop]));

// RTTI
pTInfo := TypeInfo(TatableRecord);

pTData := GetTypeData(pTInfo);
ShowMessage('Member count = '+IntToStr(pTData^.PropCount));
end;

最佳答案

警告:它适用于 FPC 2.7.1 或更高版本。

您可以使用指针处理记录字段。这是示例:

program rttitest;

uses
TypInfo;

type
TMyRec = record
p1: Integer;
p2: string;
end;

var
td: PTypeData;
ti: PTypeInfo;
mf: PManagedField;
p: Pointer;
f: Pointer;

r: TMyRec;

begin
r.p1 := 312;
r.p2 := 'foo-bar';

ti := TypeInfo(r);
td := GetTypeData(ti);

Writeln(td^.ManagedFldCount); // Get count of record fields

// After ManagedFldCount TTypeData contains list of the TManagedField records
// So ...
p := @(td^.ManagedFldCount); // Point to the ManagedFldCount ...
// Inc(p, SizeOf(Integer)); // Skip it (Wrong for 64-bit targets)
// Next line works for both
Inc(p, SizeOf(td^.ManagedFldCount)); // Skip it

mf := p; // And now in the mf we have data about first record's field
Writeln(mf^.TypeRef^.Name);

Write(r.p1); // Current value
f := @r;
Inc(f, mf^.FldOffset); // Point to the first field
Integer(f^) := 645; // Set field value
Writeln(r.p1); // New value

// Repeat for the second field
Inc(p, SizeOf(TManagedField));
mf := p;
Writeln(mf^.TypeRef^.Name);

Write(r.p2);
f := @r;
Inc(f, mf^.FldOffset);
string(f^) := 'abrakadabra';
Writeln(r.p2);


Readln;
end.

关于freepascal - FPC : RTTI on records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27803383/

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