Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Beste "Stelle" für eigenen Login-Prompt bei ADO (https://www.delphipraxis.net/126614-beste-stelle-fuer-eigenen-login-prompt-bei-ado.html)

fragile 29. Dez 2008 14:32

Datenbank: MS SQL • Version: 2005 • Zugriff über: ADO

Beste "Stelle" für eigenen Login-Prompt bei ADO
 
Hi,

meine Formular-Erstellungsreihenfolge sieht etwa so aus:

DataModul
<Hauptformular>
<weitere Formulare inkl. DB-Login Formular>

Ich möchte beim ersten Aufbau der Verbindung per TADOConnection - Komponente meinen eigenen Login-Dialog "einschieben".
Wo wäre der beste Platz dafür ?

Probleme, die ich bisher habe, sind :

- OnLogin-Ereignis funktioniert nicht mit ausgeschaltetem LoginPrompt und ConnectionString, mit eingeschaltetem Prompt kommt das Standard-Anmeldefenster und nicht meins

- Ich möchte die Erstellungsreihnefolge nicht ändern, sprich das bisherige Hauptformular soll auch bleiben. Wenn ich aber im Hauptformular bspw. im OnShow-Ereignis die Connection aufmache bzw. dies beim OnCreate-Ereignis im Datamodul tue, ist ja das Login-Formular noch gar nicht initialisiert -> Zugriffsverletzung...

Wäre schön, wenn hier jemand diese (sicher schon oft gestellte) Frage umfassend beantworten könnte :)...

Gruß und danke,
FraGiLe

sx2008 29. Dez 2008 15:20

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Im Event OnWillConnect der ADOConnection kann man bequem User und Passwort zuweisen.

fragile 29. Dez 2008 15:41

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Den DB-User und das Passwort kann ich ja beim Klicken des "OK"-Buttons im Login-Formular übergeben,
mir gehts um die Platzierung des Formulars beim Startablauf der Anwendung.

Mein Code im Datamodul :

Delphi-Quellcode:
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  Application.CreateForm(TfrmLogin, frmLogin);
  frmLogin.ShowModal;
... und im Login-Formular:

Delphi-Quellcode:
procedure TfrmLogin.BitBtnOKClick(Sender: TObject);
begin

  gUser.Name    := edUserName.Text;
  gUser.Password := edPassword.Text;

  try
    DataModule1.DBConnect_SV2.Open(gUser.Name, gUser.Password);
  except
    on Exception do
       begin
            ShowMessage('Eingabe fehlerhaft !');
            Update;
       end;
  end;

Ich kreiere jetzt das Login-Form manuell über Application.CreateForm, nur klappt da das Exception-Handling nicht...

alzaimar 29. Dez 2008 15:50

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Wieso nicht im 'OnWillConnect'?

fragile 30. Dez 2008 07:34

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Das löst ja nicht mein Initalisierungsproblem.
Ich kann auch in OnWillConnect mit frmLogin.ShowModal mein Loginformular aufrufen, dann bringt er eine Zugriffsverletzung, da das Formular ja noch gar nicht kreiert wurde.

Das OnWillConnect wird das erste mal aufgerufen, wenn ich die DataSources aktiviere, also im OnShow-Event des Hauptformulars...

alzaimar 30. Dez 2008 07:50

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Dann erstelle dir doch dein Formular, wenn Du es brauchst. Ich mache das immer so:
Delphi-Quellcode:
Type
  TfmLogin = Class (TForm)
   ...
  ...
  Public
     Class Function Execute(Var aUser, aPasswd : String) : TModal;
  End;


Implementation
Function TfmLogin.Execute (Var aUser, aPasswd : String) : TModal;
Begin
  With TfmLogin.Create(Nil) Do Begin
    Result := ShowModal;
    If Result = mrOK Then Begin
       aUser := edUser.Text;
       aPassWd := edPassWd.Text;
    End;
    Release
  End
End;
...
Und irgendwo im Code (z.B. im 'OnWillConnect'):
Delphi-Quellcode:
...
  If TfmLogin.Execute (sUser, sPassWd) = mrOk Then
     TDatabaseModule.Login (sUser, sPassWd) // Oder einfach User/Passwd setzen...
  Else
     Raise Exception.Create ('Anmeldung abgebrochen')
