用delphi开发一个需要先登陆才能继续的程序,就会有一个选择登陆窗口出现时机的问题。如果在主窗口准备工作都做完后再启动登陆窗口,会显得程序的启动过程缓慢。
而一开始就显示登陆窗口,等用户名密码校验通过后再启动主窗口并做数据初始化。这样看起来程序的启动迅速,只是登陆比较慢,客户往往比较理解。
问题是delphi默认把第一个创建的窗体做为MainForm,且这个属性是只读的,MainForm一关闭,程序就停止运行了。用登陆窗体作MainForm,登陆后再隐藏登陆窗口也是一个解决方法。那另外还有没有登陆成功后再创建MainForm的方法呢?
下面看看我的拙作,且作抛砖引玉。您有更好的方法,欢迎共享 ufo2003@126.com
在工程文件内更改如下:
program JST;
uses
Forms,
windows,
Unit1 in 'Unit1.pas' {Form1},
Unit7 in 'Unit7.pas' {DataModule7: TDataModule},
Unit8 in 'Unit8.pas' {Form8},
begin
Application.Initialize;
Application.Title := 'JIT SYSTEM';
form8:= tform8.Create(Application); //form8是一个登陆窗体
form8.ShowModal; //因为登陆窗体不是主窗体,如果用户不登陆,直接关闭窗体后程序不进入消息循环,会立即结束。
Application.Run;
end.
然后在 form8的登陆按钮内创建主窗体,如果用到数据模块,也可以在登陆按钮内创建然后连接数据库。
procedure TForm8.Button1Click(Sender: TObject);
begin
screen.Cursor:= crhourglass;
if not assigned(DataModule7) then
DataModule7:= tDataModule7.Create(application); //创建数据模块
…… //验证用户名和密码,通过后继续
if not assigned(form1) then
Application.CreateForm(TForm1, Form1); //创建MainForm关键在这一步。使用application的createform方法创建窗体和使用form类的create方法不同。application的createform方法如果检测到MainForm不存在,会把第一个用此方法创建的窗体作为MainForm。
…… //其他初始化工作
form1.Show; //显示主窗口
screen.Cursor:= crdefault;
form8.ModalResult:= mrok;
end;