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

    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;
     
     
     
     
     

    delphi  里的mdi 子窗口始终在最底层,父窗口的控件始终在子窗口之上,子窗口上的控件被遮挡,看起来很别扭。

    有两种解决办法。一种是把父窗口的formstyle :=fsMdiform; 子窗口 formstyle :=fsMdiChild;在父窗口里放置一个panel1 和父窗口尺寸一样大。在把父窗口的控件都放在这个panel1上。在设置子窗口的的父类是panel1.

    这里有个关键代码,a:=TForm2.Create(self);                      windows.SetParent(a.Handle,Panel1.Handle );

    经过这种设置后,产生的子窗体就在最上了。关闭子窗体要在 onClose 里设置 action:=caFree; 如果要通知父窗体子窗口已关闭,可以在子窗体里设计一个自定义类。type  TshowEvent = procedure(show: bool) of object;

    在窗口类定义里   private    FshowEvent: TshowEvent;    

     public    property onShowEvent: TshowEvent read FshowEvent write FshowEvent;

    在子窗体里 onClose 里   if Assigned(onShowEvent)   then    onShowEvent(true);

    在父窗体窗口类里  procedure showMessage(show:bool);

    Form1.showpage(show: bool);

    begin

    if show then  //接到子窗口的关闭通知

    end 

    第二种 是不用设置窗体的 FormStyle 直接设置另一个窗口为子窗口。

       Application.CreateForm(Tform3,form3 );
       windows.SetParent(Form3.Handle,Form1.Handle);
      form3.show;

    这种有个好处,不用设置panel1,但这窗体是窗口内嵌方式。

  • 相关阅读:
    【干货分享】C# 实体类生成工具
    ASP.NET Core部署系列二:发布到CentOS上
    ASP.NET Core部署系列一:发布到IIS上
    微信公众号开发:用户管理
    微信公众号开发:自定义菜单
    像使用SQL一样对List对象集合进行排序
    使用JRebel插件实现SpringBoot应用代码热加载
    Java Stream函数式编程图文详解(二):管道数据处理
    SpringBoot生命周期管理之停掉应用服务几种方法
    本月16日SpringBoot2.2发布,有哪些变化先知晓
  • 原文地址:https://www.cnblogs.com/jijm123/p/10659028.html
Copyright © 2011-2022 走看看