zoukankan      html  css  js  c++  java
  • DELPHI中MDI子窗口的关闭和打开

    DELPHIMDI子窗口的关闭和打开

    DelphiMDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭。解决办法是在子窗口的OnClose事件处理过程中加入如下代码,示例:

     

    procedure ChildForm.OnClose(Sender: TObject; var Action: TCloseAction);

    begin

       Action := caFree;

    end;

      

     

    Delphi为一个Form的关闭行为指定了四种方式,分别是:

    caNone     禁止Form被关闭

    caHide     Form不被关闭,但是被隐藏。被隐藏的Form仍然可以被程序访问。

    caFree     Form被关闭,并且释放其占用的资源。

    caMinimize  Form被最小化而不是被关闭,这是MDI子窗口的默认关闭行为。

     

    ===========================================================

    MDIForm调用MDIChild窗体时要这样用  

    引用

     

       if   not   Assigned(Form2)   then   begin  

                   Form2:=TForm2.Create(Self);  

                   Form2.Show;  

             end   else  

    Form2.BringToFront;  

          

       另外在MDIChildOnClose,   OnDestroy中要以下代码   Form2MIDChild窗体的名称  

       procedure   TForm2.FormClose(Sender:   TObject;   var   Action:   TCloseAction);  

       begin  

             Action:=caFree;  

       end;  

          

       procedure   TForm2.FormDestroy(Sender:   TObject);  

       begin  

             Form2:=nil;  

       end;    

    =================================================

    如何获得当前打开的子窗口的数量?

    Application.MainForm.MDIChildCount

     

    ==================================================

    怎么关闭所有打开MDI子窗体?

     

    除了在主窗体写入  

       procedure   TFrmMain.N15Click(Sender:   TObject);  

       var   I:integer;  

       begin  

             if   Application.MessageBox('确定要关闭所有窗口吗?','System',mb_iconinformation+mb_yesno)=id_yes   then  

             begin  

             for   I:=MdiChildCount-1   downto   0   do  

             MdiChildren[I].Close;  

             end;  

       end;  

          

       还要在各个子窗口写入  

       procedure   TFrmchildn.FormClose(Sender:   TObject;   var   Action:   TCloseAction);  

       begin  

             action:=cafree;  

           Frmchildn:=nil;        

       end;  

     

    procedur TFrmchildn .FormDestroy(Sender:   TObject);  

         begin  

               TFrmchildn:=nil;  

         end;  

     

     

    =================================================

    根据以上的测试,有效代码:

    主窗体:

    引用

     

    procedure TForm1.a2Click(Sender: TObject);

    begin

    if Assigned(Form2) then

     

       begin

    Form2.Close;

       end;

     

    end;

     

    procedure TForm1.a3Click(Sender: TObject);

    begin

       if not Assigned(Form2)   then //判断子窗体是否已打开

       begin

       Form2:=TForm2.Create(Self);

       Form2.Show;

       end

       else Form2.BringToFront;

    end;

     

    子窗体:

    引用

     

    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

    begin

    Action:=caFree;

    end;

     

    procedure TForm2.FormDestroy(Sender: TObject);

    begin

    Form2:=nil;

    end;

     

  • 相关阅读:
    Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.跨语言反射api 兼容性提升与增强 java c#。Net  php  js
  • 原文地址:https://www.cnblogs.com/bingege/p/2152539.html
Copyright © 2011-2022 走看看