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

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)

我坚持这一点,并希望得到它的任何建议或更正.

先感谢您.

此致,
史蒂夫法莱罗

NGL*_*GLN 7

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

项目文件:

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.MainFormOnTaskbarApplication.ShowMainFormTrue默认.如果是这样,请尝试将它们设置为False.