Lass Dir die Formulare nicht am Begin des Programms erzeugen, das ist doch unnötig. Na ja, ein Hauptformular darfs schon sein. Erzeuge deine Formulare immer dann, wenn Du sie brauchst, z.B. mit meiner oben beschriebenen Methode.

fragile 30. Dez 2008 07:56

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Du fügst also deinen Formularen eine Execute-Methode zu, die du dann zur Laufzeit aufrufst ? Der Typ "TModal" sagt mir leider gar nix, die Hilfe schweigt auch dazu ;)...

Edit: Hab ihn jetzt in TModalResult geändert und die Execute-Funktion ein bisserl anders in frmLogin eingführt, jetzt klappt es , danke für den Alternativweg :D

haentschman 30. Dez 2008 08:24

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Guten Morgen...
Zitat:

DataModul
<Hauptformular>
<weitere Formulare inkl. DB-Login Formular>
Zitat:

- Ich möchte die Erstellungsreihnefolge nicht ändern, sprich das bisherige Hauptformular soll auch bleiben. Wenn ich aber im Hauptformular bspw. im OnShow-Ereignis die Connection aufmache bzw. dies beim OnCreate-Ereignis im Datamodul tue, ist ja das Login-Formular noch gar nicht initialisiert -> Zugriffsverletzung...
also...
- im OnCreate des Datamoduls ist dein DBLogin Formular noch nicht erzeugt, im OnShow des Hauptformulars schon...
- d.h. du könntest im OnShow des Hauptformulars durchaus dein Login Formular anzeigen.
- zeigst du dein Login Formular im OnShow des Hauptformulars an ist dein Hauptformular noch nicht sichtbar.
- möchtest du, daß dein Login über dem sichtbaren Hauptformular liegt, mußt du dir ein eigenes "AfterOnShow" kreieren
Delphi-Quellcode:
const
  WM_FERTIG = WM_USER + 100;

private
    procedure AfterOnShow(var Msg: TMessage); Message WM_FERTIG;
end;

procedure TForm.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_FERTIG, 0, 0);
end;

procedure TForm.AfterOnShow(var Msg: TMessage);
begin
  // hier z.B. FLogin.ShowModal;
end;
:hi:

fragile 30. Dez 2008 10:17

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Zitat:

im OnCreate des Datamoduls ist dein DBLogin Formular noch nicht erzeugt, im OnShow des Hauptformulars schon...
Als ich das LoginFormular aus dem OnShow des Hauptformulars aufgerufen habe, gabs eine Zugriffsverletzung...deshalb nehme ich an, daß das Loginformular noch nicht erzeugt wurde...

haentschman 30. Dez 2008 10:44

Re: Beste "Stelle" für eigenen Login-Prompt bei AD
 
Zitat:

DataModul
<Hauptformular>
<weitere Formulare inkl. DB-Login Formular>
...wenn die Reihenfolge der Erzeugung der Formulare wie oben ist dann schon. Dann hat die Zugriffsverletzung vieleicht eine andere Ursache.

die Reihenfolge beim Start eines Programmes ist wie folgt: (vereinfacht :wink: )

- jedes Formular wird in der Reihenfolge erzeugt.
- OnCreate jedes Formulars wird ausgeführt
- OnShow des Hauptformulars wird ausgelöst (damit u.a. OnActivate etc.)

...bedeutet das dein Formular bzw. alle Formulare bereits erzeugt sind. Schaue mal im Quelltext der Anwendung ob die Reihenfolge überhaupt so stimmt. Eventuell manuell verändern.

Beispiel (Auszug):
Delphi-Quellcode:
begin
  Splash := TSplash.Create(Application);
  try
    Splash.Show;
    Splash.Refresh;
  Application.Initialize;
  Application.Title := 'bla,bla,bla';
  Application.CreateForm(TDMallgemein, DMallgemein);
  {0}
  Application.CreateForm(TDMINI, DMINI);
  Application.CreateForm(TFMain, FMain);
FMain ist mein Hauptformular. Die 2 Datamodule werden vor dem Hauptformular erzeugt.

PS: beim Hinzufügen eines neuen Formulares, kann es vorkommen, daß die Reihenfolge sich ändert.

:hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.

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