AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

LoginFormular etwas anders

Ein Thema von sunnyandy · begonnen am 25. Okt 2006 · letzter Beitrag vom 26. Okt 2006
Antwort Antwort
sunnyandy

Registriert seit: 24. Feb 2006
49 Beiträge
 
#1

LoginFormular etwas anders

  Alt 25. Okt 2006, 23:46
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*
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 00:11
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
sunnyandy

Registriert seit: 24. Feb 2006
49 Beiträge
 
#3

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 00:14
Danke, aber ich habe gar keine Datamodule, habe die ganze Applikation ohne erstellt...
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 00:29
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 ? Aber bei Forms/Datamodules ist es schon besser, die nach Bedarf zu erzeugen und nicht automatisch.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 08:42
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
Frank Reim
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 10:46
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
sunnyandy

Registriert seit: 24. Feb 2006
49 Beiträge
 
#7

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 11:37
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!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 11:43
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.
Markus Kinzler
  Mit Zitat antworten Zitat
sunnyandy

Registriert seit: 24. Feb 2006
49 Beiträge
 
#9

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 12:04
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!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10

Re: LoginFormular etwas anders

  Alt 26. Okt 2006, 12:42
Er frägt ja nach einem Vorteil von den Dingern. Aber nur zwei Komponenten ? 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 ? 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. 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 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