我现在做的一个程序就是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天了!(眼睛都红了)请各位老大帮个忙,如能解决,小弟全体投地了!!!
我现在已经成功通过了密码验证这关,但每次调用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天了!(眼睛都红了)请各位老大帮个忙,如能解决,小弟全体投地了!!!
newyhform:=tnewyhform.Create(self);
newyhform.Show;
是正确的做法,其它的事件都改成上面的写法就可以了。
begin
newyhform:=tnewyhform.Create(self);
newyhform.Show;
end;
其中的NEWYHFORM变量你有没有定义啊?好象需要先定义VAR NEWYHFORM:TNEWYHFORM吧?
1:把主窗体设为fsMDIForm。
2:子窗体设为fsMDIChild。
我估计是你忘记设了,特别是1。
你说的定义newhyform窗口我是在newhyform的代码里写的,不用在mainform里写。
to: lmj2003(西才)
这两点我都住到了的,没问题。
to: haipin(似水柔情)
我试了,没用。
如果偶的第一步就倒下了~这个地球上就又少了一个优秀的程序员了~~555
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.
Application.CreateForm(Tmainform, mainform);
你的问题我能解决
双击子窗口的mainmenu出现你的菜单属性,把groupindex的值设置为2
同理,主窗口的mainmenu的属性把groupindex的值设置为1
那子窗口的菜单就是在主窗口的基础上再加上去的,这样就达到共存的目的了
举个例子
主窗口菜单有2项 (系统,帮助)
子窗口菜单有1项 (退出)
当你按我的做法做了以后
在显示子窗口的时候显示出来的菜单就是(系统,帮助,退出) ~~~~OK?
请你给出代码好吗?我是处学者,不是太懂你的意思
现在我都又点想重新做了~~我实在受不了了。虽然这又要花去我1个星期的时间
你的代码太长有点晕,没怎么看.
我是这样调用子窗体的,你参考一下看有用没.
Cursor:= crHourGlass;
Application.CreateForm(TForm_Mid1, Form_Mid1);
Form_Mid1.Show;
Cursor := crDefault;
原后在主窗体的onshow里建立登录窗
Application.CreateForm(TFormLogin, FormLogin);
FormLogin.ShowModal;
登录窗完后关闭自己,主窗就会出来。
如果登录不成功,就application.Terminate;
其实偶以前就是这样做的,而且现在我的登陆也没什么问题~~关键就是在主窗体进入到其他子窗体的时候老是报错~~~我老板给我分析的是delphi在运行的时候会自动生成一些‘代码’,而这些‘代码’是不可见的,比如说用delphi打开窗口文件(**.dfm),你会看到一些二进制原代码~~这些代码除了delphi的编译工程师以外,可能没有几个人懂~~我老板说可能是在我程序出错的时候影响到了这些‘神秘’的‘代码’,以至于我写成功了的程序也不能正常的运行了,所以我打算花一点时间重做一次!!!而且最重要的是我就用我现在的代码(完全不改)!!!如果能成功,那就说明我老板的话是对的,delphi确实会因为运行环境的出错自动生成一些无法更改的错误出来!!!!
如果真的是因为delphi自己的原因~~~~那么~~~~sorry~~~我可能要进军 .net的世界了~
原后在主窗体的onshow里建立登录窗
Application.CreateForm(TFormLogin, FormLogin);
FormLogin.ShowModal;
登录窗完后关闭自己,主窗就会出来。
如果登录不成功,就application.Terminate;在formlogin里的mainform.show;去掉我昨晚就在搞这个问题,不过以上的方法是可解决的。
谢谢!基本上已经全部解决了这个问题
把loginform里的mainform.show去掉/////就是这句话!我就错在这个地方!我没把它去掉
现在我已经知道了,以后应该不会再番这样的错误了!!哈哈,谢谢你,给分!结帖~!