Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Loginform soll geschlossen werden bevor MainForm erscheint (https://www.delphipraxis.net/77802-loginform-soll-geschlossen-werden-bevor-mainform-erscheint.html)

Mackhack 25. Sep 2006 09:03


Loginform soll geschlossen werden bevor MainForm erscheint
 
Hi,

ich habe hier ne Anwendung die eine MainForm hat sowie eine Form mit Login und n paar anderen Forms. Als erstes wird die Login Form erzeugt und angezeigt. Wenn Username und Password stimmen soll die Form aber verschwinden und die MainForm angezeigt werden.

Ich habe mir ueberlegt ich kann ja die LoginForm mit .Hide verstecken und wenn ich die MainForm schliesse ist sie mit weg. ABER: Man sieht sie nochmal fuer einen Bruchteil einer Sekunde. Das moechte ich aber nicht. Mit .Close kann ich die LoginForm auch nicht schliessen da dann das ganze Programm geschlossen wird komischerweise.

Hat mir jemanden n guten Rat/Idee deshalb?

Danke

hsg 25. Sep 2006 09:16

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
Wird das Login-Fenster mit Close geschlossen und dadurch das Programm beendet, dann bedeutet das, das dein Login-Fenster das Hauptformular deines Programmes ist.
Besser ist es, die Automatische Erzeugung des Login-Fensters komplett zu verbieten und im OnCreate-Event deines Mainforms das Login-Fenster händisch zu erzeugen und im Fehlerfall die Applikation zu beenden (Application.Terminate())

TStringlist 25. Sep 2006 11:08

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
Hi, ...schon mal versucht, den ShowModal-Aufruf deiner Login-Form in der Projektdatei noch vor dem deiner Mainform zu starten?


Delphi-Quellcode:
program Project1;

uses
  Forms,
  Controls,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2); // deine Login-Form

  if Form2.ShowModal = mrCancel then Application.Terminate;

  Application.Run;
end.

igel457 25. Sep 2006 13:21

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
Ich würde das eher so machen:

Delphi-Quellcode:
program Project1;

uses
  Forms,
  Controls,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas';

{$R *.res}
var login:TForm2;
begin
  Application.Initialize;
  login := TForm2.Create(nil);
  if login.ShowModal = mrCancel then
  begin
    Application.Terminate;
  end
  else
  begin
    Application.CreateForm(TForm1,Form1);
    Application.Run;
  end;
end.
An dieser Stelle verweise ich dich auch mal auf den Sourcecode von meinem Spiel: http://crashpoint.cvs.sourceforge.ne...ew=markup#l_88

[Edit]Kleiner Fehler[/Edit]
[Edit2]Fehler im URL Tag[/Edit2]
[Edit3]Noch eine kleine Verbesserung[/Edit3]

alzaimar 25. Sep 2006 13:55

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
Und ich würde sogar das Login-Form als Hauptformular definieren.
Klickt man auf Login, wird einfach eine Instanz des 'Mainforms' erzeugt und angezeigt. Nach Beendigung des MainForms ist man wieder im Login-Formular. Alternativ kann man die Eigenschaft 'ModalResult' des Login-Buttons auch auf mrClose setzen. Im OnClick-Ereignis des Login-Buttons wird die Hauptanwendung mit ShowModal gezeigt. Wenn der Anwender dann in der Hauptanwendung auf 'Beenden' klickt, wird zuerst das Hauptformular und dann der Login-Dialog geschlossen.

Delphi-Quellcode:
Procedure TMyLoginDialog.btLoginClick (Sender : TObject);
Begin
  With TMainForm.Create(Nil) Do Begin
    ShowModal;
    Release;
  End;
  // ModalResult := mrClose; <-- die '//' wegnehmen, wenn der Login-Dialog immer da sein soll.
End;
Das hat gegenüber den anderen beiden Lösungen den Vorteil, das man erstens nicht im Projektquelltext rumwurschteln muss und 2. keine unliebsamen Überrraschungen erlebt, wenn man im OnCreate der Hauptanwendung gleich ein Application.Terminate aufruft.

MuTzE 25. Sep 2006 14:35

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
Ich würde gar nix davon machen!


Hauptformular:

Delphi-Quellcode:
procedure TMainFrm.FormShow(Sender: TObject);
begin
  PasswordFrm.ShowModal;
end;


Passwortformular:

Delphi-Quellcode:
var
  AllowClose: Boolean;


