Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi LoginFormular etwas anders (https://www.delphipraxis.net/79647-loginformular-etwas-anders.html)

sunnyandy 25. Okt 2006 23:46


LoginFormular etwas anders
 
Hallo!

Habe mir folgendermaßen ein LoginFormular gebastelt:

Delphi-Quellcode:
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;
Das Problem dabei ist jetzt, dass ich mich bereits in frmLoginView mit der Datenbank verbinden will und somit das Passwort überprüfe.
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:

Hansa 26. Okt 2006 00:11

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.

sunnyandy 26. Okt 2006 00:14

Re: LoginFormular etwas anders
 
Danke, aber ich habe gar keine Datamodule, habe die ganze Applikation ohne erstellt...

Hansa 26. Okt 2006 00:29

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.

dataspider 26. Okt 2006 08:42

Re: LoginFormular etwas anders
 
Zitat:

Zitat von sunnyandy
Aber frmMain ist noch gar nicht erstellt, also kann ich noch nicht auf die Komponenten zugreifen.
Was mache ich nun?

Alles, wass für die Verbindung mit der DB zu tun hat, hat im MainForm nichts verloren.
Entweder in eien eigenen DataModule (wie schon beschrieben) oder eine separate Unit mit einer eigenen Klasse.

Cu, Frank

Hansa 26. Okt 2006 10:46

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.

sunnyandy 26. Okt 2006 11:37

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!

mkinzler 26. Okt 2006 11:43

Re: LoginFormular etwas anders
 
Zitat:

Ist es dann trotzdem noch sinnvoll, eine Datamodule anzulegen?
Ja, den es könnten ja noch mehr hinzukommen.
Zitat:

Habe damit noch nie gearbeitet, worin liegt denn der Vorteil?
Man kann alles DB-spezifische hierin bündeln.

sunnyandy 26. Okt 2006 12:04

Re: LoginFormular etwas anders
 
Ich habe es jetzt so gelöst:

Delphi-Quellcode:
  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;
Somit kann ich vom LoginView auf alle anderen Fenster zugreifen. Im OnClose-Ereignis vom LoginView wird das Fenster auf nil gesetzt.
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!

Hansa 26. Okt 2006 12:42

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:
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;
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.

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 10:07 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