我想请问一下如何更改在Delphi 7中MDI子窗体所属的MDI主窗体?,我在写程序时,我先创建了一个Login窗体,再建了一个MDI主窗体和MDI子窗体,但一运行到子窗体上,就出错,说没有找到MDI主窗体,请问个位高手们应怎么样解决?

解决方案 »

  1.   

    找到你像设为主窗口得
    FormStyle威fsmdiform
      

  2.   

    主窗口fsMDIForm
    子窗口fsMDIForm
      

  3.   

    不是啊,我在一个程序里有两个MDI主窗体,但我想把所有的MDI子窗体分成两部分,分别属于这两个MDI主窗体,不是只属于其中一个主窗体。
      

  4.   

    你可以在delphi中的project(工程)菜单的下拉菜单option(选项)中设置你要的mdi窗体作为应用程启动时的窗体。我想这样会可以的。
      

  5.   

    应该不行吧!?
    一个程序中可以有2个MDI主窗体吗?每个窗体都有MDIChildCount属性,而MDIChildCount属性是通过GetMDIChildCount函数得到的.看看代码实现:
    function TCustomForm.GetMDIChildCount: Integer;
    var
      I: Integer;
    begin
      Result := 0;
      if (FormStyle = fsMDIForm) and (FClientHandle <> 0) then
        for I := 0 to Screen.FormCount - 1 do
          if Screen.Forms[I].FormStyle = fsMDIChild then Inc(Result);
    end;
    它是通过查找全局对象Screen中的Forms数组来确定数量的,而其中的查找参数只有fsMDIChild一个,如果所有的MDI子窗体分成两部分,那他们的FormStyle属性还是fsMDIChild的,同时有两个MDI主窗体,都得不到正确的MDIChildCount,所以我想不可以这样使用的,这样会引起管理混乱的!
      

  6.   

    我想如果可以存在两个或者两个以上的MDI主窗体(我没有做过),那所有的的子窗体也只可以属于其中一个,由这个窗体来管理!不知道对否!?
    因为一个窗体只有一个主窗体MainForm,而MDI子窗体的创建与一般的窗体创建过程不太一样,它是依靠MainForm中的一个窗体(就是我们看到的那个凹下去的客户区窗口)创建的.这是它的创建的关键代码:
    WindowHandle := SendMessage(Application.MainForm.ClientHandle,
          WM_MDICREATE, 0, Longint(@CreateStruct));
    所以你的各个子窗体都是由MainForm.ClientHandle来创建的,只能属于MainForm中的这个框架,即使其他地方你还建立了MDI主窗体.
    随便说说,有错误恳请指出!
      

  7.   

    主窗体的FormStyle := fsmdiform
    子窗体的FormStyle := fsMDIChild
    试试吧
      

  8.   

    up,一個程序裡不能有兩個窗體為fsMDIForm,只能有一個!!!!!可以結帖了.
      

  9.   

    http://www.516688.net/ergong/down/er_cdrom.exe速度慢了点 有空会升级!
      

  10.   

    叫“fim(镇江DJ)(DJ=DelphiJava)”的朋友说的没错,我是想写一个login 窗体,不过这个窗体我写的比较复杂,我在程序运行时,先让MDI先运行,再把MDI主窗体的Visble设为false,再运行我的login窗体,我想向大家请教一下,有没有好的方法先运行login,再用application.CreateForm()来创建MDI,我的这个程序在权限上分的太多了,有十多个权限,但如果login窗体不设成fsMDIForm,则程序不能运行.
      

  11.   

    因为把login窗体设为起动时,系统说"我没有MDI主窗体运行,要先运行主窗体"
      

  12.   

    在VCL体系中,只能有一个MDI主窗口,而且这个主窗口必须是第一个建立的窗口,不须多议,这是定论,否则再动盘都是徒劳的。
      

  13.   


    主窗口fsMDIForm
    子窗口fsMDIForm
      

  14.   

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     TFace *Temp=new TFace(Application);//启动窗口
                     Temp->Show();
                     Temp->Update();
                     Application->Initialize();
                     Application->CreateForm(__classid(TMainForm), &MainForm);
                     Application->CreateForm(__classid(TSimulator), &Simulator);
                     Application->CreateForm(__classid(TInputData), &InputData);
                     Application->CreateForm(__classid(TSet_Line), &Set_Line);
                     Application->CreateForm(__classid(TOpen), &Open);
                     Application->CreateForm(__classid(TDataModel), &DataModel);
                     Application->CreateForm(__classid(TShowConfig), &ShowConfig);
                     Application->CreateForm(__classid(TCKWHXD), &CKWHXD);
                     Application->CreateForm(__classid(TXZLJ), &XZLJ);
                     Application->CreateForm(__classid(TSysLogForm), &SysLogForm);
                     Application->CreateForm(__classid(TSetCom), &SetCom);
                     Application->CreateForm(__classid(TSearchDevice), &SearchDevice);
                     Application->CreateForm(__classid(TPasswordDlg), &PasswordDlg);
                     Application->CreateForm(__classid(TUser), &User);
                     Application->CreateForm(__classid(TSuper), &Super);
                     Application->CreateForm(__classid(TDeviceConfig), &DeviceConfig);
                     Application->CreateForm(__classid(TFDY_Report), &FDY_Report);
                     Sleep(2500);
                     Temp->Close();
                     for (int i=0;i<4;i++)
                        {
                         PasswordDlg->ShowModal();    //登陆窗口
                         if (PasswordDlg->Checked)    //登陆成功
                            {
                             memmove(&MainForm->UserData,&PasswordDlg->UserData,sizeof(TUserData)); 
                             Application->Run();
                             break;
                            }
                         }
            }
            catch (Exception &exception)
            {
    //                 Application->ShowException(&exception);
            }
            catch (...)
            {
                     try
                     {
    //                         throw Exception("");
                     }
                     catch (Exception &exception)
                     {
    //                         Application->ShowException(&exception);
                     }
            }
            return 0;
    }