• DELPHI中MDI子窗口的关闭 和打开


          Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭。解决办法是在子窗口的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;   
          
       另外在MDIChild的OnClose,   OnDestroy中要以下代码   Form2为MIDChild窗体的名称   
       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;  

  • 相关阅读:
    知识点:Mysql 索引优化实战(3)
    知识点:Mysql 索引原理完全手册(2)
    知识点:Mysql 索引原理完全手册(1)
    大数据体系:数据分析体系总图
    数据化分析:微信文章不增粉的主要原因
    提问:MicrosoftUnderlying input stream returned zero bytes
    优化:更优雅的异步代码?
    涨姿势:Mysql 性能优化完全手册
    总结:Java 集合进阶精讲1
    冷知识点:COLLATE 关键字是什么意思?
  • 原文地址:https://www.cnblogs.com/jijm123/p/10932289.html
Copyright © 2020-2023  润新知