Re[4]: Различия в представлении данных разных версий Делфи
От: Sergei I. Gorelkin Россия  
Дата: 05.12.04 10:30
Оценка:
Здравствуйте, Anatoly Podgoretsky, Вы писали:

AP>Здравствуйте, Whistler, Вы писали:


W>>Здравствуйте, Shadowspan, Вы писали:


S>>>Здравствуйте, Whistler, Вы писали:


<skipped>

Что тут можно сказать... Самый длинный вариант этой записи — это случай atText. Поле tText занимает 256 байт (255 байт строки плюс один байт длины, т.к. ShortString). Поле tNoCase — еще один байт. Итого 257. Округлив до значения, кратного 4, получаем 260.
Поскольку с Delphi7 получается либо 264 (если не packed), либо 258 (если packed), то напрашивается предположение о том, что он добавляет еще один байт. Возможно, как раз значение OldAnswerType. И смысл в этом есть, потому что в такой записи, не зная заранее этого OldAnswerType, очень трудно понять, какой из вариантов записан. Надо полагать, что программа его читает из какого-то другого поля базы.
Возможное решение: вместо TOldAnswer применить отдельные типы:

TOldAnswer1=record
  nNumeric: Extended;
  nPrecis: Byte;
  Padding: array[0..(259-sizeof(Extended)-sizeof(Byte))] of byte;
end;

TOldAnswer2=record
  nsNumerics: array[0..15] of Extended;
  nsPrecis: array[0..15] of Byte;
  nsCount: Byte;
  nsNoSort: Boolean;
  Padding: array[0..(259-16*sizeof(Extended)-18*sizeof(Byte))] of byte;
end;

TOldAnswer3=record
  tText: string[255];
  tNoCase: boolean;
  // тут padding не нужен
end;


И далее приводить типы по мере надобности.
Размер всех должен быть 260 байт, если я ничего не напутал с Padding. Если это будет не так, значит Delphi7 и к "простым" записям что-то добавляет и тут можно попытаться представить запись как набор байт и записывать данные начиная с 4-го...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.