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;
    
  • 相关阅读:
    Mysql基本数据操作
    Mysql安装及自动化部署脚本方案
    CSS应用内容补充及小实例
    CSS详解
    python 装饰器
    HTML基础
    python 异常处理
    python生成器及迭代器
    python模块(二)
    python字符串格式化
  • 原文地址:https://www.cnblogs.com/xianeri/p/11818445.html
Copyright © 2011-2022 走看看