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;

 

自控力之容忍罪恶:为何善行之后会有恶行

大部分人在觉得自己品德高尚时,都不会质疑自己的冲动。只要我们的思想中存在正反两方,好的行为就总是允许我们做一点坏事。补偿的渴望常常使我们堕落,因为我们很容易认为,纵容自己就是对美德最好的奖励,我们忘记...
  • xflame
  • xflame
  • 2013-08-09 15:05:49
  • 716

C# MDIForm 多视图窗口

  • 2014年08月21日 18:11
  • 24KB
  • 下载

【原创】《圣经》里说,原来女人是罪恶的根源!

         最近看《圣经》,觉得有点意思,于是把QQ签名改成“根据《圣经》的记载,女人真的是万恶之源头!表打我,不是我说的,上帝说的,上帝最大嘛,没办法!”。这篇文章的目录仅仅娱人一笑而已。各位...
  • lewislau
  • lewislau
  • 2006-01-03 22:06:00
  • 4946

《罪恶王冠》真的烂尾了吗?

《罪恶王冠》真的烂尾了吗? 首先,我有必要说一句,看日本动漫,认真你就输了。 病毒繁衍需要亚当和夏娃,真名是夏娃,她选定的亚当就是集。 失落的圣诞那天,集拒绝了真名,导致真名崩溃,引发了悲剧。 ...
  • Aozora_hrd
  • Aozora_hrd
  • 2017-09-24 23:45:08
  • 377

不要过早优化

概要无故加鞭(拉丁谚语Spur not a willing horse):过早地优化是没有结果的,就像它很令人着迷一样。优化的第一个原则是:不要去动它。优化的第二个原则(只对专家来说)是:还是不要去动...
  • wenkai168
  • wenkai168
  • 2009-07-18 17:28:00
  • 674

阳光下的罪恶

《阳光下的罪恶》    1982年摄制于西班牙马略卡岛的《阳光下的罪恶》和《尼罗河的惨案》相似之处很多。同样是发生在风光如画的旅游胜地的谋杀案,死者同样是一位美艳动人的女郎,而她又同样树敌多多,同样地...
  • colayungnew
  • colayungnew
  • 2005-08-11 13:00:00
  • 2342

关于Guilty Crown(罪恶王冠) 的一些随想

//以下内容可能涉及剧透,酌情食用 //初次观看这部番剧时建议关闭弹幕 最近放假在家颓废,几天时间二周目了Guilty Crown,感触挺深的 第一次看是去年暑假,而且是我看的第二部番剧,说实话...
  • lyd_7_29
  • lyd_7_29
  • 2018-02-17 23:58:19
  • 112

自控力读书笔记 第四章 容忍罪恶: 为何善行之后会有恶行

1. “道德许可效应”也许能解释为什么那些有明显道德标准的人能说服自己,认为出现严重的道德问题是合情合理的。大部分人在觉得自己品德高尚时,都不会质疑自己的冲动。“我已经这么好了,应该得到一点奖励,”这...
  • u013797574
  • u013797574
  • 2015-02-08 14:35:59
  • 399

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

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

精彩好看的悬疑电影

好看的悬疑电影: 1、致命ID 2、恐怖游轮 3、蝴蝶效应 4、记忆碎片 5、致命魔术 6、盗梦空间 7、前目的地 8、禁闭岛 ...
  • JIANOne
  • JIANOne
  • 2017-07-27 11:40:15
  • 216
收藏助手
不良信息举报
您举报文章:MDIForm的罪恶
举报原因:
原因补充:

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