Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Прямой доступ к DBF


Автор: Thunder2 13.9.2005, 22:12
Есть исходник компонент который ломиться на прямую к таблица DBF. Все хорошо , но ... кодировка ! Стал разбирать в исходнике и иот наткнулся на такую штуку:

Имеем определение типа данных "Запись" следующего вида
TdbfField = record
FieldName :array[1..11] of char; { Name of this record }
FieldType :char; { type of record - C,N,D,L,etc. }
fld_addr :longint; { not used }
Width :byte; { total field width of this record }
Decimals :byte; { number of digits to right of decimal }
MultiUser :smallint; { reserved for multi user }
WorkAreaID :byte; { Work area ID }
MUser :smallint; { reserved for multi_user }
SetFields :byte; { SET_FIELDS flag }
Reserved :array[1..4] of byte; { 8 bytes reserved }
end; { record starts }

{оригинальный кусок из исходника}

Казалось бы все просто, но ... далее следует объявление переменной:

var Fld: TdbfField;

Тоже ничего особенного. Но вот непонятная для меня вещь:
выражение SizeOf(Fld) дает значение 32 байта, а выражение
SizeOf(Fld.FieldName)+SizeOf(Fld.FieldType)+SizeOf(Fld.fld_addr)+SizeOf(Fld.Width)
+SizeOf(Fld.Decimals)+SizeOf(Fld.MultiUser)++SizeOf(Fld.WorkAreaID)+SizeOf(Fld.MUser)
+SizeOf(Fld.SetFields)+SizeOf(Fld.Reserved) дает значение 28. Тот же
результат можно получить просуммировав размеры значений полей записи:
11+1+4+1+1+2+1+2+1+4.

smile Как так ? Вот собственно вопрос.

Как ни странно компонент работает из этого исходника на "живой" форме. Ошибок при работе не возникает, но ,еще раз повторюсь, DBF файл из VFP 5.0 отображает (как я понял) по DOS-кодировке.

Автор: bas 14.9.2005, 15:39
18-32 - зарезервированные байты и в основном не используються.

Автор: p0s0l 14.9.2005, 17:12
Цитата(Thunder2 @ 13.9.2005, 22:12)
Как так ?
Это из-за выравнивания полей в памяти и выравнивания размера структуры... Т.е. она увеличина нарочно до 32 байт, чтобы размер был кратен 4...
(28 - это сумма размеров полей, но где-то между некоторыми полями есть промежуток, поэтому размер структуры например не 28, а 29)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)