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;

原文地址:https://www.cnblogs.com/jijm123/p/10599178.html

时间: 2024-09-30 08:30:48

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

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

C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象 笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中,加入了如下代码来创建和显示子窗口: Private childFrm myChildFrm = null; //定义子窗口对象 private void OpenChildFrmToolStripMenuItem_Click(object sender, EventArgs e) { myChildF

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

需求:通过window.open方法打开了子窗口,当关闭主窗口时,子窗口应当也关闭. 实现思路: 1.打开子窗口函数window.open(url,winName)的第二个参数winName可以唯一标识打开的窗口.因此关闭子窗口只需要使用winName.close()函数即可. 2.一个页面可能有多个子窗口.因此需要一个数组存储所有子窗口对象.关闭时,遍历数组即可. 3.子窗口还可以再打开子窗口.无限循环下去.因此需要判断. 此需求可以通过两个方法实现. 调用子窗口的关闭函数. 此方法易于理解,

MFC中通过子窗口关闭父窗口以实现退出程序

这应该是个老问题,我来稍微总结下:(我刚刚接触Windows编程希望大家多多指点) 1.上来来个最鲁莽的. 直接通过exit(0),ExitProcess(0); //不好的用法 猜测资源得不到回收 原因如下: http://blog.csdn.net/jiang1013nan/article/details/4831020 2.向父窗口发送WM_CLOSE消息,然后自己关闭自己的窗口. 获取将父窗口的句柄直接传给子窗口,然后子窗口可以直接关闭父窗口. 示例代码如下: 父窗口类的定义: // C

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

近期有个网友问我这个问题,我就上网搜了下,结果非常失望.有几个在CSDN上发的求助帖.看到最后都没有找到明白的答案. 这里笔者在网上找到了API函数SetParent(),并对网上的错误进行了改动,并给出了简单实例代码. 读者可自行測试: Public Class Form1 '作者:章鱼哥,QQ:3107073263 群:309816713 '如有疑问或好的建议请联系我.大家一起进步 '声明SetParent函数.这是一个API函数 Declare Function SetParent Lib

js父窗口关闭时,子窗口随之关闭

最近,遇到一个权限管理的系统.由于权限管理的系统和本来的系统风格不一致,所有新打开一个窗口.问题就来了,admin注销之后,权限管理的窗口没有关闭.其他普通用户登录以后,仍然可以操作权限管理的窗口. 问题简化:admin注销的时候,或者main.html关闭的时候,打开的所有新窗口一起关闭.问题就解决了 直接看代码吧: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w

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

“用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?”,相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化: 1.把父窗体的IsMdiContainer设置为True:2.把子窗体的WindowState设置为Normal:3.在父窗体中用下面的方法打开子窗体:private void menuItemsMdiForm_Click(object sender, EventArgs e){     MyChild

如何javaSwing关闭子窗口不关闭父窗口

如果子窗口设置为 setDefaultCloseOption(Jframe.Exit_ON_CLOSE)的话,关闭子窗口后,父窗口也跟着关闭. 想要只关闭子窗口,方法如下: 子窗口设置为setDefaultCloseOption(Jframe.DISPOSE_ON_CLOSE)

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

“用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?”,相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化: 1.把父窗体的IsMdiContainer设置为True:2.把子窗体的WindowState设置为Normal:3.在父窗体中用下面的方法打开子窗体:private void menuItemsMdiForm_Click(object sender, EventArgs e){     MyChild

Duilib中创建子窗口后,子窗口销毁的问题

自己在学习Duilib时,学习ListDemo中的右键生成菜单,然后当菜单被点击活着失去焦点时,这个菜单窗口如何销毁的问题. 1.在这里,创建菜单时使用了子窗口的概念,创建时,使用了WS_EX_TOOLWINDOW类型,表示是一个工具栏窗口. 2.这个菜单窗口有自己的消息处理函数HandleMessage.第一次的尝试是调用CWindowWnd中的Close函数,查看了这个函数的源码,发现其中是使用PostMessage给自己发送了一个WM_CLOSE的消息,然后在HandleMessage中拦