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;

DELPHI中MDI子窗口的关闭 和打开的更多相关文章

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

    DELPHI中MDI子窗口的关闭 和打开       Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会   发觉该子窗口只是最小化,而不是你预期的那样被 ...

  2. (转)C#在父窗口中调用子窗口的过程(无法访问已释放的对象)

    C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象   笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中 ...

  3. window.open 打开子窗口,关闭所有的子窗口

    需求:通过window.open方法打开了子窗口,当关闭主窗口时,子窗口应当也关闭. 实现思路: 1.打开子窗口函数window.open(url,winName)的第二个参数winName可以唯一标 ...

  4. C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常,不存在从对象类型System.Windows.Forms.DateTimePicker到已知的托管提供程序本机类型的映射。

    一:C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常 其实,这个问题与C#的垃圾回收有关.垃圾回收器管 理所有的托管对象,所有需要托管数据的.NET语言(包括 C#)都受运行库的 垃圾回收器 ...

  5. 保证相同类型的MDI子窗体只会被打开一次的方法

    本文转载:http://www.cnblogs.com/Ricky81317/archive/2008/09/17/1292443.html 看到论坛中有朋友问,如何可以保证在MDI主窗体中,同一类型 ...

  6. Delphi 关闭MDI子窗口

    需要在子窗口的onClose事件中吧Action = caFree; 就可以了. procedure Tfrm_aa.FormClose(Sender: TObject; var Action: TC ...

  7. VB.NET章鱼哥出品—怎样解决MDI子窗口被父窗口中的控件覆盖的问题

    近期有个网友问我这个问题,我就上网搜了下,结果非常失望.有几个在CSDN上发的求助帖.看到最后都没有找到明白的答案. 这里笔者在网上找到了API函数SetParent(),并对网上的错误进行了改动,并 ...

  8. 解决WinForm(C#)中MDI子窗体最大化的问题

    “用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?”,相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化: 1. ...

  9. IE 中创建 子窗口 传值 与接收值 【window.showModalDialog】

    父窗口 创建一个窗口 var backinfo = window.showModalDialog('UserSelect.aspx', '', 'dialogHeight=600px; dialogW ...

随机推荐

  1. 网站建设部署与发布--笔记4-部署mysql

    部署MySQL 1.更新操作系统 $ yum update -y 2.安装mysql数据库,在CentOS 7.2 中,使用了mariadb替代了官方的mysql $ yum install mari ...

  2. ASM problem : ORA-15001: diskgroup "DGROUP1" does not exist or is not mounted ORA-15040: diskgroup is incomplete

    ============================================================= mos中的详细解释: ODA: After Apply ODA 12.2.1 ...

  3. js截取url参数

    举例说明,比如http://localhost:2019/blog/getCommentListInfo?postId=1如何获取postId=1这个参数值呢?很简单通过下面代码即可获取,如: win ...

  4. bernoulli数

    LL B[N][],C[N][N],f[N][]; int n,m; LL gcd(LL a,LL b){return b?gcd(b,a%b):a;} LL lcm(LL a,LL b){retur ...

  5. 解决IsEditable="True"的ComboBox在DataGrid中点击一次不能选中行的问题

    原文:解决IsEditable="True"的ComboBox在DataGrid中点击一次不能选中行的问题 此方法很笨拙,并不推荐使用!!! 此方法很笨拙,并不推荐使用!!! 此方 ...

  6. Python 学习 第十篇:正则表达式 - re

    规则表达式(Regular Expression, RE),又称作正则表达式,通常用于检索.替换符合指定规则的文本,正则表达式定义的规则,称作模式(Pattern),即正则表达式的作用是从文本中查找到 ...

  7. 反射那些基础-Class

    目录 1 Class 类是什么? 2 如何获取 Class 对象 2.1 Object.getClass() 2.2 .class 语法 2.3 Class.forName() 2.4 通过包装类的 ...

  8. 52ABP模板 ASP.Net Core 与 Angular的开源实例项目

    阅读文本大概需要 5 分钟. 开始之前 自从上一篇文章".NET:持续进化的统一开发平台"发布后,已经有三个月的时间没有写过文章了. 这段时间,做了两场线下活动,一场在上海,一场在 ...

  9. 2017百度软研(C++)

    问了很多,不过很多也都没有问到,感觉有点偏,很深入的东西,越问越虚.第一次实习面试从百度开始,也从百度结束吧.看得见的差距,不想将就,所以还是拿最后一次机会去尝试.win or go home, 所以 ...

  10. H5 文字属性

    03-文字属性 我是文字 我是文字 abc我是段落 <!DOCTYPE html> <html lang="en"> <head> <me ...