(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Неправильное распределение полей в объекте

Источник: delphikingdom
Дмитрий Орловский

Автор: Дмитрий Орловский, Королевство Delphi

КАТЕГОРИЯ 

КОМПИЛЯТОР.Неправильное распределение полей в объекте

ПРОДУКТ 

Delphi 7

ПЛАТФОРМА 

Windows


Класс TColumn описан в модуле DBGrid. Речь идет о поле FAssignedValues типа TColumnValues. Этот тип объявлен как set of TColumnValue и его размер равен 2 байтам. Согласно принятым правилам поле рассматриваемого типа должно выравниваться по четным адресам и иметь смещение +60. Тем не менее, оно имеет смещение +59, непосредственно примыкая к предыдущему однобайтовому полю. Результатом является значение TColumn.Instancesize=64, хотя при использовании декларируемого правилами выравнивания эта величина должна быть равна 68.

Тестовый код:

uses  DBGrids;
type  PColumnValues = ^TColumnValues;
var    obj: TColumn;
begin
  obj:=TColumn.Create(nil);
  Memo1.Lines.Clear;
//проверка смещения поля FAssignedValues:
  (PWord(Integer(obj)+59))^:=247; //устанавливаем FAssignedValues
  Memo1.Lines.Add(IntToStr(Word(obj.AssignedValues))); //читаем FAssignedValues
//для того чтобы метод чтения свойства Readonly возвращал в качестве
//значения FReadonly, нужно включить cvReadOnly в AssignedValues:
  (PColumnValues(Integer(obj)+59))^:=[cvReadOnly];
//проверка смещения поля FReadonly:
  (PByte(Integer(obj)+58))^:=1; //устанавливаем FReadonly
  Memo1.Lines.Add(IntToStr(Byte(obj.ReadOnly))); //читаем FReadonly
  obj.Free;
end;

Типовые решения При необходимости следует учитывать правильные смещения полей:

FField          +12
FFieldName      +16
FColor          +20
FWidth          +24
FTitle          +28
FFont           +32
FImeMode        +36
FImeName        +40
FPickList       +44
FPopupMenu      +48
FDropDownRows   +52
FButtonStyle    +56
FAlignment      +57
FReadonly       +58
FAssignedValues +59
FVisible        +61
FExpanded       +62
FStored         +63

Комментарий Компилятор нарушает утверждение, сделанное в справке по выравниванию полей в записях и классах:

 Type            Alignment
Set types	size of the type if 1, 2, or 4, otherwise 1 
Т.е., множество размером 2 байта по-умолчанию должно выравниваться на границу слова. Простим компилятору, это его личное дело, как выравнивать поля. Программист не ошибется, если будет обращаться к полям по имени, а не пытаться вычислить смещение вручную.
Каждому - свое.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 30.06.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Enterprise Connectors (1 Year term)
Delphi Professional Named User
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
EMS Data Comparer for Oracle (Business) + 1 Year Maintenance
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год.
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
3D и виртуальная реальность. Все о Macromedia Flash MX.
Проект mic-hard - все об XP - новости, статьи, советы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100