Запись сложных записей в файл - PullRequest
6 голосов
/ 26 декабря 2010

Привет, я определил некоторые записи в моем проекте, которые могут состоять из других записей, а также динамических массивов обычных типов данных и других записей, это n пример типа записи

  Type1=record
    x:integer;
  end;
  Type2=record
    Y:array of X;
    str:string;
  end;

Когда япопытался сохранить одну из переменных типа этих записей в файл с помощью функции blockwrite следующим образом:

var
  Temp1:Type2;
  begin
    setlength(temp1.y,100);
    blockwrite(MyFile,Temp1,sizeOf(Temp1);

он просто записал столько же, сколько размер чистой записи, но у temp1 есть динамические массивы, размер которых изменяется,Может кто-нибудь сказать, пожалуйста, как я могу записать сложную запись в файл, я имею в виду что-то вроде того, что используется в VB6.Спасибо

Ответы [ 2 ]

7 голосов
/ 26 декабря 2010

Вы можете использовать https://github.com/KrystianBigaj/kblib (работает с любыми динамическими записями, а также с записями, содержащими другие записи и т. Д.). Протестировано на Delphi 2006/2009 / XE (не использует расширенный RTTI, представленный в D2010). Нет необходимости писать код сохранения / загрузки вручную (всего одна строка для сохранения / загрузки любого динамического типа - строк, записей, динамических массивов).

В вашем примере это будет что-то. как это:

TKBDynamic.WriteTo(lStream, lType2, TypeInfo(Type2));

Чтобы загрузить его обратно:

TKBDynamic.ReadFrom(lStream, lType2, TypeInfo(Type2));

Если кому-то интересно, как обращаться с «версиями записи», просто опубликуйте новый выпуск, а затем я напишу несколько примеров.

Аналогичный квест:

0 голосов
/ 26 декабря 2010

Это не сработает. Вам потребуется вручную написать (потоковый) код для записи каждого поля.

Посмотрите опубликованные поля / свойства в классах, поскольку вместе с массивами вариантов это был единственный способ для потоковой передачи данных с использованием универсального кода.

Однако после D2010 RTTI был расширен, но я пока не знаю точных деталей этого.

...