如何消除主窗口一闪而过得现象:(100分)

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

sunyb

Unregistered / Unconfirmed
GUEST, unregistred user!
我在主窗口的FormCreate里加入了数据库连接和登录,
如果出现不能登录或数据库不能连接的情况就让程序
终止application.Terminate,问题是主窗口好象总要
闪现一下,不知道有什么好的办法?
 
if not UserLogin then
begin
SetSplashState('Terminating application...');
Application.Terminate;
end
else
begin
{主窗口}
if Assigned(frmAbout) then
frmAbout.Opacity := 240;
SetSplashState('Creating main window...');
Application.CreateForm(TfrmMain, frmMain);
end;
 
这个过程好象是在DPR文件里?
 
先设定
Application.ShowMainForm := False;
确实在登录验证成功后,改它为True;
 
如你的密码是从数据库中取出验证。应是先连接数据库之后,登录。再显示主窗口
 
不要写在FormCreate事件中,在FormMain创建之前提示认证信息,如果认证通过
再创建主窗口。
 
我的程序大体是这样的:
procedure TmainForm.FormCreate(Sender: TObject); //启动配置
var
filename,yhqx,autotime:string;
i:integer;
hour,minute,second:word;
newTime:TSystemTime;
begin
quit:=false;
//screen.cursor:=crsqlwait;

//=====================读取配置文件===================//
Filename:=ExtractFilePath(Paramstr(0))+'office.ini';
myinifile:=Tinifile.create(filename);
servername:=myinifile.Readstring('数据服务器','servername','mainSERVER');
Autotime:=myinifile.Readstring('时间调整','autotime','T');

//===================== 设置并建立连接 ===================//
ADOConnection1.Connectionstring:='Provider=SQLOLEDB.1;'+
'Persist Security Info=False;'+
'User ID=sa;'+
'Initial Catalog=office;'+
'Data Source='+servername+';'+
'Locale Identifier=2052;'+
'Connect Timeout=3;'+
'Use Procedure for Prepare=1;'+
'Auto Translate=True;'+
'Packet Size=4096;'+
'Workstation ID=sunyb';
try
ADOConnection1.connected:=true;
except
application.MessageBox(pchar('服务器 "'+servername+'" 连接失败!请检查服务器及数据库是否打开或网络是否正常。'),pchar(application.title),mb_ok+mb_iconhand);
application.Terminate; //这里有可能退出
end;

//=====================同步服务器时间===================//
IF AutoTime='T' then
begin
with adoquery1 do
begin
SQL.TEXT:='SELECT convert(varchar(19),getdate(),120)';
open;
year:=strtoint(copy(Fields[0].asstring,1,4));
month:=strtoint(copy(Fields[0].asstring,6,2));
day:= strtoint(copy(Fields[0].asstring,9,2));
hour:=strtoint(copy(Fields[0].asstring,12,2));
minute:=strtoint(copy(Fields[0].asstring,15,2));
second:=strtoint(copy(Fields[0].asstring,18,2));
Close;
end;
with newtime do
begin
wYear:=year;
wMonth:=month;
wDay:=day;
wHour:=hour;
wMinute:=minute;
wSecond:=second;
wMilliseconds:=0;
end;
SetLocalTime(newtime);
SendMessage(HWND_BROADCAST,WM_TIMECHANGE,0,0); //时间广播到当前运行各进程
end;

//===================== 程序有效期 ===================//
decodedate(date,year,month,day);
if 。。。。then
begin
application.MessageBox(pchar('程序已过测试期,请安装更新版本!'),pchar(''),mb_ok+mb_iconwarning);
application.Terminate; //这里有可能退出
end;

//===================== 登录并设置权限 ===================//
//screen.cursor:=crdefault;
try
logonform := tlogonform.create(self);
logonform.showmodal;
finally
logonform.free;
end;
////////////////////
if quit=true then //根据登录情况判断这里可能退出
Application.Terminate
else
begin
设置权限。。。
end;
end;
 
to Adnil:
问题是我将ADO连接放在主窗口上
在工程文件里怎样设置数据连接?
 
难道没有命令让程序立即终止?
 
那换一种方法:尝试一下不用Application.Terminate,直接使用Halt;
 
在提供一种方法:原代码不变,Create的时候如果认证失败,那就
Self.Left := -1000;
Self.Top := -1000;
Application.Terminate;或Halt;
 
建议:
把数据库访问的组件放在(TDataModule)中
在主Form的OnCreate事件中调用闪现窗体和登录窗体
在闪现窗体里读取设置并检查数据库连接
 
密码验证窗口在以前很多次提出过,但答案好象都不是很好的解决办法,前几天根据
FlashScreen的原理我成功的实现了密码验证窗口,效果比在主窗体中调用密码验证窗口是
即简单又容易控制。
可以给我发Mail:BambooHeart@vip.sina.com索取示例
 
to adnil:
不可行的,仍旧会有遗留反应,比如屏幕一跳、一声警告音
 
我的问题不单纯是密码认证的问题,其实在主窗口FormCreate过程有好几个判断条件。
 
关键是 Application.Terminate
这个命令的后续代码其实还是走了一遍,怎样能够刹车?
 
TerminateProcess(GetCurrentProcess, 0);
 

如果实在要将代码写在FormCreate中,将所有的Application.Terminate替换为Halt,应该是没有屏蔽闪烁的感觉。
 
后退
顶部