AGB  ·  Datenschutz  ·  Impressum  







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

Login für DB in DPR - Datei

Ein Thema von dataspider · begonnen am 19. Jan 2006 · letzter Beitrag vom 20. Jan 2006
Antwort Antwort
Benutzerbild von dataspider
dataspider

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

Login für DB in DPR - Datei

  Alt 19. Jan 2006, 18:49
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
Frank Reim
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Login für DB in DPR - Datei

  Alt 19. Jan 2006, 18:58
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
  Mit Zitat antworten Zitat
Hansa

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

Re: Login für DB in DPR - Datei

  Alt 19. Jan 2006, 19:42
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Login für DB in DPR - Datei

  Alt 19. Jan 2006, 19:54
Zitat von Hansa:
HALT = Holzhammer.
Stimmt - besser ist Exit.

marabu
  Mit Zitat antworten Zitat
Hansa

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

Re: Login für DB in DPR - Datei

  Alt 19. Jan 2006, 20:20
Das kleinste Hämmerchen 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.
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
 
#6

Re: Login für DB in DPR - Datei

  Alt 20. Jan 2006, 08:56
@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
Frank Reim
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#7

Re: Login für DB in DPR - Datei

  Alt 20. Jan 2006, 09:13
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
  CoInitialize(nil); aufgerufen.

das ist das was ich auf die schnelle rausfinden konnte.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

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

Re: Login für DB in DPR - Datei

  Alt 20. Jan 2006, 09:21
@generic

habe Application.Initialize wieder vor das Login gesetzt.

Danke, Frank
Frank Reim
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Login für DB in DPR - Datei

  Alt 20. Jan 2006, 13:32
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
  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 19:55 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