procedure TPasswordFrm.AcceptBtnClick(Sender: TObject);
begin
  if PasswordEdit.Text = 'Passwort' then
   begin
    Accepted := True;
    Close;
   end
  else
   begin
    ShowMessage('Das Passwort ist ungültig!');
    PasswordEdit.Clear;
  end;
end;

procedure TPasswordFrm.ExitBtnClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TPasswordFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if AllowClose = True then
   CanClose := True
  else
   CanClose := False;
end;

alzaimar 25. Sep 2006 14:42

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
Äh...Soll ich mich jedesmal einloggen, wenn das Hauptformular mal wieder sichtbar wird?
Wenn überhaupt, dann im OnActivate. Das ist dann besser.

Also: Nachdem hier alle wild durcheinander gepostet haben, ist das hier (99% Muetze) wohl das Einfachste:

Delphi-Quellcode:
Procedure MyMainForm.OnActivate (Sender : TObject);
Begin
  If Not LoginCorrect Then Application.Terminate;
End;
Wobei 'LoginCorrect' natürlich eine Funktion ist, die True liefert, wenn der Anwender sich korrekt eingeloggt hat und False, wenn nicht.

MuTzE 25. Sep 2006 14:53

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
:shock: MuTzE bitte und nich Muetze!!!!!!!!! :evil:

moonwhaler 25. Sep 2006 14:53

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
Ich habe das in mehreren kommerziellen Applikationen wie folgt gelöst und fahre sehr gut damit:
Delphi-Quellcode:
begin
  Application.Initialize;

  if ( not Assigned( FPassword ) ) then
    FPassword := TFPassword.Create( FPassword );

  if ( not Session.Users.LoadFromFile( ApplicationPath +
                                       c_ConfigDir + 'Users.xml' ) ) then
    mBox( _( 'FEHLER!' ),
          _( 'Ein Fehler beim Lesen der Benutzerdaten ist aufgetreten. '+
             'Login NUR Superuser möglich. Abbruch!' ),
          TRUE );

  if ( FPassword.Check( mode_start, TRUE, FALSE ) = pass_ok ) then
  begin
    Application.CreateForm(TFUserManager, FUserManager);
    Application.CreateForm(TFTrackoutManager, FTrackoutManager);

    Application.Run;
  end else
  begin
    Session.Free();
    FPassword.Free();
  end;
end.
Nachtrag! Die Funktion CHECK im Formular / Unit "FPassword":
Delphi-Quellcode:
function TFPassword.Check( mode: TMode;
                           ShowCloseButton: Boolean;
                           ShowOKButtonOnly: Boolean = FALSE ): TPasswordResultType;
begin
  result  := pass_failed;
  MayClose := FALSE;
  PWResult := pass_failed;

  accessmode := mode;

  if ( ShowOKButtonOnly ) then
    button_cancel.Enabled := FALSE
  else
    button_cancel.Enabled := TRUE;

  if ( showCloseButton ) then
  begin
    button_cancel.ModalResult := mrAbort;
    button_cancel.Caption    := _( '&Beenden' );
  end else begin
    button_cancel.ModalResult := mrCancel;
    button_cancel.Caption    := _( '&Abbrechen' );
  end;

  // If the workstation has a valid login, quit here...
  if ( Session.Active ) then
  begin
    if ( ( ( Session.CheckUserRights( mode ) ) AND
           ( Session.Users.Count > 0 ) ) OR
         ( Session.UserType = type_superuser ) ) then
    begin
      result := pass_ok;
      exit;
    end else
    begin
      if ( mBox( _( 'Zugriff verweigert!' ),
                 _( 'Sie besitzen nicht die nötigen Rechte, um auf diese ' +
                    'Resource zugreifen zu können. Wollen Sie den Vorgang ' +
                    'abbrechen?' ), FALSE ) ) then
        exit;
    end;
  end;

  self.ShowModal();

  result := PWResult;
  accessmode := mode_none;
  resetInput();

  close();
end;

MuTzE 25. Sep 2006 14:55

Re: Loginform soll geschlossen werden bevor MainForm erschei
 
Und außerdem! Wenn dann beim OnCreate und nich beim OnActivate!

* OnCreate
* OnShow
* OnPaint
* OnActivate
* OnResize
* OnPaint


:wink:

_____________
EDIT:

So und wie ich grad feststellen musste geht mit meiner Methode nur OnShow!
Ich wusste schon warum das so ist. Aber wenn die von moonwhaler geht, nimm die.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz