gpt4 book ai didi

带登录/注销的 Delphi 应用程序 - 如何实现?

转载 作者:行者123 更新时间:2023-12-03 14:40:30 25 4
gpt4 key购买 nike

应用程序有一个登录表单和一个主表单。

应用程序 DPR 文件包含首先加载登录表单的代码,当登录表单返回成功登录时,则创建并加载主表单。

当用户通过主窗体中的菜单命令注销时,应关闭主窗体并加载登录窗体。

仅当用户在主窗体中选择“退出”(或当用户从“登录”窗体中取消)时,应用程序才会退出。

使用应用程序的 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.

上述代码的问题是,在一次迭代之后(用户在主窗体中执行注销后),应用程序退出(控制权返回到操作系统),因为“fLogin.ShowModal ”退出时没有显示登录窗体。

这是主窗体中的代码:

Procedure LogoutProcedure;
begin
TerminateApplicationFlag := False;
Close;
end;

Procedure ExitProcedure;
begin
TerminateApplicationFlag := True;
Close;
end;

我一直坚持这个问题,希望得到任何建议或更正以使其正常工作。

提前谢谢您。

问候,
史蒂夫·法莱罗

最佳答案

也许这个非常简单的解决方案就足够了:

项目文件:

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.

主要形式:

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.

登录表单:

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.

现在,这个答案在这里有效,与 Delphi 7 配合得很好,但我怀疑更新版本的问题是 Application.MainFormOnTaskbarApplication.ShowMainFormTrue默认情况下。如果是这样,请尝试将它们设置为 False .

关于带登录/注销的 Delphi 应用程序 - 如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7839648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com