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. AI matplotlib

    matplotlib.pyplot plot(x, y):画点 show:展示

  2. idea 2018.1 for mac JRebel破解

    第一步: 在 Idea 中下载 Jrebel 路径:preferences-plugins-Browse repositories-直接搜索下载 Jrebel   第二步:配置反向代理工具 1.安装 ...

  3. 使用Git进行代码管理的心得--github for windows

    首先简述一下Git进行代码管理的情况 我使用的是github for windows,官网下载的速度太慢,所以用了离线安装包.安装之后会有GitHub和GitShell两个软件,其中Github采用图 ...

  4. java单例模式总结

    目录 一. 饿汉模式(静态初始化) 二.双重检查锁(dcl) 三. 延迟占位类 四.枚举实现 最后 常见安全的单例实现代码和自己的一点理解. 一. 饿汉模式(静态初始化) class Singleto ...

  5. VS2017设置主题和代码字体

    从Visual Studio Marketplace下载主题插件 VS2017带有一个软件超市(Visual Studio Marketplace),可以和Eclipse一样从软件超市中下载各种插件, ...

  6. Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务

    首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...

  7. Python全栈开发之路 【第七篇】:面向对象编程设计与开发(1)

    本节内容 一.编程范式 编程指的是写程序.敲代码,就是指程序员用特定的语法.数据结构和算法编写的代码,目的是来告诉计算机如何执行任务的. 在编程的世界里最常见的两大流派是:面向过程与面向对象.“功夫的 ...

  8. SQL Server 跨服务器查询

    select * from OPENDATASOURCE( 'SQLOLEDB', 'Data Source=10.10.10.10;User ID=sa;Password=123456'). [CF ...

  9. Codeforces Round #485 (Div. 2)-B-High School: Become Human

    B. High School: Become Human time limit per test 1 second memory limit per test 256 megabytes input ...

  10. Python-类与对象

    类与对象的概念 类即类别.种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体. 那么问题来了,先有的一个个具体存在的对象(比如一个具 ...