![]() |
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 |
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()) |
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. |
Re: Loginform soll geschlossen werden bevor MainForm erschei
Ich würde das eher so machen:
Delphi-Quellcode:
An dieser Stelle verweise ich dich auch mal auf den Sourcecode von meinem Spiel:
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. ![]() [Edit]Kleiner Fehler[/Edit] [Edit2]Fehler im URL Tag[/Edit2] [Edit3]Noch eine kleine Verbesserung[/Edit3] |
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:
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.
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; |
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; |
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:
Wobei 'LoginCorrect' natürlich eine Funktion ist, die True liefert, wenn der Anwender sich korrekt eingeloggt hat und False, wenn nicht.
Procedure MyMainForm.OnActivate (Sender : TObject);
Begin If Not LoginCorrect Then Application.Terminate; End; |
Re: Loginform soll geschlossen werden bevor MainForm erschei
:shock: MuTzE bitte und nich Muetze!!!!!!!!! :evil:
|
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:
Nachtrag! Die Funktion CHECK im Formular / Unit "FPassword":
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.
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; |
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 09:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz