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,但这窗体是窗口内嵌方式。

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

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

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

  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. 001_python单元测试

    一.同事推荐的 pytest库 ==> 官网:http://doc.pytest.org/en/latest/ github地址==>https://github.com/pytest-d ...

  2. (2)esp8266多国语言翻译系统

    http://bbs.mydigit.cn/simple/?t2649513.html 这个想法不错 原来只是想用esp8266搞一个百度的多国语言翻译系统出来的,只是为了尝试如何调用各种web ap ...

  3. Python 在 Windows 下安装第三方包,报 Python 未注册的问题解决

    保存一些代码为 reg.py,运行之即可. #/usr/bin/env python # -*- coding: utf-8 -*- import sys from _winreg import * ...

  4. jQuery和js之Cookie实现

    Web开发者的朋友们基本上都知道,jQuery是对js的封装.今天之所以想讲解这个问题,主要是因为Cookie用的还是比较多,应用场景除了老生常谈的购物车,还有就是用户状态(以我之前开发的一个项目除了 ...

  5. 基于vs2015的rdlc报表运行环境部署

    先说明一下,rdlc报表是由visual studio来支持的,不是FM. 本次项目采用的是vs2015开发的,当中使用了ReportViewer报表. 两种方式可以支持开发rdlc报表环境: 1)在 ...

  6. java eclipse jdk 关系

    java 经常用到多个jdk版本 1.7   1.8.... 兼容时几个位置 处理 eclipse.ini (A处) #-vm#C:\Program Files\Java\jdk1.7.0_79\bi ...

  7. springmvc+thymeleaf搭建框架启动报错

    最近项目开发需要用到thymeleaf前端界面模板引擎,所以提前了解学习一下,但是在框架搭建好了之后启动tomcat一直提示如下错误: org.springframework.beans.factor ...

  8. 单点登录SSO:可一键运行的完整代码

    单点登录方案不同于一个普通站点,它的部署比较繁琐:涉及到好几个站点,要改host.安装证书.配置HTTPS. 看到的不少这方面示例都是基于HTTP的,不认同这种简化: 1. 它体现不出混合HTTP/H ...

  9. [C#] LINQ之SelectMany

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.第一种用法: public static IEnumerable<TResult> SelectMany<TSo ...

  10. Rollup处理并打包JS文件项目实例

    关于Rollup rollup是一款用来es6模块打包代码的构建工具(支持css和js打包).当我们使用ES6模块编写应用或者库时,它可以打包成一个单独文件提供浏览器和Node.js来使用. 它的优点 ...