MDIForm的罪恶

原创 2004年07月19日 17:53:00

在MDI应用程序中有个奇怪的问题, 当你执行以下代码时你会看到一个奇怪的结果

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

假设目前你已开了3个MDI子窗口

 

Procedure Button1Click(Sender: TObject)

Begin

       ShowMessage(IntToStr(MDIChildCount)); // 很显然结果等于3

      

    If Assigned(ActiveMDIChild) then ActiveMDIChild.Close;

 

ShowMessage(IntToStr(MDIChildCount));  // 这个时候结果应该是几?

End;

 

很奇怪结果并不象想像当中的那样因该是2, 而是依然是3, 为什么?

如何解释这个现象呢? 因为它还没有真正的被释放。那么什么它才会被释放呢。

procedure TCustomForm.Close;

var

  CloseAction: TCloseAction;

begin

  if fsModal in FFormState then

    ModalResult := mrCancel

  else

    if CloseQuery then

    begin

      if FormStyle = fsMDIChild then

        if biMinimize in BorderIcons then

          CloseAction := caMinimize else

          CloseAction := caNone

      else

        CloseAction := caHide;

      DoClose(CloseAction);

      if CloseAction <> caNone then

        if Application.MainForm = Self then Application.Terminate

        else if CloseAction = caHide then Hide

        else if CloseAction = caMinimize then WindowState := wsMinimized

        else Release; // 看看Release 中是什么?

    end;

end;

{ 很简单的发了个消息 }

procedure TCustomForm.Release;

begin

  PostMessage(Handle, CM_RELEASE, 0, 0);

end;

 

 

    procedure CMRelease(var Message: TMessage); message CM_RELEASE;

    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;

    procedure CMUIActivate(var Message); message CM_UIACTIVATE;

 

 

procedure TCustomForm.CMRelease;

begin

  Free;// 原来真正的Free在这里。

end;

 

从上面这些代码就可以基本猜出为什么会有上面的现象了。

ActiveMDIChild.Close

   SendMessage(Handle, CMRelease); // 消息进入到消息队列没有马上实行

 

  ShowMessage(IntToStr(MDIChindCount)); // 这个时候还没有真正的Free.

   //所以我门得到的是错误的结果, 好了知道了原因事情就好办多了。接下来我们来解决它。

 

 

Procedure Button1Click(Sender: TObject)

Var

       Ret: Boolean;

    Msg: tagMsg;

Begin

       ShowMessage(IntToStr(MDIChildCount)); // 很显然结果等于3

      

    If Assigned(ActiveMDIChild) then

    Begin

ActiveMDIChild.Close;

Ret:= GetMessage(msg, ActiveMDIChild.Handle, 0, 0);

If Ret then

  If msg.message = CMRelease then

       ActiveMDIChild.Destroy; // 提前宣判死刑, 省得麻烦。

    End;

   

 

ShowMessage(IntToStr(MDIChildCount));  // 这个时候的结果就正确了。

End;

 

平庸是一种罪恶、无知是一种恶意

生活中比比皆是的例子,平庸造成的伤害,对自己、对他人。我也如此,以前的平庸也伤害了周边的亲人。。。 所以,平庸是恶意的。就是因为你的无知、平庸,所以才被伤害连连,所以拒绝平庸,拥抱智慧。  因为...
  • stableboy
  • stableboy
  • 2015年09月01日 08:01
  • 859

崩坏学园3里离摄像机近距离的头发透明效果在unity里的实现方法

最近国内崩坏3开始公测了,在看到宣传视频的时候我就对这个游戏画面很有兴趣了。然后第一时间就下来玩了。本人渣手机最低特效帧数都不稳定,好在今天更新了新版本,模拟器能正常运行了。立马就开了个模拟器最高画质...
  • sdqq1234
  • sdqq1234
  • 2017年03月09日 18:38
  • 664

揭露商人的罪恶面具

哈哈,今天看到一个博彩活动忍不住想看看到底多坑 贴代码: #include #include using namespace std; struct SZ { int num; int rmb...
  • NEUQ_zxy
  • NEUQ_zxy
  • 2017年01月07日 15:06
  • 173

崩坏学园3里离摄像机近距离的头发透明效果在unity里的实现方法

最近国内崩坏3开始公测了,在看到宣传视频的时候我就对这个游戏画面很有兴趣了。然后第一时间就下来玩了。本人渣手机最低特效帧数都不稳定,好在今天更新了新版本,模拟器能正常运行了。立马就开了个模拟器最高画质...
  • sdqq1234
  • sdqq1234
  • 2016年09月30日 23:16
  • 3805

《幽游白书》——多少'罪恶'由汝开始

这是一部差点就叫的漫画.     这是一部将某个口袋里只剩500日元的贫困漫画家从窘迫的生涯里解放出来的漫画.     这是一部以龙珠为竞争对手最后却比龙珠早完结并得到小学馆大赏的漫画.    ...
  • kadingxiaodi
  • kadingxiaodi
  • 2014年01月07日 20:35
  • 627

数据库中罪恶的NULL

摘要:1.Null表示Unknow; 2.聚合运算; 3.性能; 4.NO NULL! 1.Null表示Unknow:     SQL基于三值逻辑true、false、unknow;...
  • codepython
  • codepython
  • 2015年08月24日 09:45
  • 354

需求变更是罪恶之源吗?

我们身处软件工业时代这个令人振奋的时代,却面临着遗留系统这个令人尴尬的难题。事情总是这样的:软件最开初开发的时候总是非常清晰,清晰的需求、清晰的设计、清晰的代码,清晰的程序结构让人赏心悦目,甚至有些自...
  • mooodo
  • mooodo
  • 2013年12月08日 10:46
  • 660

“电脑管控”的罪恶

PS:这是我从业IT这么多年来第一次见到这么拙劣可笑的管理方式。       正常情况下,客户机到了一定的数量规模,都会启用域控来管理。我所经历过的几家公司里除了TK(研发部除外),基本上都有启用域控...
  • mengxin523
  • mengxin523
  • 2016年10月07日 15:54
  • 252

最接近2D风格的3D画面

最接近2D风格的3D画面如何打造?《罪恶装备XRD》图形讲座 原文[http://spec.tgbus.com/hard/1242/ggxrd-graphic-making-part-2/]...
  • cexgiant
  • cexgiant
  • 2016年10月05日 21:13
  • 3709

【转】所有罪恶终将完结&nbsp;《绝…

所有罪恶终将完结 《绝命毒师》纪念特刊 笑傲艾美奖、打破吉尼斯,《绝命毒师》从一部小众黑色剧集一步步晋升为口碑爆棚的神剧。走过六载终谢幕,让我们一起从头回顾毒师的点点滴滴,重温那些难忘的精彩瞬间,...
  • u010274993
  • u010274993
  • 2014年01月21日 15:53
  • 1037
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MDIForm的罪恶
举报原因:
原因补充:

(最多只允许输入30个字)