Entwickler-Ecke
Datenbanken - Mehrere Instanzen eines Datenmodules
UGrohne - Fr 06.02.04 12:47
Titel: Mehrere Instanzen eines Datenmodules
Auf der Borland Roadshow wurde mit Delphi 7 eine dbExpress-Anwendung erstellt, die mehrere Instanzen einer Kundentabelle erzeugen konnte.
Hab mal was ähnliches versucht, aber ich weiß nicht mehr, wie die das gemacht haben, dass bei mehreren Instanzen eines Datenmoduls ein neuer Datensatzzeiger verwendet wird. Das ging einfach zu schnell ... :cry:
Moderiert von
UGrohne: Beiträge geteilt
sakura - Fr 06.02.04 13:48
UGrohne hat folgendes geschrieben: |
dass bei mehreren Instanzen eines Datenmoduls ein neuer Datensatzzeiger verwendet wird. Das ging einfach zu schnell ... :cry: |
Das war ganz einfach. Im OnCreate Ereignis des MDI.Child wurde einfach eine neue Instanz des DatenModuls erstellt.
Delphi-Quelltext
1:
| FDatenModul := TDatenModu.Create(self); |
Also keine Zauberei ;-)
:welcome:
UGrohne - Fr 06.02.04 14:00
Hmm, das hab ich bei mir gemacht, nur eben nicht mit einem property, sondern mit einer Variablen vom Typ des Datenmoduls. Aber das dürfte doch eigentlich auch funktionieren?
UGrohne - Fr 06.02.04 19:52
OK, nochmal eine ausführliche Erklärung, da ich diese Postings aus einer anderen Diskussion getrennt habe:
Ich habe eine mdi-Anwendung. Dort jetzt erstmal eine DataModule für die DB-Verbindung über DBExpress. Ein Formular, das Daten aus einer Tabelle anzeigen soll, wird dynamisch erzeugt. Darin befindet sich eine Variable vom Typ eines weiteren DataModules, das das Query beinhaltet. Nach dem Erzeugen setze ich die Quell-Eigenschaften des Queries und verbinde es mit dem DBGrid. Das funktioniert soweit auch, doch sobald ich das Fenster (inkl. dem Datenmodul) dann ein zweites Mal erzeuge, habe ich den gleichen Datensatzzeiger in beiden Queries, d.h. wenn ich im einen Fenster denn Datensatz wechsel, geschieht dasselbe simultan im anderen Fenster. Wie kriege ich das Problem gelöst?
Nochn bisschen Code vom Child:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| private: dmKundenConnection: TdmKundenConnection;
procedure TformKundenliste.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; end;
procedure TformKundenliste.setConnection(con:TSQLConnection;name:String); begin with dmKundenConnection do begin sqldsKunden.SQLConnection:=con; sqldsKunden.Active:=true; cdsKunden.Active:=true; end; Caption:=Caption+' '+name; end;
procedure TformKundenliste.FormCreate(Sender: TObject); begin dmKundenConnection:=TdmKundenConnection.Create(Self); end; |
In TdmKundenConnection mache ich gar nichts, da habe ich nur die Komponenten drin.
sakura - Fr 06.02.04 20:09
Ich hatte schon gegrübelt wo das hin war :shock: Ich hatte vorher noch einen Fehler in der Erklärung :oops:
Hier mal die Lösung wie Bernd und Daniel die auf der RoadShow zeigten ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| private: FdmKundenConnection: TdmKundenConnection; function GetDmKundenConnection: TdmKundenConnection; public property DmKundenConnection: TdmKundenConnection read GetDmKundenConnection;
procedure TformKundenliste.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; end;
procedure TformKundenliste.setConnection(con:TSQLConnection;name:String); begin with dmKundenConnection do begin sqldsKunden.SQLConnection:=con; sqldsKunden.Active:=true; cdsKunden.Active:=true; end; Caption:=Caption+' '+name; end;
function TformKundenliste.GetDmKundenConnection: TdmKundenConnection; begin if FdmKundenConnection = nil then begin FdmKundenConnection:=TdmKundenConnection.Create(Self); end; Result := FdmKundenConnection; end;
procedure TformKundenliste.FormCreate(Sender: TObject); begin SetConnection(...); end; |
UGrohne - Fr 06.02.04 20:21
Danke, das werd ich evtl. heute oder morgen noch ausprobieren.
UGrohne - Sa 07.02.04 13:15
OK, hab das jetzt mal gestestet, aber leider ohne Erfolg, keine Ahnung woran das liegen könnte. Denn eigentlich ist es doch wurscht, ob ich es über eine Variable mache, oder ein property, steht ja im Hintergrund dasselbe.
Was aber komisch ist: Ich hab noch mehrere DB-Verbindungen und wenn ich jetzt zwei Forms öffne, ihnen aber verschiedene Instanzen der DB-Connection zuweise, es kommt immer nur die erste Verbindung. Hab auch schon überprüft, dass mehrere Objekte erzeugt werden, die liegen alle in unterschiedlichen Adressbereichen.
Das Einzige was bei mir von Deinem Vorschlag abweicht ist, dass ich SetConnection erst nach Erzeugen des Objektes manuell aufrufe und nicht im Konstruktor, aber das dürfte doch nicht das Problem sein, oder?
sakura - Sa 07.02.04 13:29
UGrohne hat folgendes geschrieben: |
Das Einzige was bei mir von Deinem Vorschlag abweicht ist, dass ich SetConnection erst nach Erzeugen des Objektes manuell aufrufe und nicht im Konstruktor, aber das dürfte doch nicht das Problem sein, oder? |
Das sollte eigentlich nicht den ausschlaggebenden Unterschied machen :?
Was meinst Du mit "
es kommt immer nur die erste Verbindung" ?
UGrohne - Sa 07.02.04 14:39
sakura hat folgendes geschrieben: |
Was meinst Du mit "es kommt immer nur die erste Verbindung" ? |
Bei zwei unterschiedlichen Datenbankverbindungen bekomme ich immer nur die Daten der ersten Verbindung, ich kann keine Daten von der zweiten Verbindung abfragen, obwohl ich das SQLDataSet mit der SQLConnection der zweiten Instanz vom MainModule verbunden habe.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!