11
votes

Application has a Login form and a Main form.

Applications DPR file has code to load Login form first, and when Login form returns successful login, then Main form is created and loaded.

When user logs out via a menu command in Main form, it should close the Main form and load the Login form.

Application exits only when user selects Exit in the Main form (or when user Cancels out of the Login form).

Using code in the application's DPR file, is it possible to code this?

Here is the code that presently exists:

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.

The problem with the above code is that after one iteration (after user performs Logout in Main form), the application exits (control is returned to the operating system) because " fLogin.ShowModal " exits without showing the Login form.

Here is the code from the Main form:

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

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

I'm stuck with this and would appreciate any advice or corrections in getting it to work.

Thank you in advance.

Regards,
Steve Faleiro

1
Show the login form from the .dpr. Create it by calling TLoginForm.Create. Do not use Application.CreateForm. Show it with ShowModal. When it returns decide whether or not to proceed. If you proceed create your main form and this time use Application.CreateForm. Then call Application.Run. Sorry this is all in a comment but an overzealous admin has close the question even though I can understand what you ask.David Heffernan
Of course it's possible to code that. Start typing!Rob Kennedy
@David Heffernan: +1 for "overzealous admin", I understood question tooAlexander Malakhov
Great to see the SO community working well to reopen this question and provide help. Good work people!David Heffernan

1 Answers

7
votes

Maybe this very simple solution is sufficient:

The project file:

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.

The main form:

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.

And the login form:

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.

Now, this answer works here, quite well with Delphi 7, but I suspect problems with more recent versions were Application.MainFormOnTaskbar and Application.ShowMainForm are True by default. When so, try to set them to False.