我的application中包含MDIForm和MDIChild forms,由于多文档界面,经常要切换当前工作界面。我的做法是通过菜单来控制,在通常的多文档程序中是很常见的,由于对消息不熟,因此找不到简单的实现方法。现在问题是能够得知某一个窗体创建和关闭的消息即可。请朋友们帮忙。

解决方案 »

  1.   

    if Assigned(Form1) and (Form1.showing) and (Form1.Visible) then
      

  2.   

    下面只是粗略的代码,TFormInfo结构可以在修改
    const
     WM_FORM_CREATE = WM_USER +100;
     WM_FORM_DESTROY = WM_USER + 101;type 
    PForminfo = ^TForminfo
    TFormInfo = record
      FormName : String[20]; //记录窗体名称
      FormHandle : THandle;  //子窗体句柄 -- 可用,可不用,处于信息完整性考虑,所以写在这
    end;
      
    //---声明 在MDI(MainForm)窗口类中 ---//
    procedure DOChildFormCreate(var Msg : TMessage);Message WM_FORM_CREATE;
    procedure DOChildFormCreate(var Msg : TMessage);Message WM_FORM_DESTROY;//--- 实现 ---//
    procedure DOChildFormCreate(var Msg : TMessage);
    var
     Addr : DWORD;
     strname : string;
    begin
     Addr := Msg.wParam or Msg.lParam;
     strname := PForminfo(Pointer(Addr))^.FormName;
    end;//--- 子窗体创建---//
    Pinfo : PForminfo;
    LoAddr,HiAddr : Integer;
    GetMem(pInfo ,sizeof(TForminfo));
    pInfo^.FormName := 子窗体名称;
    pInfo^.FormHandle := 子窗体句柄;LoAddr := LoWOrd(DWORD(pINfo));
    HiAddr := HiWord(DWORD(pINfo));SendMessage(Application.MainForm.Handle ,WM_FORM_CREATE ,LoAddr,HiAddr);//---子窗体销毁 ---//
    代码同上//---由于时间仓卒,代码我是直接敲的,没验证,应该没问题. 给分吧:-)
      

  3.   

    更正:
    LoAddr := LoWOrd(DWORD(pINfo));
    HiAddr := HiWord(DWORD(pINfo));更正如下:
    var
     dwSource : DWORD;
    begin
     dwSource := DWORD(pInfo);
     HiWord := dwSource and $FFFF0000;
     LoWord := dwSource And $0000FFFF;
     ...
    end;
      

  4.   

    再次更正:
    //---声明中 --//
    procedure DOChildFormCreate(var Msg : TMessage);Message WM_FORM_DESTROY;改为:
    procedure DOChildFormDestroy(var Msg : TMessage);Message WM_FORM_DESTROY;