我现在做的一个程序就是loginform为密码验证窗口,是fsnomal的,成功以后就出现mainform窗口,是fsMDIForm窗体~它就是我的主窗体。然后在mainform下面有10个按纽分别调用10个fsMDIChild的窗体。
    我现在已经成功通过了密码验证这关,但每次调用fsMDIChild窗体时它就报一个错:Project Project1.exe raised exception class EInvalidoperation with message'cannot create form. No MDI forms are currently active'. Process stopped. Use Step or Run to continue. 
    我翻阅了其他一些关于MDI的文章,都试了试,但还是没成功~(:~因为小弟其实还是个门外汉~刚学Delphi才1个月。而且这个程序我以前把所有的窗体都设为fsnomal的时候是完全成功的,而且每个子窗体都可以从数据库上读写数据,但我老板要求我非要用MDI的模式~也不知道他怎么想的,结果我按他的意思改了以后就变现在这个样子了~小弟已经连续奋战了2天了!(眼睛都红了)请各位老大帮个忙,如能解决,小弟全体投地了!!!

解决方案 »

  1.   

    这么多页让我怎么贴呀。那我把我的loginform,mainform,和project贴出来
      

  2.   

    老兄你搞错了吧?只有
         newyhform:=tnewyhform.Create(self);
         newyhform.Show;
    是正确的做法,其它的事件都改成上面的写法就可以了。
      

  3.   

    procedure Tmainform.N5Click(Sender: TObject);
    begin
         newyhform:=tnewyhform.Create(self);
         newyhform.Show;
    end;
    其中的NEWYHFORM变量你有没有定义啊?好象需要先定义VAR NEWYHFORM:TNEWYHFORM吧?
      

  4.   

    我猜的:
    1:把主窗体设为fsMDIForm。
    2:子窗体设为fsMDIChild。
    我估计是你忘记设了,特别是1。
      

  5.   

    to: g58521547(我是菜鸟) 
    你说的定义newhyform窗口我是在newhyform的代码里写的,不用在mainform里写。
    to: lmj2003(西才) 
    这两点我都住到了的,没问题。
    to: haipin(似水柔情) 
    我试了,没用。
      

  6.   

    这是小弟生平第一个DELPHI程序~~
    如果偶的第一步就倒下了~这个地球上就又少了一个优秀的程序员了~~555
      

  7.   

    program Project1;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2};{$R *.res}var
      aa: TForm2;  //Tfrom2为密码窗体的类
      n: integer;
    begin
    //////////////////你可以把判断是否重复运行的语句放在这里,效率高一些
      if(GetLastError = ERROR_ALREADY_EXISTS) then
      begin
        Application.MessageBox('程序已经运行','提示',MB_OK);
        ReleaseMutex(ahwnd);
      end;
    ////////////////////////////
      aa := Tform2.Create(nil);
      n := aa.showModal;
      aa.Free;
      if n <> 1 then exit;  Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
      

  8.   

    你主窗体应该先创建吧,是不是应该在project的代码加上
    Application.CreateForm(Tmainform, mainform);
      

  9.   

    这个办法我以前试过,就是先在project上创建mainform,然后再创建loginform,结果还是和现在一样,好象没什么区别!
      

  10.   

    建议你在mainform的Onshow调用loginform
      

  11.   

    project->options->forms将childform 统统放到available form里。
      

  12.   

    ququhu(坚决不当菜鸟) 
    你的问题我能解决
    双击子窗口的mainmenu出现你的菜单属性,把groupindex的值设置为2
    同理,主窗口的mainmenu的属性把groupindex的值设置为1
    那子窗口的菜单就是在主窗口的基础上再加上去的,这样就达到共存的目的了
    举个例子
    主窗口菜单有2项  (系统,帮助)
    子窗口菜单有1项  (退出)
    当你按我的做法做了以后
    在显示子窗口的时候显示出来的菜单就是(系统,帮助,退出)  ~~~~OK?
      

  13.   

    to: lmzluzi(阿卢) 
    请你给出代码好吗?我是处学者,不是太懂你的意思
      

  14.   

    delphi的主菜单上有一个project,project->options->forms 一步一步点下去就会看到auto-createforms 和 available forms 两个listview的相互选择框把你的mainform放在autocreateforms中mainform的子窗体统统放在availableforms中即可
      

  15.   

    哦~~不好意思忘了告诉你,其实我的childform 已经放到右边去了的,但还是不行~
    现在我都又点想重新做了~~我实在受不了了。虽然这又要花去我1个星期的时间
      

  16.   

    你只把主窗体设成自动创建,其他窗体等需要的时候用application.createfor()创建吧
      

  17.   

    楼主,按你的方法解决了,谢谢.
    你的代码太长有点晕,没怎么看.
    我是这样调用子窗体的,你参考一下看有用没.
      Cursor:= crHourGlass;
      Application.CreateForm(TForm_Mid1, Form_Mid1);
      Form_Mid1.Show;
      Cursor := crDefault;
      

  18.   

    在工程文件里只建立主窗体,
    原后在主窗体的onshow里建立登录窗
    Application.CreateForm(TFormLogin, FormLogin);
    FormLogin.ShowModal;
    登录窗完后关闭自己,主窗就会出来。
    如果登录不成功,就application.Terminate;
      

  19.   

    to:  chennai(脱西炽勒) ~~
    其实偶以前就是这样做的,而且现在我的登陆也没什么问题~~关键就是在主窗体进入到其他子窗体的时候老是报错~~~我老板给我分析的是delphi在运行的时候会自动生成一些‘代码’,而这些‘代码’是不可见的,比如说用delphi打开窗口文件(**.dfm),你会看到一些二进制原代码~~这些代码除了delphi的编译工程师以外,可能没有几个人懂~~我老板说可能是在我程序出错的时候影响到了这些‘神秘’的‘代码’,以至于我写成功了的程序也不能正常的运行了,所以我打算花一点时间重做一次!!!而且最重要的是我就用我现在的代码(完全不改)!!!如果能成功,那就说明我老板的话是对的,delphi确实会因为运行环境的出错自动生成一些无法更改的错误出来!!!!
      

  20.   

    估计在明天下午的时候我就可以确切的告诉大家我的这个程序的问题出在哪里了
    如果真的是因为delphi自己的原因~~~~那么~~~~sorry~~~我可能要进军 .net的世界了~
      

  21.   

    我的那个关于delphi本身的问题有人能帮我解决吗?
      

  22.   

    在工程文件里只建立主窗体,
    原后在主窗体的onshow里建立登录窗
    Application.CreateForm(TFormLogin, FormLogin);
    FormLogin.ShowModal;
    登录窗完后关闭自己,主窗就会出来。
    如果登录不成功,就application.Terminate;在formlogin里的mainform.show;去掉我昨晚就在搞这个问题,不过以上的方法是可解决的。
      

  23.   

    to: chennai(脱西炽勒) 
    谢谢!基本上已经全部解决了这个问题
      

  24.   

    to: chennai(脱西炽勒) 
    把loginform里的mainform.show去掉/////就是这句话!我就错在这个地方!我没把它去掉
    现在我已经知道了,以后应该不会再番这样的错误了!!哈哈,谢谢你,给分!结帖~!