![]() |
Verbindung zur DB bei Programmstart
Hi,
Ich hab ein kleines logisches Problem: Ich hab eine Datenbankanwendung mit ner MySQL-DB. Zu Begin werden die Verbindungsdaten (Host, User, Passwort...) aus ner config.ini ausgelesen und in die Connection eingetragen bevor diese geöffnet wird. Anschließend werden die Tabellen verbunden und diverse Abfragen ausgeführt. Das alles passiert im OnShow-Ereignis des Hauptformulars. So weit so gut. Wenn jetzt allerdings irgend ein Eintrag in der config.ini nicht stimmt (Passwort etc.) kann das alles ja nun nicht passieren. Ich werd mit Fehlern zugebombt und das Hauptformular steht letztendlich nutzlos mit leeren dbedits und Grids da. Ich hab das natürlich mit try except abgefangen aber das ändert nix an der Tatsache, das das Form im Fehlerfall trotzdem nutzlos liegen bleibt. Sinnig wäre es also, wenn bei einem Fehler statt dem Hauptform ein anderes Form erscheint, in dem ich die Verbindungsdaten korrigieren kann. Problem ist aber dass das Hauptform in jedem Fall angezeigt wird, wenn ich das Verbindungsformular im Except-Bereich aufrufe. Ich hab jetzt also das Verbindungsformular als Hauptformular eingerichtet in der Hoffnung, ich kann es im OnShow-Ereignis wenn kein Fehler auftritt ausblenden, so dass es im Normalfall nicht zu sehen ist. Geht ja aber nicht. Wie kann ich das denn gescheit lösen, ohne dass der Nutzer nochmal irgendeinen Button klicken muss? Ich hoffe irgendjemand kann mir folgen :stupid: |
Re: Verbindung zur DB bei Programmstart
Versuchs mal im onCreate, onShow ist sowiso schlecht, da es u.U. öfters aufgerufen wird.
|
Re: Verbindung zur DB bei Programmstart
@mkinzler
Bei Form.create funzt die Startprozedur überhaupt nicht. Da bekomm ich ne Zugriffsverletzung. |
Re: Verbindung zur DB bei Programmstart
Hier mal der Code:
Delphi-Quellcode:
procedure Tfrmconnect.FormShow(Sender: TObject);
var config: tinifile; i:integer; begin config:= tinifile.Create(extractfilepath(paramstr (0))+'config.ini'); try try //Auslesen der Verbindungsdaten aus config.ini with frmdata.SQLConnect do begin HostName:= config.ReadString('DB-Server','host',''); user:= frmmain.cipher.EncodeString('xxxxx,config.ReadString('DB-Server','user','')); password:= frmmain.cipher.EncodeString('xxxxx',config.ReadString('DB-Server','passwort','')); port:= strtoint(config.ReadString('DB-Server','port','0')); //Verbinden zur DB connect; end; //Öffnen der Tabellen und queries with frmdata do begin tbauftrag.Open; tbstatus.Open; tbgeraete.Open; tbartikel.Open; tbstatistik.Open; tblager.Open; tbmessage.Open; qutechniker.Open; //Nachrichtenempfänger in Message ComboBox eintragen frmsendmessage.cmbempfaenger.Items.Clear; for i:= 1 to qutechniker.recordcount do begin frmsendmessage.cmbempfaenger.Items.Append(qutechniker.fieldbyname('kurz').asstring); qutechniker.Next; end; frmsendmessage.cmbempfaenger.ItemIndex:=0; //Erstellen der Abfrage zum Füllen des DBGrids with quauftrag do begin SQL.Clear; sql.Add('SELECT * FROM auftrag LEFT OUTER JOIN geraete ON auftrag.geraet = geraete.geraeteid WHERE auftrag.techniker ="'+config.ReadString('Grundeinstellungen','Technikernummer','0')+'";'); open; //Suchen des zuletzt geöffneten Auftrages im Query if locate('nummer',config.ReadString('Start','LastOpen',''),[locaseinsensitive])= true then //Pointer setzen tbauftrag.Locate('auftragid',quauftrag.fieldbyname('auftragid').AsInteger,[locaseinsensitive]) else begin last; tbauftrag.Locate('auftragid',quauftrag.fieldbyname('auftragid').AsInteger,[locaseinsensitive]); end; end; with qucountauftrag do begin sql.Clear; sql.Add('SELECT COUNT(auftragid) FROM auftrag WHERE techniker ="'+config.ReadString('Grundeinstellungen','Technikernummer','0')+'";'); open; frmmain.sbmain.Panels[0].Text:=inttostr(qucountauftrag.fieldbyname('count(auftragid)').AsInteger)+ ' Datensätze'; end; end; frmmain.Show; except showmessage('Fehler beim Verbinden mit der Datenbank'); edhost.SetFocus; end; try edhost.Text:=config.readstring('DB-Server','Host',''); eduser.Text:=config.readstring('DB-Server','User',''); edpasswort.Text:=frmmain.cipher.EncodeString('xxxxxx',config.ReadString('DB-Server','passwort','')); edport.Text:=config.readstring('DB-Server','Port',''); except edhost.SetFocus; end; finally config.Free; end; end; |
Re: Verbindung zur DB bei Programmstart
Ich gehe immer ähnlich vor. Ich verwende aber eine TDataModule.Klasse und mache alles im datModuleCreate-Event.
Delphi-Quellcode:
procedure TDaten.DataModuleCreate(Sender: TObject);
var ini: TIniFile; adress, path, dbfile, user, pass: string; begin ini := TIniFile.Create('.\aktien.ini'); try adress := ini.ReadString('server', 'adress', '127.0.0.1'); path := ini.ReadString('server', 'path', ''); dbfile := ini.ReadString('server', 'db', 'Daten.fdb'); user := ini.ReadString('server', 'user', 'SYSDBA'); pass := Daten.Lb3DES1.DecryptString( ini.ReadString('server', 'pass', Daten.Lb3DES1.EncryptString('masterkey'))); finally ini.Free; end; |
Re: Verbindung zur DB bei Programmstart
Gute Idee, ich verwende ja auch ein TDatamodule - da muss man erstmal drauf kommen :roll:
werd das morgen mal versuchen, heute schaff ich das nicht mehr. Danke vorerst mal |
Re: Verbindung zur DB bei Programmstart
Moin,
ich hab das jetzt probiert und nur die Datenbankverbindung im OnCreate-Event des Datamodules.
Delphi-Quellcode:
Dummerweise ändert das ja aber nix an der Tatsache, das das Hauptform trotzdem geöffnet wird wenn ein Fehler auftritt und ich dann schön im Rhytmus meines Timers, der ne Abfrage macht, Fehlermeldungen bekomme und die DBEdits sinnlos rumliegen.
procedure Tfrmdata.DataModuleCreate(Sender: TObject);
var config: tinifile; i: integer; begin config:= tinifile.Create(extractfilepath(paramstr (0))+'config.ini'); try try with SQLConnect do begin HostName:= config.ReadString('DB-Server','host',''); user:= config.ReadString('DB-Server','user',''); password:= config.ReadString('DB-Server','passwort',''); port:= strtoint(config.ReadString('DB-Server','port','0')); connect; end; tbauftrag.Open; tbstatus.Open; tbgeraete.Open; tbartikel.Open; tbstatistik.Open; tblager.Open; tbmessage.Open; qutechniker.Open; except showmessage('Fehler beim Verbinden mit der Datenbank'); frmconnect.showmodal; end; finally config.free; end; end; Ich hab den Eindruck, ich muss mir noch sowas wie nen Splashscreen basteln, der dann als MainForm herhalten muss. Dann ruf ich das bisherige MainForm mit im OnCreate des Datamodules auf. Kann man das nicht irgendwie besser lösen? :gruebel: |
Re: Verbindung zur DB bei Programmstart
Der Programmfluss eines Delphi-Programmes ist nunmal:
Delphi-Quellcode:
Entweder Du änderst den Projektquellcode, oder Du verwendest eine andere Mainform (deine Idee). Den Projektquellcode würde ich nicht ändern (Geschmackssache). Ich verwende einen Login-Dialog als Hauptformular. Es wird also zuerst das Datenmodul und dann der Logindialog instantiiert. Anschließend wird per Application.Run der Logindialog aufgerufen. Nach Drücken des Login-Buttons wird die Verbindung aufgebaut und der User geprüft. Geht hier etwas schief, habe ich eine saubere Möglichkeit, darauf zu reagiern. Funktioniert das Login, Erzeuge ich eine Instanz des eigentlichen Hauptformulars und zeige das per Showmodal an.
Application.Initialize;
Application.CreateForm (TMyForm, MyForm); ... Application.Run; Vorteil: Ich kann diesen Dialog für ALLE meine DB-Projekte verwenden und habe so eine einheitliches Look & Feel. In Deinem Fall würde ich das genauso machen. |
Re: Verbindung zur DB bei Programmstart
hab's jetzt mit nem splashscreen gelöst.
kann man gelten lassen denk ich. Danke erstmal an alle. |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Tutorials und Kurse" nach "Datenbanken" verschoben.
Das ist kein Tutorial. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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