Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];
ВнизRecord -> String (2) Найти похожие ветки
← →
K-1000 © (2015-11-09 11:37) [0]Решил всё же сделать функцию перевода структуры в строку:
uses
RTTI;
type
TMyRecord = record
dmDummy: String [32]; // Или array [0..31] of WideChar;
end;
type
TTestRecord = TMyRecord; // TPixelFormatDescriptor;
procedure RecordToList(const Value: TTestRecord; List: TStrings);
var
i: LongInt;
RTTIType: TRTTIType;
RTTIFields: TArray<TRTTIField>;
begin
RTTIType:= TRTTIContext.Create().GetType(TypeInfo(TTestRecord));
try
RTTIFields:= RTTIType.GetFields();
List.Add(RTTIType.ToString());
for i:= 0 to High(RTTIFields) do
begin
List.Add(Format(" %s: %s (%s)", [RTTIFields[i].Name,
RTTIFields[i].FieldType.ToString(),
RTTIFields[i].GetValue(@Value).ToString()]));
end;
finally
FreeAndNil(RTTIType);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Desc: TTestRecord;
begin
ZeroMemory(@Desc, SizeOf(Desc));
RecordToList(Desc, Memo1.Lines);
end;
Функция отлично работает, если TTestRecord равен допустим TPixelFormatDescriptor.
Но как только появляется поле с фиксированной длинной строки (TTestRecord равен TMyRecord), то вылетает с AV.
Как это дело побороть?
← →
Kerk © (2015-11-09 11:56) [1]Проверяй FieldType на nil. Похоже в RTTI нет информации о таких типах. Странно.
← →
K-1000 © (2015-11-09 12:27) [2]Да, возвращает nil.
← →
K-1000 © (2015-11-11 09:40) [3]Как побороть?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.006 c