相关疑难解决方法(0)

FPC:RTTI记录

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

我想知道如何使用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)

freepascal lazarus fpc

5
推荐指数
1
解决办法
1362
查看次数

德尔福:解析未知结构的记录

有没有办法记录并以编程方式遍历其所有字段而不明确地执行"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文件.

delphi

2
推荐指数
1
解决办法
3722
查看次数

如何访问记录属性?

我需要访问,记录属性,并设置/获取此属性值.首先,我想访问属性.但我不能.

怎么了?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)

delphi record rtti

1
推荐指数
1
解决办法
891
查看次数

标签 统计

delphi ×2

fpc ×1

freepascal ×1

lazarus ×1

record ×1

rtti ×1