MDI的使用,MDI父窗口不是应用程序的主窗口,打开子窗口时报错(100分)

  • 主题发起人 主题发起人 suguangyi
  • 开始时间 开始时间
S

suguangyi

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(!]
我的MDI父窗口不是应用程序的主窗口
但当创建子窗体时却报错:can not create form. no mdi forms are currently active.
仔细分析后,原因是MDI主窗口不是作为Application的MainForm,请问怎么解决这个问题
(不能把MDI父窗口设为应用程序的主窗口)
 
老兄,这得委屈你了。这时你应该把MDI主窗口设成Application的MainForm,在Delphi中
程序分SDI和MDI,有了MDI主窗口系统就认为程序是MDI的。从这种意义上在创建MDI
子窗体前必须有MDI父窗体建立否则子窗体无法容纳,所以你必须把MDI父窗体设成
Applicaion的MainForm, 也就是第一个用Application创建的窗体在Program单元中
(数据模块窗体除外)。
 
在你建子窗体前是否建了mdi主窗体,如果没建mdi主窗体,子窗体时不会有的!
 
主窗体已经建好 但他不是应用程序的主窗体
我的想法是在进入系统之前登录但登录时不出现登录后的窗口(即MDI主窗口)
各位大侠 帮我一把啊
 
MDI窗体仍然要做程序的主窗口,
在项目主文件单元中这样写,注意要引用Controls单元
var
Login: TLogin;
begin
Application.Initialize;
Application.CreateForm(TMain, Main);
Login := TLogin.Create(Application);
if not (Login.ShowModal= mrOk) then
begin
Application.Terminate;
Application.ShowMainForm := False;
end;
Application.Run;
end;

根据经验上面的写法比下面的写法更稳定可靠
var
Login: TLogin;
begin
Application.Initialize;
Application.CreateForm(TMain, Main);
Login := TLogin.Create(Application);
if Login.ShowModal= mrOk then
Application.Run;
end;
 
也可以在Run之前调用Login.Free;释放登录窗口对象,以节省系统资源
 
這還不好辦嗎,你主窗體onshow裡,打開登錄窗體呀,登成功後關掉就是了,如果還要重新登再打開
不過你得使用showmodal好一些。你千成不要把登錄窗體搞成主窗體,這樣做就不像個系統了。
 
谢谢LiChaoHui大兄,但现在由此产生了另外一个问题,应用程序的主窗口不能 关闭,关闭
时报内存访问错误,不知道是什么原因,请指点
 
谢谢LiChaoHui大兄,但现在由此产生了另外一个问题,应用程序的主窗口不能 关闭,关闭
时报内存访问错误,不知道是什么原因,请指点
 
to suguangyi:
不要光看代码,对文字不屑一顾。明白了原理什么事情都好做了,看看我的见解
你就明白了。在MDI主窗体作为Application的主窗体时你关闭了MDI主窗体就相当于关闭
了Application。这时Application 是要退出的,所以你这时如果再建立窗体的话就
会出错,解决办法无非就是不要关闭MDI父窗体,想法用隐藏代替。
其实我做着的项目就是用这种方法实现的,不然你就用SDI(单文档接口Application)。
 
to YFeral
确实如你所说,在关闭主窗口时重新创建了窗体,但如何避免这种问题呢?
请给出源代码吧
 
是了,LiChaoHui的说法去做,在Login窗口中控制主窗口的显示,至少我以前是这么做的。
 
新建一个空的程序,看还出不出错,少写点代码
 
在主窗体中OnClose:
begin
Action := caNone;
//创建你所需的窗体,代码你自己写吧。
end;
注意这里既然这样写了,也就是说MainForm的关闭按钮已失效。
在你真正要关闭程序的时候用
Application.Terminate即可。
 
谢谢各位大虾
我用的方法跟各位稍微有点区别,请见代码,不过还是特别谢谢LiChaoHui兄和YFeral兄,
To YFeral 你的解释有点问题 我就是用按钮写application.Terminate也会出现错误的,
这种错误并不是在每次程序运行时都出现 我的代码如下:
Application.Initialize;
Application.CreateForm(TSM_DM_System, SM_DM_System);
Application.ShowMainForm:=false;
Application.CreateForm(TSM_FRM_Main, SM_FRM_Main); //应用程序的Main窗口
Application.CreateForm(TPB_Frm_userlogon, PB_Frm_userlogon); //登录窗口
Application.Run;
 
谢谢suguangyi,我在网上找了三天关于这个问题的解答,都没有调试成功,看了你最后的总结,我又重新调试了一遍,谢谢啊,十分感谢,我觉Application.ShowMainForm:=false;这条语句对我的帮助特别大,再次感谢
 
后退
顶部