Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Login für DB in DPR - Datei (https://www.delphipraxis.net/61310-login-fuer-db-dpr-datei.html)

dataspider 19. Jan 2006 18:49


Login für DB in DPR - Datei
 
Hi,

ich möchte mein MainForm nur anzeigen, wenn die Anmeldung an der Datenbank erfolgte.
Bei fehlerhafter Anmeldung soll die Anwendung beendet werden.
Jetzt bin ich auf der Suche nach der optimalen Stelle für das Login.

Ich habe es erst mal in die Projektdatei wie folgt geschrieben:

Delphi-Quellcode:
begin
  Application.Initialize;
  if Login then
  begin
    Application.CreateForm(TMainForm, MainForm);
  end;
  Application.Run;
end.
Login sieht dann etwa so aus:
Delphi-Quellcode:
function Login: Boolean;
Var
  f: TLoginForm;
begin
  f := TLoginForm.Create(Application);
  Result := (f.ShowModal = mrOK);
  if not Result then
    Application.Terminate;
end;
Ist die Lösung sauber? Ich bin mir nicht ganz sicher...

Gruß, Frank

marabu 19. Jan 2006 18:58

Re: Login für DB in DPR - Datei
 
Hi Frank,

probiere doch mal so:

Delphi-Quellcode:
begin
  if not Login then Exit; // Halt;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

// ...

function Login: Boolean;
var
  f: TLoginForm;
begin
  Result := true;
  with TLoginForm.Create(nil) do
  if ShowModal = mrOK
    then Free
    else Result := false;
end;
Hat zumindest den Vorteil, dass du der IDE beim modifizieren des Projekt-Quelltextes nicht dazwischen funkst.

Grüße vom marabu

Hansa 19. Jan 2006 19:42

Re: Login für DB in DPR - Datei
 
HALT = Holzhammer. Sehr gefährlich und sollte auch nur sehr dosiert eingesetzt werden ! Vor allem aber für diesen Zweck unnötig. Benutze ein DataModule und erzeuge das VOR allen Formularen. Platziere das Login in das Create des Datamoduls und sorge dafür, daß das Teil tatsächlich zuallererst erzeugt wird :

Delphi-Quellcode:
  Application.Initialize;
  Application.Title := '';
  Application.CreateForm(TDM, DM);
--> hier notfalls eingreifen
  Application.CreateForm(TfrmMenue, frmMenue);
...
Bei mir steht z.B. folgendes im DataModule Create :

Delphi-Quellcode:
procedure TDM.DataModuleCreate(Sender: TObject);
var Ini : TIniFile;
begin
  Ini := TIniFile.Create (ExtractFilePath (ParamStr (0)) + 'DB.INI');;
  if not CDStart then
    DBName := Ini.ReadString('Datenbank-Ort','DBName',ExtractFilePath (ParamStr (0))+'db\db.fdb')
  else
    DBName := ExtractFilePath (ParamStr (0)+'db\db.fdb');
  DM.DataBase.Close;
  DM.DataBase.DatabaseName := DBName;
  DM.DataBase.Open;
  DM.Transaction.Active := true;
  Ini.free;
end;
Da gehts jetzt nur um den Ort der DB (aus INI). Mit geringem Aufwand läßt sich da auch ein fehlerhaftes Login abfangen. Bei Start von CD ist hierbei der Ort genau definiert und das wars.

marabu 19. Jan 2006 19:54

Re: Login für DB in DPR - Datei
 
Zitat:

Zitat von Hansa
HALT = Holzhammer.

Stimmt - besser ist Exit.

marabu

Hansa 19. Jan 2006 20:20

Re: Login für DB in DPR - Datei
 
Das kleinste Hämmerchen :mrgreen: ist eine globale Variable, die er im DataModule.Create setzt und bei Erfolg die anderen Forms gar nicht erst erzeugt / öffnet. Bestimmt gibts da für datenmodule eigene Methoden, fallen mir aber jetzt nicht ein. 8) Application.Run fällt auch weg und fertig. Den Rest macht Delphi. Wie gesagt : wichtig ist, das Datamodule zuerst zu erzeugen/auszuwerten, um Quereffekte zu vermeiden. Wird z.B. auf einer automatisch erzeugten Form ein im OI auf active gesetzes DataSet verwendet, dann krachts an allen Enden ! Dann hilft auch kein Exit mehr.

dataspider 20. Jan 2006 08:56

Re: Login für DB in DPR - Datei
 
@marabu und Hansa

Danke für die Anregungen und Hilfe, ich habe es jetzt - denke ich - sauber gelöst.

@marabu
Habe deinen Vorschlag befolgt und auf Exit umgestellt.

Delphi-Quellcode:
  ...
  MemCheckLogFileName := 'mc.log';
  MemChk;
  if not Login then
    Exit;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
Die IDE funkt jetzt tatsächlich nicht mehr dazwischen.
Mit dem Begin end - Block hat er mir immerhin meinen Einzug zurückgesetzt.
Ich habe mit dem Debugger überprüft, dass alle initialization und finalization ausgeführt werden und MemCheck gibt sich auch zufrieden.

Eines verstehe ich noch nicht. Ich dachte, dass Application.Initialize; die Anwendung veranlasst, die initialization section's auszuführen.
Es spielt aber keine Rolle, ob ich mein Login vor oder nach dem Application.Initialize; platziere.
initialization und finalization werden immer ausgeführt.

Ich habe übrigens auch das Application.Terminate; aus der function Login entfernt. Das braucht man nicht.

Gruß, Frank

generic 20. Jan 2006 09:13

Re: Login für DB in DPR - Datei
 
Delphi-Quellcode:
Application.Initialize;
das wegzulassen halte ich keine gute idee,
wenn ihr z.b. DB oder Com einsetzt könnte das zu schwierigkeiten führen.

denn in der oleauto.pas/ComServ.pas/ComObj.pas/SockApp.pas/WebBroker.pas wird die initproc gesetzt.
die initproc wird dann von Application.Initialize aufgerufen.

in der dbtables wird auch zur initialisierung die initproc gesetzt.
hier wird allerdings nur
Delphi-Quellcode:
  CoInitialize(nil);
aufgerufen.

das ist das was ich auf die schnelle rausfinden konnte.

dataspider 20. Jan 2006 09:21

Re: Login für DB in DPR - Datei
 
@generic

habe Application.Initialize wieder vor das Login gesetzt.

Danke, Frank

marabu 20. Jan 2006 13:32

Re: Login für DB in DPR - Datei
 
Es gibt wie immer viele Wege zum Ziel. Der Initialisierungscode (initialization bzw. unit-block) wird beim Aktivieren einer Unit in der Reihenfolge der Einbindung ausgeführt und hat nichts mit der InitProc chain zu tun, die unter Kontrolle der Anwendung ausgeführt wird.

In der Regel weiß ich sehr gut, was mein Code wann macht. Wenn mein Login-Dialog auf Ressourcen der Anwendung zugreift, die vorher bereit gestellt werden müssen, dann kann ich ihn eventuell nicht - wie in meinem Beispiel- aus der Application heraus halten. Ist die Application aber erstmal mit im Boot, dann kann ich nicht mehr einfach mit Exit beenden, sondern muss Application.Terminate verwenden.

Wie man es macht ist letztlich eine Frage der individuell vorliegenden Situation. Wichtig ist nur, dass man es konsistent handhabt.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 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