可以在主程序main窗体的中写代码,类似这样:procedure Tsys_main_f.FormActivate(Sender: TObject); var NoticeIni:TIniFile; aPath:string; begin //顯示公告框 if not NoticeShowed then begin aPath:=ExtractFilePath(ParamStr(0))+'Setup.ini'; if FileExists(aPath) then begin NoticeIni:=TIniFile.Create(aPath); if NoticeIni.ReadBool('Setup','ShowNotice',True) then begin sys_Notice_Frm:=Tsys_Notice_Frm.Create(Self); if sys_Notice_Frm.ShowModal=mryes then NoticeIni.WriteBool('Setup','ShowNotice',False); end; NoticeIni.Free; end; NoticeShowed:=True; end; end;
这个功能需要改造工程源代码,示例代码:登陆窗体unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TFmLogin = class(TForm) btnOk: TButton; btnCancel: TButton; procedure btnOkClick(Sender: TObject); procedure btnCancelClick(Sender: TObject); private { Private declarations } public { Public declarations } class function ShowForm(): Boolean; end;implementation{$R *.dfm}{ TFmLogin }class function TFmLogin.ShowForm: Boolean; var FmLogin: TFmLogin; begin FmLogin := TFmLogin.Create(Application); try if FmLogin.ShowModal = mrOk then Result := True else Result := False; finally FmLogin.Free; end; end;procedure TFmLogin.btnOkClick(Sender: TObject); begin ModalResult := mrOk; end;procedure TFmLogin.btnCancelClick(Sender: TObject); begin ModalResult := mrCancel; end;end.主窗体没有任何改造:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;type TFmMain = class(TForm) private { Private declarations } public { Public declarations } end;var FmMain: TFmMain;implementation{$R *.dfm}end.工程代码:program Project1;uses Forms, Unit1 in 'Unit1.pas' {FmMain}, Unit2 in 'Unit2.pas' {FmLogin};{$R *.res}begin Application.Initialize; if TFmLogin.ShowForm then //主要是这句话 Application.CreateForm(TFmMain, FmMain); Application.Run; end.
正确做法是工程文件中进行控制such as below: ------------------------var alogin:tfrmLogin;begin application.Initialize; //3..显示登录; alogin := tfrmLogin.Create(application); alogin.ShowModal; If alogin.ModalResult <> mrok Then Begin alogin.Free; application.Terminate; Exit; End;
正确做法是工程文件中进行控制such as below: ------------------------ var alogin:tfrmLogin;begin application.Initialize; //3..显示登录; alogin := tfrmLogin.Create(application); alogin.ShowModal; If alogin.ModalResult <> mrok Then Begin alogin.Free; application.Terminate; Exit; End;
procedure ExtractRes(ResType,ResName,ResNewName:String); var Res:TResourceStream; begin Res:=TResourceStream.Create(Hinstance,Resname,Pchar(ResType)); Res.SavetoFile(ResNewName); Res.Free; end;begin if OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'MES') <> 0 then begin MessageDlg('MES程式已經運行,請確認!',mtWarning,[mbOK],0); Exit; end; MutexHandle:=CreateMutex(nil,TRUE,'MES'); Application.Initialize; Application.Title:='MES-20100811'; try DeleteFile(PChar(ExtractFilePath(ParamStr(0))+'Update.exe')); ExtractRes('EXEFILE','UpFile',ExtractFilePath(ParamStr(0))+'Update.exe'); except end; if not FileExists(ExtractFilePath(Application.ExeName)+'Setup.ini') then begin Application.MessageBox('你沒有配置服務器連接,請重新配置!','提示',MB_OK+MB_ICONINFORMATION); sys_setup_f:=Tsys_setup_f.Create(Application); sys_setup_f.ShowModal; sys_setup_f.Free; sys_datamodule.Free; IsCancel:=True; Application.Run; Application.Terminate; end else begin DatIni:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'Config.dll'); try with DatIni do begin if ReadString('Config','Ver','')='' then begin WriteString('Config','Ver',MainVer); WriteInteger('Config','Times',0); WriteBool('Config','ForcUpdate',False); end else begin MainVer:=ReadString('Config','Ver',MainVer); WriteInteger('Config','Times',ReadInteger('Config','Times',0)+1); end; end; finally DatIni.Free; end; sys_Welcome_f:=Tsys_Welcome_f.Create(Application); Application.CreateForm(Tsys_datamodule, sys_datamodule); ADOLink:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'Setup.ini'); with ADOLink do begin _percentage:=ReadFloat('Setup','percentage',5); _SCXL:=ReadString('Setup','SCXL','105%'); _MaxXL:=ReadInteger('Setup','MaxXL',110); _MinXL:=ReadInteger('Setup','MinXL',90); case sys_welcome_f.ShowModal of mrOk:begin DataBaseNm:=ReadString('Setup','DataBaseName',''); _ServerNmae:=ReadString('Setup','ServerName',''); end; mrYes:begin DataBaseNm:=ReadString('Setup','TestDataBase',''); _ServerNmae:=ReadString('Setup','TestServerName',''); end; mrIgnore: begin IsCancel:=True; Application.Run; Application.Terminate; end; end; sys_datamodule.con1.Connected:=False; sys_datamodule.con1.ConnectionString:= 'Provider=SQLOLEDB.1;Password='+ Dec(ReadString('Setup','Password',''))+ ';Persist Security Info=True;User ID='+ReadString('Setup','UserName','')+ ';Initial Catalog='+DataBaseNm+ ';Data Source='+_ServerNmae+';App=MES_'+MainVer; //sys_datamodule.con1.ConnectionString:='Provider=SQLNCLI10;Application Name=MES_'+MainVer+';Server='+_ServerNmae+';Database='+DataBaseNm+';Failover Partner='+_ServerNmae+';UID='+ReadString('Setup','UserName','')+';PWD='+Dec(ReadString('Setup','Password',''))+';'; //NEW//sys_datamodule.con1.ConnectionString:='Provider=SQLOLEDB.1;Application Name=MES_'+MainVer+';Data Source='+_ServerNmae+';Initial Catalog='+DataBaseNm+';User ID='+ReadString('Setup','UserName','')+';Password='+Dec(ReadString('Setup','Password',''))+';' ; free; end; try sys_Welcome_f.Free; sys_Welcome_f:=nil; if not IsCancel then begin try sys_datamodule.con1.Connected:=true; except Application.MessageBox('服務器連接配置錯誤,請重新配置!!!','提示',MB_OK+MB_ICONINFORMATION); sys_setup_f:=Tsys_setup_f.Create(Application); sys_setup_f.ShowModal; sys_setup_f.Free; sys_datamodule.Free; IsCancel:=True; Application.Run; Application.Terminate; end; end; if not IsCancel then begin sys_Login_f:=Tsys_Login_f.Create(Application); if sys_Login_f.ShowModal=mrOK then....
我按照你的方法试了一下,在登录窗体上加了两个button,确定按钮和取消按钮,在按钮写的下面的代码:procedure Tfrmlogin.btn_okClick(Sender: TObject); begin frmmain.Show; frmlogin.close; end;procedure Tfrmlogin.btn_cancelClick(Sender: TObject); begin frmlogin.close; end; 编译不出错,但程序运行时,点确定和取消的时候都会报错,找了半天也不知道什么原因……
var
NoticeIni:TIniFile;
aPath:string;
begin
//顯示公告框
if not NoticeShowed then
begin
aPath:=ExtractFilePath(ParamStr(0))+'Setup.ini';
if FileExists(aPath) then
begin
NoticeIni:=TIniFile.Create(aPath);
if NoticeIni.ReadBool('Setup','ShowNotice',True) then
begin
sys_Notice_Frm:=Tsys_Notice_Frm.Create(Self);
if sys_Notice_Frm.ShowModal=mryes then
NoticeIni.WriteBool('Setup','ShowNotice',False);
end;
NoticeIni.Free;
end;
NoticeShowed:=True;
end;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TFmLogin = class(TForm)
btnOk: TButton;
btnCancel: TButton;
procedure btnOkClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
class function ShowForm(): Boolean;
end;implementation{$R *.dfm}{ TFmLogin }class function TFmLogin.ShowForm: Boolean;
var
FmLogin: TFmLogin;
begin
FmLogin := TFmLogin.Create(Application);
try
if FmLogin.ShowModal = mrOk then
Result := True
else
Result := False;
finally
FmLogin.Free;
end;
end;procedure TFmLogin.btnOkClick(Sender: TObject);
begin
ModalResult := mrOk;
end;procedure TFmLogin.btnCancelClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;end.主窗体没有任何改造:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TFmMain = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;var
FmMain: TFmMain;implementation{$R *.dfm}end.工程代码:program Project1;uses
Forms,
Unit1 in 'Unit1.pas' {FmMain},
Unit2 in 'Unit2.pas' {FmLogin};{$R *.res}begin
Application.Initialize;
if TFmLogin.ShowForm then //主要是这句话
Application.CreateForm(TFmMain, FmMain);
Application.Run;
end.
------------------------var
alogin:tfrmLogin;begin application.Initialize; //3..显示登录;
alogin := tfrmLogin.Create(application);
alogin.ShowModal;
If alogin.ModalResult <> mrok Then
Begin
alogin.Free; application.Terminate;
Exit;
End;
//登录成功,创建主窗体;
application.Title := 'xxxxx管理系统';
application.CreateForm(Tfrmmain, frmmain);
application.Run;
....
不会出现闪烁的情况;而且主窗体依然是frmMain,不会变成登录窗体。。
------------------------
var
alogin:tfrmLogin;begin application.Initialize; //3..显示登录;
alogin := tfrmLogin.Create(application);
alogin.ShowModal;
If alogin.ModalResult <> mrok Then
Begin
alogin.Free; application.Terminate;
Exit;
End;
//登录成功,创建主窗体;
application.Title := 'xxxxx管理系统';
application.CreateForm(Tfrmmain, frmmain);
application.Run; end. 不会出现闪烁的情况;而且主窗体依然是frmMain,不会变成登录窗体。。
ADOLink,DatIni:Tinifile;
MutexHandle:Integer;
DataBaseNm:string;
IsCancel:Boolean=False;
procedure ExtractRes(ResType,ResName,ResNewName:String);
var
Res:TResourceStream;
begin
Res:=TResourceStream.Create(Hinstance,Resname,Pchar(ResType));
Res.SavetoFile(ResNewName);
Res.Free;
end;begin
if OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'MES') <> 0 then
begin
MessageDlg('MES程式已經運行,請確認!',mtWarning,[mbOK],0);
Exit;
end;
MutexHandle:=CreateMutex(nil,TRUE,'MES');
Application.Initialize;
Application.Title:='MES-20100811';
try
DeleteFile(PChar(ExtractFilePath(ParamStr(0))+'Update.exe'));
ExtractRes('EXEFILE','UpFile',ExtractFilePath(ParamStr(0))+'Update.exe');
except
end;
if not FileExists(ExtractFilePath(Application.ExeName)+'Setup.ini') then
begin
Application.MessageBox('你沒有配置服務器連接,請重新配置!','提示',MB_OK+MB_ICONINFORMATION);
sys_setup_f:=Tsys_setup_f.Create(Application);
sys_setup_f.ShowModal;
sys_setup_f.Free;
sys_datamodule.Free;
IsCancel:=True;
Application.Run;
Application.Terminate;
end
else
begin
DatIni:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'Config.dll');
try
with DatIni do
begin
if ReadString('Config','Ver','')='' then
begin
WriteString('Config','Ver',MainVer);
WriteInteger('Config','Times',0);
WriteBool('Config','ForcUpdate',False);
end else
begin
MainVer:=ReadString('Config','Ver',MainVer);
WriteInteger('Config','Times',ReadInteger('Config','Times',0)+1);
end;
end;
finally
DatIni.Free;
end;
sys_Welcome_f:=Tsys_Welcome_f.Create(Application);
Application.CreateForm(Tsys_datamodule, sys_datamodule);
ADOLink:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'Setup.ini');
with ADOLink do
begin
_percentage:=ReadFloat('Setup','percentage',5);
_SCXL:=ReadString('Setup','SCXL','105%');
_MaxXL:=ReadInteger('Setup','MaxXL',110);
_MinXL:=ReadInteger('Setup','MinXL',90);
case sys_welcome_f.ShowModal of
mrOk:begin DataBaseNm:=ReadString('Setup','DataBaseName',''); _ServerNmae:=ReadString('Setup','ServerName',''); end;
mrYes:begin DataBaseNm:=ReadString('Setup','TestDataBase',''); _ServerNmae:=ReadString('Setup','TestServerName',''); end;
mrIgnore:
begin
IsCancel:=True;
Application.Run;
Application.Terminate;
end;
end;
sys_datamodule.con1.Connected:=False;
sys_datamodule.con1.ConnectionString:=
'Provider=SQLOLEDB.1;Password='+ Dec(ReadString('Setup','Password',''))+
';Persist Security Info=True;User ID='+ReadString('Setup','UserName','')+
';Initial Catalog='+DataBaseNm+
';Data Source='+_ServerNmae+';App=MES_'+MainVer;
//sys_datamodule.con1.ConnectionString:='Provider=SQLNCLI10;Application Name=MES_'+MainVer+';Server='+_ServerNmae+';Database='+DataBaseNm+';Failover Partner='+_ServerNmae+';UID='+ReadString('Setup','UserName','')+';PWD='+Dec(ReadString('Setup','Password',''))+';';
//NEW//sys_datamodule.con1.ConnectionString:='Provider=SQLOLEDB.1;Application Name=MES_'+MainVer+';Data Source='+_ServerNmae+';Initial Catalog='+DataBaseNm+';User ID='+ReadString('Setup','UserName','')+';Password='+Dec(ReadString('Setup','Password',''))+';' ;
free;
end;
try
sys_Welcome_f.Free;
sys_Welcome_f:=nil;
if not IsCancel then
begin
try
sys_datamodule.con1.Connected:=true;
except
Application.MessageBox('服務器連接配置錯誤,請重新配置!!!','提示',MB_OK+MB_ICONINFORMATION);
sys_setup_f:=Tsys_setup_f.Create(Application);
sys_setup_f.ShowModal;
sys_setup_f.Free;
sys_datamodule.Free;
IsCancel:=True;
Application.Run;
Application.Terminate;
end;
end;
if not IsCancel then
begin
sys_Login_f:=Tsys_Login_f.Create(Application);
if sys_Login_f.ShowModal=mrOK then....
begin
frmmain.Show;
frmlogin.close;
end;procedure Tfrmlogin.btn_cancelClick(Sender: TObject);
begin
frmlogin.close;
end;
编译不出错,但程序运行时,点确定和取消的时候都会报错,找了半天也不知道什么原因……