delphi 登录窗口重复出现(100分)

Z

znkevin

Unregistered / Unconfirmed
GUEST, unregistred user!
我在主窗口main的事件里添加了这些代码,让他显示登录界面LOGIN
procedure TMain.FormActivate(Sender: TObject);
begin

if login.ShowModal() <> mrOK then

begin

application.Terminate();
end
end;

可以登录成功,但是如果我的另一个窗口,比如说添加新生的窗口NEW,他完成添加任务后,回到主界面MAIN,这时候,登录窗口又会出现
怎么办,怎么让登录窗口只出现一次
 
要放在FormCreate事件里
procedure TMain.FormCreate(Sender: TObject);
begin

if login.ShowModal() <> mrOK then

begin

application.Terminate();
end
end;
 
都在乱写,既然你想写登录窗;又想在主窗口之前显示;
login.ShowModal() <> mrOK 这也行?
为什么不在project.dpr的项目代码中写呢?
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TFLogin, FLogin);
FLogin.showmodal;
if FLogin.ModalResult<>mrok then
begin
Application.Terminate;
end
else
begin
Application.CreateForm(TFMain, FMain);
Application.Run;
end;
end.
 
楼上 正解!
 
[Error] Project1.dpr(19): Undeclared identifier: 'mrok'
改了。。但是提示这个,是什么意思呢??
 
to:清新空气
你的方法是有问题的,首先这样写的话主窗体就不是FMain了,主窗体变Flogin了,登录以后显示的就不是Main而是Login了。如果在Dpr中写的话,可以这样写:
Application.Initialize;
showlogin;
Application.CreateForm(TForm1, Form1);
Application.Run;
procedure showlogin;
begin
Login:=TLogin.Create(nil);
if Login.ShowModal<>mrok then
application.Terminate;
Freeandnil(Login);
end;

Showlogin可以在其他地方定义,这样就可以在创建主窗体之前显示login了,而且不会影响Main是主窗体。
二楼的做法是正确的,不光可以写在FormCreate也可以写在FormShow里。
 
[Error] Project1.dpr(19): Undeclared identifier: 'mrok'
需要uses Controls单元
 
我觉得还是清新空气的写法正确!
 
gulang,说的有道理
也可以用这个方法:
主窗体,登陆窗体同设为自动创建窗体
设置属性先让主窗体隐藏,visible:=false;(让登陆窗体fsStayOnTop也是这个方法)
判断登陆信息,若正确
mainform.visible:=true;
 
好办,加上一句:
procedure TMain.FormActivate(Sender: TObject);
begin

onactivate:=nil;//注意这句
if login.ShowModal() <> mrOK then

begin

application.Terminate();
end
end;

保证你只触发一次。
说明:一个只有一个Form的应用程序,在其被最小化,然后再最大化时,Form的onActivate事件所定义的动作不会被触发.
一个有多个Form的应用程序,在不同form间切换的时候,会触发form的onActivate事件.
 
我的做法的和清新空气的类似:
begin
Application.Initialize;
Application.CreateForm(TFLogin, FLogin);
FLogin.showmodal;
if FLogin.ModalResult<>mrok then
begin
Application.Terminate;
end
else
begin
FreeAndNil(FLogin);
Application.CreateForm(TFMain, FMain);
Application.Run;
end;
end.
 
你们都运行程序了吗?结果是什么样?
 
这个应该是你的 主窗体 被设成了 LOGINForm .
 
.dpr中:
FLogin:=TFLogin.Create(application);
FLogin.ShowModal;
if FLogin.ModalResult=1 then
begin
...
Application.CreateForm(TFMain, FMain);
Application.Run;
end;
end.
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=7810
 
要放在FormCreate事件里
因为FormActivate会被运行两次.
onshow是一次.
onCreate也是一次,但如果是被子程序的话,也会被运行两次.能叫MAIN的程序肯定是主程序.
我的答案是正解,给分!
 
一群真是不知道怎么形容的人呀!
FLogin体中的登录按钮,可以写入判断语句及close
如果你觉得FLogin没释放,可以在最后加入一个FreeAndnil(FLogin);
不过一般FLogin会在程序结束时释放,不过我那写是程序可以要用到比如重新登录及注销的时候用到Flogin窗体;
再者,什么主窗体,你程序登录是最前,这是最好的办法,如果想满足你的感觉,可以换种写法
begin
Application.Initialize;
FLogin:=TFLogin.Create(Application);
FLogin.showmodal;
if FLogin.ModalResult<>mrok then
begin
Application.Terminate;
end
else
begin
Application.CreateForm(TFMain, FMain);
Application.Run;
end;
end.
这样你可能认为没有主窗体了,
记住,人不是为了解决问题了解决问题,而是为了解决问题而找更好的方法;
 
方法N多,给一全局变量,如果已经show,就不再show,就ok
 

Similar threads

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