Здравствуйте, 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-го...