关于一个窗体显示的问题,希望大家帮忙(20分)

  • 主题发起人 主题发起人 zenjians
  • 开始时间 开始时间
Z

zenjians

Unregistered / Unconfirmed
GUEST, unregistred user!
代码:
我在程序中需要在一个主窗体(frmmain)前显示一个登录界面(frmlogin),在设计窗体时,frmlogin的formstyle设为fsnormal;frmmain的formstyle设为fsmdiform,frm1设为fsmdichild;在project/option 中,将启动窗体设为frmlogin,如果将frm1放入自动加载窗体列表中,在运行时,就会有这样的错误提示:Einvailidoperation
message:'can't create form,no mdi forms are currently active';
我的窗体显示顺序为frmlogin>frmmain>frm1;在frmlogin的ok的click
procedrue tfrmlogin.btnokonclick(sender:tobject);
begin
if logined then //login success;
frmmain.show;
end;
如果frm1不在自动列表中,在frmmain的相关事件中执行以下代码同样会有上述错误:
........
if not assigned( frm1)thenEN
frm1:=Tfrm1.create(application);
frm1.show;
.................
请问应该如何解决?
 
不要加入自动创建列表中,使用时Create即可。
以下是我的原代码,在LogForm中,使用时直接调用即可:
procedure ShowLogForm();
begin
LogForm := TLogForm.Create( Application );
with LogForm do
try
ShowModal;
finally
Free;
end;
end;
 
结果还是一样,错误的产生不在于登录窗口和主窗体之间,而是在主窗体调用子窗体时产生;
 
请参考
http://211.101.4.25/delphibbs/dispq.asp?lid=665466
 
其实,你可以以frmMain为主窗口,然后在frmMain的onCreate中来打开logForm;
LogForm := TLogForm.Create( Application );
with LogForm do
try
ShowModal;
finally
Free;
end;
 
我想你是想做一个通过密码验证后才能登录的程序,下面的工程文件可供参考。

program urls;

uses
Forms,
one in 'one.pas' {Form1},
Add in 'Add.pas' {Form2},
Del in 'Del.pas' {Form3},
SetParams in 'SetParams.pas' {Form4},
login in 'login.pas' {Form5},
namecode in 'namecode.pas' {Form6};

{$R *.RES}

var
LoginForm:TForm5;

begin
LoginForm:=TForm5.Create(Application);
LoginForm.ShowModal;
if LoginForm.ModalResult=mrOk then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm4, Form4);
Application.CreateForm(TForm6, Form6);
Application.Run;
end;
end.
 
>>>如果frm1不在自动列表中,在frmmain的相关事件中执行以下代码同样会有上述错误:
if not assigned( frm1)thenEN
frm1:=Tfrm1.create(application);
frm1.show;
------
问题在于,当窗体释放时,它的值仍然不是nil.尽管他是无效的。
所以使用not assigned(frm1)时,
有可能窗体已经释放,但它的值并不是nil,所以可能会出错。
因此,如果是使用showmodel方式显示窗体,过后一定要frm1:=nil;
如果是show的,在frm1的onDestory事件中一定要加上frm1:=nil
 
我觉的你问出这样的问题说明你刚刚开始学Delphi啦!你应该把入门级的书好好看看,就不会有这样的问题了!
 
就是嘛﹐為什么不在工程文件中加入手工建窗口的代碼.
同意﹐ 刘李子
 
function splash_show(DelayTime:LongWord;bkfile:string):boolean;
var
CurTime:LongWord;
begin
result:=false;
if frm_splash=nil then
begin
frm_splash:=Tfrm_splash.Create(nil);
if FileExists(bkfile) then frm_splash.img_bk.Picture.LoadFromFile(bkfile);
frm_splash.Show;
frm_splash.Update;
CurTime:=GetTickCount;
while (GetTickCount < (CurTime+DelayTime)) do
frm_splash.Free;
frm_splash:=nil;
end;
result:=true;
end;
function login_sys(var id:string):boolean;
begin
result:=false;
if frm_login=nil then
begin
frm_login:=Tfrm_login.Create(nil);
frm_login.btn_ok.tag:=0;
if frm_login.ShowModal=mrok then
begin
result:=true;
id:=frm_login.edt_id.Text;
frm_login.free;
frm_login:=nil;
end
else
begin
result:=false;
frm_login.free;
frm_login:=nil;
end;
end;
end;
begin
Application.Initialize;
splash_show(0,'');
if login_sys(common.user_id) then
begin
Application.Title := 'xxxxxxxxx';
Application.CreateForm(Tdtmdl_main, dtmdl_main);
Application.CreateForm(Tfrm_main, frm_main);
Application.Run;
end;
end.
 
好久没来,就这点分,就每人加点把
 
刘李子:
我也在做一个通过密码验证后才能登录的程序,愿意闻其详。
谢谢。hone@2911.net
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部