一个困扰我很久的问题,有关窗体问题,请进。。。 (100分)

  • 主题发起人 主题发起人 apower
  • 开始时间 开始时间
A

apower

Unregistered / Unconfirmed
GUEST, unregistred user!
一个困扰我很久的问题,有关窗体问题:
就是我想在主程序窗口(form1)显示前,先显示登录密码窗口(PassForm),,怎么设置都不行,在passform中密码错误退出时,总要显示form1,导致屏幕有一闪,很不好看。我后来用passform作为mainform,效果也不理想,最小化时缩到左下角,form1还有一条标题,很不专业。有哪位高手指导一下,感谢不尽。。。谢。
 
你可以在工程文件中写代码
with Tfm_login.Create(nil)do
begin
if showmodal=mrok then
application.createform(Tmainform,mainform);
free;
end;
大概是这样,你自已试一试啦!
 
你的第一种做法没错,只不过你的代码写法可能有点问题,帖出来看一下
 
是的, 应该是你工程中代码的问题, 
 
请给我贴个正确的啊。人在外面,手头上没有原码,不好意思。
 
你在OPTION中设第一个FORM为PASSFORM,用PASSWORD FOrm create application..就行
做法和caihua, 一样!
 
Application.Initialize;
with TPassForm.Create(nil)do
try
if ShowModal <> mrOK then
Exit;
finally
Free;
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
 
Application.Initialize;
Application.CreateForm(TDataModule4, DataModule4);
//数据模块
Form1 := Tform1.Create(application) ;
//闪现窗体
Form1.Show;
Form1.Update;
StartTime := Now;
while Now < StartTime + 3 * (1 / 24 / 60 / 60)do
begin
Application.ProcessMessages;
end;
Form1.Hide;
//闪现窗体
Form1.Free;
Form2 := Tform2.Create(application);//密码登录窗体
Form2.ShowModal;
if checked then
//密码登录窗体中的全局变量
Application.CreateForm(TForm3, Form3);//主窗体
Form2.Free;
Application.Run;
end.
 
var
Form2: TForm2;
checked: boolean;
implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
checked := false;
end;

procedure TForm2.Button2Click(Sender: TObject);
//取消
begin
close;
end;

procedure TForm2.Button1Click(Sender: TObject);
//确定
var
id, pa: string;
begin
id := '1';
pa := '123';
//以上可以替换为从数据库中取出的数据
if checkuser(id, trim(edit1.text), pa, trim(edit2.Text)) then
begin
checked := true;
close;
end
else
begin
showmessage('校验不正确,请重试!');
form2.Tag := form2.Tag + 1;
end;

if form2.Tag > 3 then
begin
showmessage('三次校验不正确,系统退出!');
close;
end;
end;
 
但是,我用showmodal后,在登录窗口只能按一次按钮,然后应用程序全退出了
 
在showmodal窗体的“确定”按钮中
写入如下语句:

if passwd='01234'then
//---密码正确
modalreuslt=mrok;//---关闭模式窗体
 
可是 showmodal=mrok 编译错误 ,mrok要换成integer型整数才行,我从0到10都试了,还是不行的,帮忙啊,而且,在登录窗口还要先showmodal=mrnone 才可以多次按按钮,审核通过再showmodal=mrok
 
mrok -> idOk
 
在“登陆”按钮事件中写:
if password is Right then
form1.show
else
application.Terminate;
 
Application.Initialize;
Application.CreateForm(TDataModule5, DataModule5);
pass_Form:=Tpass_Form.Create(Application);
pass_Form.Update;
pass_Form.ShowModal;
if pass_Form.ModalResult=1 then
begin
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
probar.StepBy(90);
Form1.Timer1.Enabled:=true;
Application.Run;
end else
begin
Application.Run;
Application.Terminate;
end;
end.

你看看我的,这个绝不会出现你说的问题。
 
用application.Terminate 不如用 halt;
 
用halt引发是意外关闭这样不太安全。
application.terminate是正常的程序进程终止这样安全。
it showmodal=1 then
//---这样应该可以的
 
这是我的项目文件,然后在等录成功后调用主窗口,实际上主窗口没有设置成MainForm,绝对没有闪烁,我把DataModule设置成MainForm。
var
hMutex: HWND;
Ret: Integer;
begin
try
Application.Initialize;
Application.Title := 'XXX';
hMutex := CreateMutex(nil, false, 'XXX');
ret := GetLastError;
if Ret <> ERROR_ALREADY_EXISTS then
begin
Application.CreateForm(TSYSDB, SYSDB);
Frm_LogIn := TFrm_LogIn.Create(application);
Frm_LogIn.ShowModal;
Frm_LogIn.Free;
Application.Run;
end;
ReleaseMutex(hMutex);
except
halt;
end;
end.
 
我一直是这样写,这样最简单:
begin
Application.Title := '';
PassForm := TPassForm.Create(application);
PassForm.Show;
Application.ProcessMessages;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
PassForm.Free;
Application.Run;
end.
当然不要让PassForm自动创建。
 
请参考,本人的回帖
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2418426
 
后退
顶部