1.如果要创建一个mdi child,先看是否有这个child 存在,如果有,则用它,如果没有再创建

//该函数判断MDI 子窗体是否存在,再进行创建和显示
function isInclude(formclass: TFormClass): boolean;
var
  i: Integer;
  form: TObject;
begin
  result := false;
  for i := 0 to frmMain.MDIChildCount do
  begin
    form := frmMain.MDIChildren[i];
    if form is formclass then
      result := true;
  end;
end;

//例如:打开frmAbout这个子窗体

procedure TfrmMain.actAboutExecute(Sender: TObject);
begin
  if not isInclude(TfrmAbout) then
//  if not Assigned(frmAbout) then
  begin
    frmAbout := TfrmAbout.Create(Self);
    frmAbout.Caption := '关于';
    frmAbout.Show;
  end
  else
    frmAbout.Show;
end;

http://www.whois.com/whois/pc100.net

2. 如果判断一个form是否存在,用 assigned(aForm)来看是否有创建并指向这个instance. (需要注意form destroy掉时,aForm 指标并没有free掉,要注意下一条的细节。

3. 对于mdi child 的销毁,注意以下几项: 
   ①关闭mdi, 用form.close方法。 
   ②在 onClose事件处理中,需要判断是否可以 free掉, 用 Action := caFree 
   ③销毁form时,需要释放form参数的指针内容。 aForm := nil.

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子窗口的默认关闭行为。

Delphi MDI 子窗体的创建和销毁 [zhuan]的更多相关文章

  1. Delphi中实现MDI子窗体(转)

        Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容  ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...

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

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

  3. 用DLL方式封装MDI子窗体

    用DLL方式封装MDI子窗体是一种常用的软件研发技术,他的长处: 研发人员能够负责某一个模块的编写包括(界面+逻辑),能够互不干扰,模块研发完成后,主程式统一调用. 易于程式升级,当程式升级时,不用编 ...

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

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

  5. 在DLL动态链接库中封装VCL的MDI子窗体

    在DLL动态链接库中封装VCL的MDI子窗体不多说了,看代码就应该明白了,曾经我遇到的问题,现在放出来大家共享! 这里是工程文件的部分: 在DLL中封装MDI子窗体需要重写DLL入口函数,具体代码如下 ...

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

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

  7. Delphi判断MDI子窗体是否被创建

    2008-02-28 15:18 //*************************************************************************** //函 数 ...

  8. delphi 7 mdi子窗体。。。无法更改以命令对象为源的记录集对象的 ActiveConnection 属性。

    问题是这样的 我做了一个小程序 把 adoconnection放到了主窗体  连接的是access数据库; 新建了一个子窗体继承自FBase  新建了一个pubulic方法 qrySearch 实现了 ...

  9. Ribbon 窗体的 MDI 子窗体使用 TabbedMDIManager 切换时工具条闪屏问题的解决办法

    补充说明: 此问题已经在新版本中解决(15.2.6),方法更加简单,只需要在 MDIChild 窗体的 Create 方法中,将 Ribbon 的 Visible 属性设置为 false 就可以了,且 ...

随机推荐

  1. Linux:Day4(下) 用户及组管理

    Linux用户:Username/UID 管理员:root,0 普通用户: 1-65535 系统用户:1-499 对守护进程获取资源进行权限分配: 登陆用户:500+ 交互式登录: Linux组:Gr ...

  2. 吴恩达课后作业学习1-week3-homework-one-hidden-layer

    参考:https://blog.csdn.net/u013733326/article/details/79702148 希望大家直接到上面的网址去查看代码,下面是本人的笔记 建立一个带有隐藏层的神经 ...

  3. Spring Security(一):官网向导翻译

    原文出自  https://spring.io/guides/topicals/spring-security-architecture Spring Security Architecture   ...

  4. JSONPath介绍

    1. JSONPath介绍 官网地址: https://github.com/alibaba/fastjson/wiki/JSONPath fastjson 1.2.0之后的版本支持JSONPath. ...

  5. 深入理解koa中的co源码

    阅读目录 一:理解Generator 二:理解js函数柯里化 三:理解Thunk函数 四:理解CO源码 回到顶部 一:理解Generator 在看co源码之前,我们先来理解下Generator函数.G ...

  6. redis学习(五)——Set数据类型

    一.概述 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加.删除或判断某一元素是否存在等操作.需要说明的是,这些操作的时间复杂度为 ...

  7. mac 下利用AndroidStudio APK获取签名信息

    注:网上没找到特别好的.不是xxx.keystore 就是debug.keystore 而真正去找这些目录的时候系统就会提示没有这个秘钥库文件.所以就悲剧了 下面附上快速查看APK签名信息的方法(SH ...

  8. 总结一下linux中的分段机制

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 这篇文章主要说一下linux对于分段机制的处理,虽然都说linux不使用分段机制,但是分段机制属于CPU的一个功 ...

  9. Storm-HA 配置

    进入storm/conf目录,修改storm.yaml配置文件为如下内容: # zookeeper ip storm.zookeeper.servers: - "192.168.7.108& ...

  10. Spring cache 使用说明

    package org.cheng.user.client.service; import java.util.HashMap; import java.util.Map; import org.ch ...