zoukankan      html  css  js  c++  java
  • [Delphi] 通过使用TComponent.Notification事件来管理控件

    需求是这样:相关联得一个嵌套窗体,想要去关闭子窗体的同时去关闭父窗体,了解到Notification这个概念,通过 X.FreeNotification(Y) 将控件Y的 Free 事件与X的 Notification 事件进行关联,这样 Y.Free 的时候就会通知X的 Notification ,只需要重写Y的 Notification,就能达到控制其他关联控件的目的。

    Syntax

    type  
       TOperation = (opInsert, opRemove);  
       procedure Notification(AComponent: TComponent; Operation: TOperation);
    

    某些控件在销毁之前会自动调用此过程。 通知过程强制控件对作为AComponent参数传递的关联组件上作为AOperation参数传递的操作作出响应。

    unit frmMain;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      protected
        procedure Notification(AComponent: TComponent;
          Operation: TOperation); override;
      private
    
        { Private declarations }
      public
        { Public declarations }
      end;
    
      TNotificationHelper = class(TComponent)
      private
        FDialogForm: TForm;
        FTabControl: TControl;
      protected
        procedure Notification(AComponent: TComponent;
          Operation: TOperation); override;
      public
        procedure Init(vPreviewForm, vDialogForm:TForm; vTabControl: TControl);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    uses
      frm1, frm2;
    
    {$R *.dfm}
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if not assigned(frmMDI) then begin
        frmMDI := TfrmMDI.create(self);
      end;
    
      frmChild := TfrmChild.Create(Application);
      with frmChild do begin
        caption     := 'HAHAHAHA';
        Parent      := frmMDI;
        Align       := alClient;
        FormStyle := fsNormal;
        BorderStyle := bsNone;
        WindowState := wsMaximized;
        show;
      end;
      self.FreeNotification(frmChild);
      frmTDI.show;
    end;
    
    procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation);
    begin
      inherited Notification(AComponent, Operation);
      if (Operation = opRemove) and (AComponent=frmChild) then
      begin
        frmMDI.close;
        self.close;
      end;
    end;
    
  • 相关阅读:
    poj 1328 Radar Installation (贪心)
    hdu 2037 今年暑假不AC (贪心)
    poj 2965 The Pilots Brothers' refrigerator (dfs)
    poj 1753 Flip Game (dfs)
    hdu 2838 Cow Sorting (树状数组)
    hdu 1058 Humble Numbers (DP)
    hdu 1069 Monkey and Banana (DP)
    hdu 1087 Super Jumping! Jumping! Jumping! (DP)
    必须知道的.NET FrameWork
    使用记事本+CSC编译程序
  • 原文地址:https://www.cnblogs.com/xianeri/p/11818445.html
Copyright © 2011-2022 走看看