![]() |
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:
Login sieht dann etwa so aus:
begin
Application.Initialize; if Login then begin Application.CreateForm(TMainForm, MainForm); end; Application.Run; end.
Delphi-Quellcode:
Ist die Lösung sauber? Ich bin mir nicht ganz sicher...
function Login: Boolean;
Var f: TLoginForm; begin f := TLoginForm.Create(Application); Result := (f.ShowModal = mrOK); if not Result then Application.Terminate; end; Gruß, Frank |
Re: Login für DB in DPR - Datei
Hi Frank,
probiere doch mal so:
Delphi-Quellcode:
Hat zumindest den Vorteil, dass du der IDE beim modifizieren des Projekt-Quelltextes nicht dazwischen funkst.
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; Grüße vom marabu |
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:
Bei mir steht z.B. folgendes im DataModule Create :
Application.Initialize;
Application.Title := ''; Application.CreateForm(TDM, DM); --> hier notfalls eingreifen Application.CreateForm(TfrmMenue, frmMenue); ...
Delphi-Quellcode:
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.
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; |
Re: Login für DB in DPR - Datei
Zitat:
marabu |
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.
|
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:
Die IDE funkt jetzt tatsächlich nicht mehr dazwischen.
...
MemCheckLogFileName := 'mc.log'; MemChk; if not Login then Exit; Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.Run; 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 |
Re: Login für DB in DPR - Datei
Delphi-Quellcode:
das wegzulassen halte ich keine gute idee,
Application.Initialize;
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:
aufgerufen.
CoInitialize(nil);
das ist das was ich auf die schnelle rausfinden konnte. |
Re: Login für DB in DPR - Datei
@generic
habe Application.Initialize wieder vor das Login gesetzt. Danke, Frank |
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 06:00 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