32 Урока Borland Delphi



             

Урок 31 - часть 16


begin

Label1.Caption:='Next message';

end;

procedure TForm1.WM_PrevMSG (Var M : TMessage);

begin

Label1.Caption:='Previous message';

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

{если не использовать вызов процедуры из DLL в программе,

то компилятор удалит загрузку DLL из программы}

P:=@Key_Hook;

end;

end.

Конечно, свойство Caption в этой форме должно быть установлено в “XXX”.
 
  2.0 Вызов методов дальних предков Проблема в следующем. Допустим, есть иерархия классов, у которых перекрывается (override) один и тот же виртуальный (или динамический - не важно) метод, и в одной из реализаций этого метода вы хотите вызвать виртуальный метод предка своего предка (“дедушки”, “прадедушки” и т.д.). Новая объектная модель Delphi допускает только вызов методов непосредственного предка (с помощью ключевого слова inherited) либо вызов методов класса с префиксом - типом класса (например, TLevel1.ClassName).

Эта задача стандартными средствами не решается. Но сделать требуемый вызов можно. Причем, способом, показанным ниже, можно вызвать любой метод для любого класса, однако, в этом случае вся ответственность за правильность работы с методами и полями ложится на программиста. В примере, приведенном ниже, в методе VirtualFunction класса TLevel3 напрямую вызывается метод класса TLevel1 (метод “деда”). В функции Level1Always всегда вызывается метод класса TLevel1 для любого его наследника.

{декларация классов}

TLevel1 = class(TComponent)

public

function VirtualFunction: string; virtual;

end;

TLevel2 = class(TLevel1)

public

function VirtualFunction: string; override;

end;

TLevel3 = class(TLevel2)

public

function VirtualFunction: string; override;

end;

function Level1Always(MyLevel: TLevel1): string;

implementation

type

PClass = ^TClass;

{виртуальная функция “дедушки”}

function TLevel1.VirtualFunction: string;

begin

Result := 'Level1';

end;

{виртуальная функция “отца”, вызывает унаследованный метод “дедушки”}

function TLevel2.VirtualFunction: string;

begin

Result := inherited VirtualFunction+' Level2';




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