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. 6-MVC结构简介

    一.javeEE的项目结构层次:MVC1.Model:模型层(DAO+业务层) 2.View:视图层 jsp3.Control:控制层 servlet 二.分层的原则:1.层与层之间松耦合,层内保持高 ...

  2. 深入剖析kafka架构内部原理

    1 概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cl ...

  3. Node.js读取文件内容并返回值(非异步)

    主要解决的问题的,以最近VsCode插件开发为例,每次请求都需要token,而vscode并不支持cookie这样的存储,所以就采用粗暴点办法,存到某个用户目录下并读取. 源码如下: var fs=r ...

  4. mybatis 参数为list时,校验list是否为空, mybatis ${}与#{}的区别

    一.参数list时,先判断是否为空,否则会报错. 二.mybatis ${}与#{}的区别 简单来说#{} 解析的是占位符?可以防止SQL注入, 比如打印出来的语句 select * from tab ...

  5. autoware

    在 Autoware目录下执行 git checkout 将版本切换到1.10.0 因为最新版驱动有问题然后执行 sudo apt-get update sudo apt-get install -y ...

  6. 20175310 《Java程序设计》第6周学习总结

    20175310 <Java程序设计>第6周学习总结 本周博客: <20175310 类定义 - 20175310xcy - 博客园 >https://www.cnblogs. ...

  7. selenium:解决页面元素display:none的方法

    在UI自动化测试中,有时候会遇到页面元素无法定位的问题,包括xpath等方法都无法定位,是因为前端元素被设置为不可见导致. 这篇博客,介绍下如何通过JavaScript修改页面元素属性来定位的方法.. ...

  8. face recognition[翻译][深度学习理解人脸]

    本文译自<Deep learning for understanding faces: Machines may be just as good, or better, than humans& ...

  9. IIS 日志导入到数据库的方法

    使用微软Log Parser 执行 logparser "SELECT * FROM d:\iislogs\u_ex18071705.log TO myTableName" -o: ...

  10. 启发式合并 splay合并 线段树合并基础

    Gold is everywhen! - somebody 启发式合并 将小的集合一个个插入到大的集合. 每次新集合大小至少比小集合大一倍,因此每个元素最多合并\(\log n\)次,总复杂度为\(n ...