我没写过MDI程序,不过我有个猜想。因为每个控件生成和释放都会触发
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
所以,如果MDI窗体的Owner都是MainForm,可以在MainForm里写这个函数。
如果Operation是opInsert就是创建,opRemove就是释放。然后判断AComponent是否是TForm,且FormStyle是否是fsMDIForm。

解决方案 »

  1.   

    to chechy:
    按你的方法做后,Free窗体时能相应,但create窗体时无法相应,不知为什么?请赐教.
    代码如下:
    if (acomponent is Tform)and(Tform(Acomponent).formStyle=fsMDIChild) then
    begin
         if operation=opInsert then 
            showmessage('create')
         else if operation=opRemove then 
              showmessage('free');
    end;
      

  2.   

    Application.OnMessage
    WM_Create, WM_Close, WM_Destroy
      

  3.   

    to copy_paste:
    在mdi中子窗体创建释放时,这些消息在主窗体根本截不到.
      

  4.   

       子类化ClientWnd窗口,截获WM_MDICREATE, WM_MDIDESTROY 消息也可以达到目的。我做过这样的程序。
      

  5.   

    你的MDI窗体是这么创建的吗?
    yourMDIForm := TMDIForm.Create(Application.MainForm) // CReate里跟的参数必须是写Notification函数的窗体的实例
      

  6.   

    不是,我直接用From的Create方法创建,但是我想这个方法是可以的,应为他是依据Windows的多窗体消息机制的。无论如何ClientWnd窗口均会接收到WM_MDICREATE, WM_MDIDESTROY 消息。