Назначение событий в классе Delphi Interposer - PullRequest
4 голосов
/ 17 марта 2012

Я написал потомок TEdit, который обрабатывает событие OnExit следующим образом

unit MyCustomEdit;

interface

uses
  Classes,
  StdCtrls;

type
 TMyCustomEdit=class(TEdit)
 private
  procedure MyExit(Sender: TObject);
 public
  constructor Create(AOwner: TComponent); override;
 end;



implementation

{ TMyCustomEdit }

uses
 Dialogs;

constructor TMyCustomEdit.Create(AOwner: TComponent);
begin
  inherited;
  OnExit:=MyExit;
end;

procedure TMyCustomEdit.MyExit(Sender: TObject);
begin
  ShowMessage('Hello from TMyCustomEdit');//this is show only when is not assignated a event handler in the onexit event.
end;

end.

в основной форме моего приложения. Я использую класс Interposer следующим образом:

unit UnitTest;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, MyCustomEdit;

type
  TEdit=class (TMyCustomEdit);
  TFormTest = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Edit1Exit(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormTest: TFormTest;

implementation

{$R *.dfm}

procedure TFormTest.Edit1Exit(Sender: TObject);
begin
   ShowMessage('Hello from TFormTest');//this code is always executed
end;

end.

Теперь яхочу, чтобы при назначении события Onexit в главной форме выполнялась моя собственная реализация onexit TMyCustomEdit, а также код события OnExit формы TFormTest.но когда я запускаю код, выполняется только код события TFormTest.OnExit.Как я могу сделать, какие реализации обоих методов были выполнены?

1 Ответ

10 голосов
/ 17 марта 2012

Переопределить DoExit. Это метод, который вызывается, когда элемент управления потерял фокус, и вызывает событие OnExit. Звоните inherited DoExit после или до, в зависимости от ваших желаний:

procedure TMyCustomEdit.DoExit;
begin
  // Code here will run before the event handler of OnExit is executed
  inherited DoExit; // This fires the OnExit event, if assigned
  // Code here will run after the event handler of OnExit is executed
end;
...