一个主窗体设置为fsMDIForm,另有三个窗体设置为fsMDIChild,本来没有任何问题,现在增加了一个登录窗口,在检测完ID和密码后弹出原先的主窗体,这时再点下拉菜单打开设置为fsMDIChild的窗体,会弹出如下图的出错信息,请问如何解决????
http://upload.mop.com/user/2005/11/03/07/1131016895505.jpg另外,在同一个MDIChild窗体打开的情况下,仍然可以无限制的打开更多的同一个窗体,请问怎样控制同一个MDIChild窗体只能被打开一个????谢谢。

解决方案 »

  1.   

    控制MDIChild窗体二次打开,可以建立一个公用函数去检测该窗体是否已经打开.比如:function CheckMDIChildRun(AClassName: string) : Boolean;
    var
      I : Integer;
    begin
      Result:= FALSE;
      for I:=0 to Application.MainForm.MDIChildCount -1 do
        if Application.MainForm.MDIChildren[I].ClassName = AClassName then
        begin
          Result := TRUE;
          Break;
        end;
    end;//临时写的代码,未测试.请自行测试
      

  2.   

    看了你发的图片,问题是你在主窗体没有设置成MDI主窗前就要求创建子窗体,所以报错.
    我打开登录的方法是这样的.在工程文件里写如下代码:  Application.Initialize;
      Application.Title := '欢迎使用';
      WelcomShow();   //运行欢迎窗口
      Application.CreateForm(TMainForm, MainForm);  //创建主窗体(必须如此语句创建)
      Application.ShowMainForm := False;  //隐藏主窗口.
      if LoginSoftShow('') then           //运行登录窗口
      begin
        Application.ShowMainForm := True;
        Application.Run;
      end;
      

  3.   

    谢谢 Maple119(枫叶) ,可我还是没弄明白怎么加这段代码,我的工程文件原先是这样的{$R *.res}begin
      Application.Initialize;
      Application.CreateForm(TCheckFrm, CheckFrm); //登录窗体
      Application.CreateForm(TMainFrm, MainFrm); //主窗体
      Application.CreateForm(THRMSDM, HRMSDM); //Data Module窗体
      Application.CreateForm(TPerFrm, PerFrm); //第一个子窗体
      Application.CreateForm(TPayFrm, PayFrm); //第二个子窗体
      Application.CreateForm(TOpeFrm, OpeFrm); //第三个子窗体
      Application.Run;end.请问要如何修改??谢谢。
      

  4.   

    begin
      Application.Initialize;
      CheckFrm := TCheckFrm.Create(nil); //登录窗体
      CheckFrm.ShowModal;  //登录窗体以模式显示,直到窗体被关闭时才会执行下面的代码的.
      Application.CreateForm(TMainFrm, MainFrm); //主窗体
       Application.CreateForm(THRMSDM, HRMSDM); //Data Module窗体
      Application.CreateForm(TPerFrm, PerFrm); //第一个子窗体
      Application.CreateForm(TPayFrm, PayFrm); //第二个子窗体
      Application.CreateForm(TOpeFrm, OpeFrm); //第三个子窗体
      Application.Run;end.