Иллюстрированный самоучитель по Tirbo Pascal



              

Регистрация объектов - часть 2


Поле VMTLink должно содержать смещение адреса таблицы виртуальных методов (ТВМ) объекта. Турбо Паскаль имеет стандартную функцию TypeOf (Type: object) , которая возвращает адрес ТВМ для указанного типа Туре объекта, поэтому поле VMTLink обычно заполняется значением Ofs (TypeOf (TName)^), где TName - имя нестандартного объекта.

Поля Load и Store должны содержать адреса соответствующих виртуальных методов (см. п.20.3), обеспечивающих чтение объектов из потока и их запись в поток.

Например, если в программе определен объект

type

TMyWindow = object (TWindow)

.....

Constructor Load(var S: TStream); 

Procedure Store(var S: TStream); 

end ; 

то для его регистрации создается запись

const

RMyWindow: TStreamRec = ( 

ObjType: 100;

VMTLink: Ofs(TypeOf(TMyWindow)^); 

Load : @TMyWindow.Load; 

Store : @TMyWindow.Store);

Обычно регистрация осуществляется в конструкторе Init вновь созданного объекта, например:

Constructor TMyWindow.Init; 

begin

RegisterType(RMyWindow);

.....

end;

Однако, если в программе предполагается помещать в поток (или считывать из потока) объекты разного типа, регистрацию объектов как правило реализуют отдельной процедурой, вызываемой в конструкторе Init программы или в любом другом удобном месте, но перед фактическим обращением к потоку. Например:

Procedure RegisterMyProgram;

begin

RegisterType(RWindow); {Регистрация стандартного объекта} 

RegisterType(RMyWindow); {Регистрация нового объекта}

.....

end;

Для упрощения регистрации стандартных объектов в модулях Turbo Vision предусмотрены процедуры RegisterXXXX, где ХХХХ - имя соответствующего модуля. Например, процедура RegisterDialogs осуществляет регистрацию всех неабстрактных объектов модуля Dialogs, т.е. TButton, TCluster, TInputLine и т.д.; процедура RegisterViews регистрирует объекты модуля Views и т.д.




Содержание  Назад  Вперед