这是我第一次访问这个网站.通常,我在旧帖中找到回复没有问题,但我的实际问题没有成功.
我想知道如何使用RTTI函数在运行时知道Lazarus/FPC下记录的属性/成员?我知道如何为一个类(Tpersistent后代和已发布的属性)执行此操作,但不知道如何为FPC执行此操作.一些链接指示如何在Delphi(来自D2010)下进行,但我不知道如何在Lazarus下转置它.
在此先感谢您的帮助和帮助.Salim Larhrib.
凯文:正如我之前所说,这是我的第一个要求.但是我明白.你是对的.这是我的代码
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 …Run Code Online (Sandbox Code Playgroud) 有没有办法记录并以编程方式遍历其所有字段而不明确地执行"Record.somefield"?
我想要做的是将记录保存/加载为INI文件的通用函数,这样我就可以在记录结构中添加或删除字段,而不必在每次删除或添加字段到记录时重写保存/加载函数.
换句话说,我想以某种方式迭代(伪代码):
THuman = record
age: integer;
country: string ;
end;
...
myPerson: THuman;
...
foreach Field in myPerson do
begin
if Field.value is String then ini.WriteString( 'Group', Field.Name, Field.value );
if Field.value is integer then ini.WriteInteger( 'Group', Field.Name, Field.value );
end;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我想这样做的原因是因为我在使用非有界字符串时无法保存类型字段.对我来说,文件是人类可读的也是有益的.所以我正在保存它们和INI文件.
我需要访问,记录属性,并设置/获取此属性值.首先,我想访问属性.但我不能.
怎么了?Ver:Delphi XE6.
示例代码:
type
TmyRecord = record
private
Str : String;
public
property StrProp :String read Str;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
c : TRttiContext;
t : TRttiType;
field : TRttiField;
prop : TRttiProperty;
begin
c := TRttiContext.Create;
try
Memo1.Lines.Append('Fields');
for field in c.GetType(TypeInfo(TMyRecord)).GetFields do
begin
t := field.FieldType;
Memo1.Lines.Append('Field:'+field.Name);
Memo1.Lines.Append('RttiType:'+t.ClassName);
end;
Memo1.Lines.Append('Properties');
for prop in c.GetType(TypeInfo(TMyRecord)).GetProperties do
begin
t := prop.PropertyType;
Memo1.Lines.Append('Property:'+prop.Name);
Memo1.Lines.Append('RttiType:'+t.ClassName);
end;
finally
c.Free
end;
end;
Run Code Online (Sandbox Code Playgroud)