Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Событие OnAfterFormShow


Автор: Jiro 27.07.24, 09:03
Появилась необходимость в событии OnAfterFormShow, и я это реализовал вот так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    unit MainFormUnt;
     
    interface
     
    uses
      Winapi.Windows,
      Winapi.Messages,
      System.SysUtils,
      System.Classes,
      Vcl.Controls,
      Vcl.Forms,
      Vcl.StdCtrls;
     
    const
       WM_AFTER_SHOW = WM_USER + 331 ;
     
    type
     
      TFormX = class(TForm)
      private
        FOnAfterShow: TNotifyEvent;
        FOnShowBackUp: TNotifyEvent;
        procedure DoFormShow(Sender: TObject);
        procedure DoAfterShow( var aMessage : TMessage ); message WM_AFTER_SHOW;
      public
        constructor Create(AOwner: TComponent); override;
        property OnAfterShow: TNotifyEvent read FOnAfterShow write FOnAfterShow;
      end;
      TForm = class(TFormX);
     
     
      TMainForm = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormAfterShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      MainForm: TMainForm;
     
    implementation
     
    {$R *.dfm}
     
    {$REGION ' TFormX '}
    procedure TFormX.DoAfterShow( var aMessage : TMessage );
    begin
      if Assigned(FOnAfterShow) then FOnAfterShow(Self);
    end;
     
    procedure TFormX.DoFormShow(Sender: TObject);
    begin
      Inherited;
      if Assigned(FOnShowBackUp) then FOnShowBackUp(self);
      OnShow := FOnShowBackUp;
      PostMessage( Handle, WM_AFTER_SHOW, 0 , 0 ); // This will post a message to itself
    end;
     
    constructor TFormX.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
     
      FOnShowBackUp := OnShow;
      OnShow := DoFormShow;
    end;
     
    {$ENDREGION}
     
    procedure TMainForm.FormShow(Sender: TObject);
    begin
       Memo1.Lines.Add('on show' );
    end;
     
    procedure TMainForm.FormAfterShow(Sender: TObject);
    begin
     
      Memo1.Lines.Add('on after show' );
    end;
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
       OnAfterShow := FormAfterShow;
    end;
     
    end.

Всё вроде работает, но на всякий случай хочу спросить, нет ли в такой реализации каких-то подводных граблей ?

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