В дельфи для этого есть модуль rtti с TRttiContext, например такой код
- Код: Выделить всё
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,Rtti;
type
TmyRecord = record
aValue: String;
aNumber: Real;
Morenumbers: Integer;
end;
var
m: TMyRecord;
rtype: TRTTIType;
fields: TArray<TRttiField>;
i: Integer;
begin
m.aValue := 'OK';
m.aNumber := Pi;
m.Morenumbers := 666;
rtype := TRTTIContext.Create.GetType(TypeInfo(TMyrecord));
writeln(rtype.ToString);
fields := rtype.GetFields;
for i := 0 to High(fields) do
writeln(Format('%s: %s :: %s', [
fields[i].Name,
fields[i].FieldType.ToString,
fields[i].GetValue(@m).ToString]));
readln;
end.
выводит
- Код: Выделить всё
TmyRecord
aValue: string :: OK
aNumber: Real :: 3,14159265358979
Morenumbers: Integer :: 666
В FPC модуля rtti нет и такое не реализуемо? или есть другие способы?
Добавлено спустя 58 минут 53 секунды:
разобрался. неправильно понял в описании TTypeData
- Код: Выделить всё
tkRecord:
(
RecSize: Integer;
ManagedFldCount: Integer;
{ManagedFields: array[1..ManagedFldCount] of TManagedField}
);
там таки лежит массивчик TManagedField. Пусть и нетак красиво как в делфи, но можно сделать
Добавлено спустя 34 минуты 35 секунд:
Хм. а вот имя поля записи не получить((