11 delphi
应用程序有一个登录表单和一个主表单.
应用程序DPR文件具有首先加载登录表单的代码,当登录表单返回成功登录时,则创建并加载主表单.
当用户通过Main表单中的菜单命令注销时,它应该关闭Main表单并加载Login表单.
仅当用户在主窗体中选择"退出"时(或当用户从"登录"窗体中取消)时,应用程序才会退出.
使用应用程序的DPR文件中的代码,是否可以对此进行编码?
这是目前存在的代码:
program H;
uses
Forms,
SysUtils,
Registry,
MidasLib,
Dialogs,
Controls,
uDatamod in 'uDatamod.pas' {datamod: TDataModule} ,
uMain in 'uMain.pas' {fMain} ,
uMtlUpd in 'uMtlUpd.pas' {fMtlUpd} ,
uReportPrv in 'uReportPrv.pas' {fReportPrv} ,
uCamera in 'uCamera.pas' {fCamera} ,
uConfig in 'uConfig.pas' {fConfig} ,
uFuncs in 'uFuncs.pas',
uLogin in 'uLogin.pas' {fLogin} ,
uAdmin in 'uAdmin.pas' {fAdmin};
// MidasLib is required.
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Title := 'HTech';
if ((ParamCount = 1) and (UpperCase(ParamStr(1)) = '/CONFIG')) or
(getHServerHostName = EmptyStr) then
begin
Application.CreateForm(TfConfig, fConfig);
Application.Run;
end
else
begin
if not testHServerConnection then
begin
ShowMessage('Error: Could not connect to HServer');
Exit;
end;
Application.CreateForm(Tdatamod, Datamod);
while not TerminateApplicationFlag do
begin
fLogin := TfLogin.Create(Application);
try
if fLogin.ShowModal = mrOk then
begin
LoggedInEmployeeID := fLogin.FEmployeeID;
LoggedInEmployeeNm := fLogin.edtFirstName.Text + ' ' +
fLogin.edtLastName.Text;
AdminLogin := fLogin.FAdminUser;
FinanceLogin := fLogin.FFinanceUser;
end
else
begin
FreeAndNil(fLogin);
FreeAndNil(Datamod);
Exit;
end;
finally
// FreeAndNil(fLogin);
end;
if AdminLogin then
Application.CreateForm(TfAdmin, fAdmin)
else
begin
FreeAndNil(fLogin);
if not Assigned(fMain) then
Application.CreateForm(TfMain, fMain);
fMain.FHServerHost := getHServerHostName;
end;
Application.Run;
end;
end;
end.
Run Code Online (Sandbox Code Playgroud)
上面代码的问题是,在一次迭代之后(在用户以主窗体执行Logout之后),应用程序退出(控制返回到操作系统),因为"fLogin.ShowModal"退出而不显示Login窗体.
以下是Main表单中的代码:
Procedure LogoutProcedure;
begin
TerminateApplicationFlag := False;
Close;
end;
Procedure ExitProcedure;
begin
TerminateApplicationFlag := True;
Close;
end;
Run Code Online (Sandbox Code Playgroud)
我坚持这一点,并希望得到它的任何建议或更正.
先感谢您.
此致,
史蒂夫法莱罗
也许这个非常简单的解决方案就足够
项目文件:
program Project1;
uses
Forms,
FMain in 'FMain.pas' {MainForm},
FLogin in 'FLogin.pas' {LoginForm};
{$R *.res}
var
MainForm: TMainForm;
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Login;
Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)
主要形式:
unit FMain;
interface
uses
Classes, Controls, Forms, StdCtrls, FLogin;
type
TMainForm = class(TForm)
LogoutButton: TButton;
procedure LogoutButtonClick(Sender: TObject);
end;
implementation
{$R *.dfm}
procedure TMainForm.LogoutButtonClick(Sender: TObject);
begin
Login;
end;
end.
Run Code Online (Sandbox Code Playgroud)
并登录表格:
unit FLogin;
interface
uses
Classes, Controls, Forms, StdCtrls;
type
TLoginForm = class(TForm)
LoginButton: TButton;
CancelButton: TButton;
procedure FormCreate(Sender: TObject);
end;
procedure Login;
implementation
{$R *.dfm}
procedure Login;
begin
with TLoginForm.Create(nil) do
try
Application.MainForm.Hide;
if ShowModal = mrOK then
Application.MainForm.Show
else
Application.Terminate;
finally
Free;
end;
end;
procedure TLoginForm.FormCreate(Sender: TObject);
begin
LoginButton.ModalResult := mrOK;
CancelButton.ModalResult := mrCancel;
end;
end.
Run Code Online (Sandbox Code Playgroud)
现在,这个答案在这里工作,很好用Delphi 7,但我怀疑有较新版本的问题是Application.MainFormOnTaskbar和Application.ShowMainForm是True默认.如果是这样,请尝试将它们设置为False.