关于showmodal对窗口的影响?(20分)

  • 主题发起人 主题发起人 提问富翁
  • 开始时间 开始时间

提问富翁

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:
我想在主窗口显示前先出现密码窗口,来进行身份验证,然后决定进入。
MDIAPP代码:
begin
Application.Initialize;
flash:=tflash.Create(application);//启动画面
flash.Show;
flash.Update;
while flash.Timer1.Enabled do
application.ProcessMessages;
Application.CreateForm(TMainForm, MainForm);主窗口
pass:=tpass.Create(application);//密码窗口
pass.ShowModal;//问题可能在次-显示
flash.Hide;
flash.Free;
Application.Run;
密码窗口确定按钮代码:
var
name:string;
begin
if (pascombobox.text='') or (pasedit.text='') then showmessage('Óû§ÃûÓëÃÜÂë¿ò²»ÄÜΪ¿Õ')
else
begin
pasquery.sql.clear;
pasquery.sql.add('select ÃÜÂë from pass');
pasquery.sql.add('where ̞=:name');
pasquery.ParamByName('name').asstring:=pascombobox.text;
pasquery.Open;
if pasquery.FieldByName('ÃÜÂë').AsString=pasedit.text then
begin
usename:=pascombobox.Text;
usepass:=pasedit.Text;
mainform.Showmodal;//显示主窗口
end
else
begin
showmessage('Óû§ÃûÓëÃÜÂë²»¶ÔÓ¦');
end;
end;
end;

问题(1)
密码对话对话框关闭时出错;
(2)
主窗口关闭了但是程序没有结束,同时不能最小化。
 
还是你呀,问题还没有解决?呵呵,下面是我粗略的改了一下你的代码,没有实验,但是应该是对了,你实验一下。

MDIAPP代码:
begin
Application.Initialize;
flash := tflash.Create(application); //启动画面
flash.Show;
flash.Update;

while flash.Timer1.Enabled do
application.ProcessMessages;

pass := tpass.Create(application); //密码窗口
if pass.ShowModal = 1 {mrOk} then //这里使用1而不是mrok是为了避免再增加一个没有必要的use,其实mrOK=1
Application.CreateForm(TMainForm, MainForm)
else
Application.Terminate;
//主窗口
flash.Free;
Application.Run;

if pasquery.FieldByName('?ü??').AsString = pasedit.text then
begin
usename := pascombobox.Text;
usepass := pasedit.Text;
ModalResult := mrOk; //设置返回值为mrOk,即:1,则程序退出,正常启动主窗体
end
else
showmessage('密码错误!');
 
if pass.ShowModal = 1 {mrOk} then //这里使用1而不是mrok是为了避免再增加一个没有必要的use,其实mrOK=1
Application.CreateForm(TMainForm, MainForm)//这里不加;号编译功能失效
else
即使不用else密码窗口还是关闭时出错?
 
那就不用else吧,注意加上“;”
在dpr里面设置断点,然后但不执行,看在那一步出错?
 
这一次主窗口也不能显示了,密码确定按钮错误,可能还不对?
 
var
name:string;
begin
if (pascombobox.text='') or (pasedit.text='') then showmessage('Óû§ÃûÓëÃÜÂë¿ò²»ÄÜΪ¿Õ')
else
begin
pasquery.sql.clear;
pasquery.sql.add('select ÃÜÂë from pass');
pasquery.sql.add('where ̞=:name');
pasquery.ParamByName('name').asstring:=pascombobox.text;
pasquery.Open;
if pasquery.FieldByName('ÃÜÂë').AsString=pasedit.text then
begin
usename:=pascombobox.Text;
usepass:=pasedit.Text;
// mainform.Showmodal;//显示主窗口
//把这行去掉,其他同yzhshi朋友的!
//应用程序的主窗体会在Application.Run自动显示(如果Application.ShowMainForm<>False)。
end
else
begin
showmessage('Óû§ÃûÓëÃÜÂë²»¶ÔÓ¦');
end;
end;
end;
 
mainform.ShowModal;这句肯定会出错!去掉!
工程文件改为
begin
Application.Initialize;
flash:=tflash.Create(application);//启动画面
flash.Show;
flash.Update;
while flash.Timer1.Enabled do
application.ProcessMessages;
pass:=tpass.Create(application);//密码窗口
if pass.ShowModal <> mrOK then
begin
flash.Free;
Terminate;
end;
Application.CreateForm(TMainForm, MainForm);主窗口
flash.Hide;
flash.Free;
Application.Run;
 
各位大侠:
您们的指导我都执行了,但是没有mainform.showmodal 主窗口不显示;去掉,按各位的
说法密码按钮执行不过去。
想彻底麻烦各位一下,这个功能我已经调试了很久了一直没结果。不知那位仁兄能亲自做
一下,把结果告诉我,顺便指点我的错误思想是什么?
恳切的谢谢!
 
据我所知SHOWMODAL是强制焦点在当前窗口中,这个问题我已经试过了,可用如下方法解决,你自己再修改一个就可以了!!!
(当然了,这个方法可能不太标准,但可行!)

MDIFORM应该是程序的主窗口才行,如果你想完成这样的功能,用如下的方法,保证没问题!

例:创建三个窗体(假设),***第一个为MDIFORM(主窗体),第二个为MDICHILD,第三个为FSNORMAL。
其中第三个为密码校验的窗口。

在UNIT1中设置二个全局变量TIME(用来记录窗口执行次数),FLAG(用来记录是否显示主窗体)
在FORM1的ONCREATE中写入如下代码:
begin
time:=1;
flag:=true;
end;
在FORM1的ONSHOW中写入:
if time=1 then
begin
form3.showmodal;
time:=time+1;
end;
在FORM1的ONACTIVATE中加入
if (not flag) then
form1.close;
在FORM3中的确认按钮中加入
FORM3.close;
flag:=true;
form1.onactivate(self);
在FORM3中的取消按钮中加入
form3.close
flag:=false;
form1.onactivate(self);

至此,这个问题已经解决,程序启动时可以出现密码窗口,并可根据按钮的选择确定是否显示主窗口,至于子窗口的创建就如同你原来的代码了。
 
多人接受答案了。
 
后退
顶部