![]() |
LoginFormular etwas anders
Hallo!
Habe mir folgendermaßen ein LoginFormular gebastelt:
Delphi-Quellcode:
Das Problem dabei ist jetzt, dass ich mich bereits in frmLoginView mit der Datenbank verbinden will und somit das Passwort überprüfe.
frmLoginView := TfrmLoginView.Create(Application);
Application.Initialize; frmLoginView.ShowModal; if LoginPassed then begin Application.CreateForm(TfrmMain, frmMain); Application.CreateForm(TfrmSearchVP, frmSearchVP); Application.CreateForm(TfrmPrintProvision, frmPrintProvision); Application.CreateForm(TfrmGutschrift, frmGutschrift); Application.Run; end else Application.Terminate; Aber frmMain ist noch gar nicht erstellt, also kann ich noch nicht auf die Komponenten zugreifen. Was mache ich nun? Habe schon versucht, das CreateForm von frmMain hin und her zu schieben, aber das klappt alles nicht... frmMain soll ja hinterher sozusagen das Hauptfenster sein! Vielen Dank schonmal und gute Nacht *g* :shock: |
Re: LoginFormular etwas anders
Du hast was wichtiges übersehen. Vereinfacht gesagt, bindet der Linker die DCUs zusammen und erzeugt so eine EXE. Die Reihenfolge ist da wichtig, weil die Constructoren in der Reihenfolge durchlaufen werden, wie sie in der USES-Liste drinstehen. Bei mir steht deshalb das Datamodule vorne in der uses-Liste. Das gilt auch für die DPR. Habe mal gerade nachgeguckt : es sind 3 DataModules und erst dann wird die erste Form aufgerufen, bzw. created.
|
Re: LoginFormular etwas anders
Danke, aber ich habe gar keine Datamodule, habe die ganze Applikation ohne erstellt...
|
Re: LoginFormular etwas anders
Dann überdenke mal die ganze Konstruktion. Bei mir gibts natürlich ein Datamodule. Und in dessen OnCreate wird aus einer INI-Datei der genaue Pfad zur DB gelesen. Kann eben nicht wissen, wo der User die DB hininstalliert hat. Ein DataModule ist ja quasi auch eine Form. Und die wird eben zuerst erzeugt und das wars. Bin nicht unberdingt ein Freund von dynamisch erzeugten Geschichten. Jeden Button einzeln anlegen ? :shock: Aber bei Forms/Datamodules ist es schon besser, die nach Bedarf zu erzeugen und nicht automatisch.
|
Re: LoginFormular etwas anders
Zitat:
Entweder in eien eigenen DataModule (wie schon beschrieben) oder eine separate Unit mit einer eigenen Klasse. Cu, Frank |
Re: LoginFormular etwas anders
Er soll ein DataModule verwenden und fertig. Dafür ist das schließlich da. Wichtig ist jedenfalls vor allem, dass dieses VOR jeglichem Form erzeugt wird, das eventuell auf die DB zugreift ! Hierbei gilt es, auch die DPR mal anzusehen. Wenn er jetzt erst ein Datamodule anlegt, dann wird Delphi das Application.CreateForm dafür nämlich automatisch hinter das der MainForm schieben, obwohl es davor hingehört.
|
Re: LoginFormular etwas anders
Hallo,
also ich habe fast nur zwei Datenbankkomponenten und das sind einmal die ZConnection und ZDBQuery von Zeos. Ist es dann trotzdem noch sinnvoll, eine Datamodule anzulegen? Habe damit noch nie gearbeitet, worin liegt denn der Vorteil? Grüße! |
Re: LoginFormular etwas anders
Zitat:
Zitat:
|
Re: LoginFormular etwas anders
Ich habe es jetzt so gelöst:
Delphi-Quellcode:
Somit kann ich vom LoginView auf alle anderen Fenster zugreifen. Im OnClose-Ereignis vom LoginView wird das Fenster auf nil gesetzt.
frmLoginView := TfrmLoginView.Create(Application);
frmLoginView.Show; Application.Initialize; Application.CreateForm(TfrmMain, frmMain); Application.CreateForm(TfrmSearchVP, frmSearchVP); Application.CreateForm(TfrmPrintProvision, frmPrintProvision); Application.CreateForm(TfrmGutschrift, frmGutschrift); while frmLoginView <> nil do Application.ProcessMessages; if LoginPassed then Application.Run else begin //frmLoginView.Free; Application.Terminate; end; Das Anzeigen des Hauptformulars klappt nun wunderbar, aber wenn ich im LoginView auf Cancel klicke und somit LoginPassed = False ist, sollte er das ganze ja schließen, aber da gibt es eine "Access Violation" Fehlermeldung. Wie schließe ich die Anwendung nun richtig? Viele Grüße und danke schonmal! |
Re: LoginFormular etwas anders
Er frägt ja nach einem Vorteil von den Dingern. Aber nur zwei Komponenten ? :shock: Wie geht das denn ?? Minimal wäre wohl eine TDataBase, TTransaction und TDataSet, also mindestens drei. Jetzt kommen da noch irgendwann stored procedures ins Spiel. Sollen die jetzt auch noch irgendwo auf einem Formular rumliegen ? Nach dem Motto : wo sind sie denn ? :mrgreen: Bei mir sind es, wie gesagt 3 DataModules und zwar aus 2 Gründen : Übersichtlichkeit. Da hängt ja auch noch Source-Code dahinter und bei 1000 Zeilen pro Unit fange ich langsam an, die Reißleine zu ziehen. Zudem werden die Daten für 2 nicht ganz gleiche Programme gebraucht. Die für beide Programme benötigten Datasets, DataSources usw. liegen zentral in einem DataModule. Database und Read/Write-Transaction braucht man auch nur einmal. Das größere Programm braucht allerdings noch mehr und erhält deshalb zusätzlich ein eigenes DataModule. Das dritte brauche ich für SPs. Es sind Überlegungen im Gange, dieses auch aufzuspalten. Das wurden nämlich mehr als vermutet und auch in dem Bereich werden nicht alle SPs überall gleichzeitig gebraucht. Na und ? Dann sinds eben 4 Datenmodule. Soviel erstmal zu den DataModules, wozu die gut sind. Aber nur hauptsächlich gut sind !
Der zweite Grund, bzw. Vorteil hat sich eigentlich erst im Nachhinein herausgestellt. Da gehts um das Anmelden an der Datenbank und somit um die Frage an sich. Weiß jetzt nicht mehr genau, aber da gabs auch hier komische Effekte. Die klärten sich aber rasch auf durch die Reihenfolge der Erzeugung der Forms. Lagere ich nun alles in Datenmodule aus, dann kann ich die separat erzeugen (DPR beachten !) und dann erst die erste Form und die darf ruhig dann auch auf Daten zugreifen. Hier könnte man leicht einen Login-Dialog einbauen :
Delphi-Quellcode:
Da gehts jetzt mehr oder weniger nur darum, den Db-Ort aus einer INI zu lesen, aber genau an der Stelle würde ich ansetzen für Login.
procedure TDM.DataModuleCreate(Sender: TObject);
var Ini : TIniFile; begin Ini := TIniFile.Create (ExtractFilePath (ParamStr (0)) + 'DB.INI'); if not CDStart then DatenBankName := Ini.ReadString('Datenbank','Name',ExtractFilePath (ParamStr (0))+'db\db.fdb') else // falls INI nicht vorh. usw. ^^ DatenBankName := ExtractFilePath (ParamStr (0)+'db\db.fdb'); end; Aahhhh, roter Kasten. Habe zuviel und langsam getippt. :zwinker: Access Violation. Warum wohl ? Beherzige besser meine Tips. Das sind genau die angesprochenen Effekte. Da wird was zu spät erzeugt bzw. zu früh drauf zugegriffen und es ist nicht glech zu sehen warum. Erzeuge das Datamodul und dann erst die erste Form und fertig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 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