Hi,
Im Sinne der Trennung von Logik samt Datenzugriff und der grafischen Darstellung ist es imho absolut sinnvoll Datenmodule zu benutzen.
Das klassische Datenmodul über das die komplette Anbindung an die Datenbank läuft ist für mich seit vielen Jahren selbstverständlich und bestimmte Datenmodule für Spezialaufgaben wie logging oder Programmeinstellungen ebenso.
Für die Applikation werden nur diese wenigen speziellen Datenmodule und das Hauptformular automatisch erzeugt, alles andere wird je nach Nutzung erzeugt und verwaltet.
Nun schleichen sich immer wieder mal Formulare ein die einfach auch nicht visiuelle Datenbankkomponenten drauf geklebt bekommen weils einfacher ist. Oder anders gesagt, weil ich nicht genau weiß wie Lazarus mit Datenmodulen umgeht bzw wie man sie sauber verwenden sollte.
Einem Formular in der uses Klausel das zugehörige Datenmodul anzugeben ist noch keine Hexerei, aber das löst mir ja noch nicht das Problem dass das korrespondierende Datenmodul zu Laufzeit nicht existiert.
Hab ich da einen Denkfehler oder müsste ich beim Erstellen eines Formulars das passende Datenmodul erzeugen und per Code an die Datacontrols anbinden?
Und wie ist das wenn ich ein Formular mehrmals instantiieren muss? (Beispiel: Kunde A und Kunde B in zwei Fenstern nebeneinander, da wäre es fatal wenn es das gleiche Datenmodul wäre )
Wie löst ihr das?
Was ist "Best Practice" ?
Danke im voraus..
Datenmodule und deren Verwendung
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Datenmodule und deren Verwendung
Ja, wenn das verwenden von gemeinsamen bestehenden Datenmodulen nicht möglich ist.charlytango hat geschrieben: müsste ich beim Erstellen eines Formulars das passende Datenmodul erzeugen
Nicht unbedingt, Application.CreateDataModule() (oder wie das be Lazarus heisst) sollte bestehende Referenzen auflösen. Wobei man meist zuerst das Datamodul erzeugt und erst danach die Forms. Falls die Formulare selber keine Referenzen für weitere Formulare zur Verfügung stellen reicht für die Formulare auch einfaches Create().und per Code an die Datacontrols anbinden?
Ich platziere jeweils eine TDataSource im Formular wovon die DB-Edits die Felder beziehen. Dann muss lediglich <DataSource>.DataSet auf die entsprechende TDataSet-Komponente gesetzt werden. Ich könnte mir auch vorstellen, dass es möglich sein sollte gezielt Gruppen von Formularen und Modulen zu linken. Das habe ich aber noch nie gemacht.Und wie ist das wenn ich ein Formular mehrmals instantiieren muss? (Beispiel: Kunde A und Kunde B in zwei Fenstern nebeneinander, da wäre es fatal wenn es das gleiche Datenmodul wäre )
Wie löst ihr das?
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Datenmodule und deren Verwendung
Nun, nach einigem Testen ist für mich im Moment die einfachste Methode dem Vorschlag des Posters mse zu folgen.
Das klappt zwar, scheint mir aber noch nicht wirklich elegant weil das TDatasource noch auf dem Formular klebt-- Frage: hat jemand eine elegantere Lösung ohne zusätzliche Schreibarbeit pro DataControl?
- Im Formular ein TDataSource platzieren an dem die DataControls hängen
- Im OnCreate des Formulars das passende Datenmodul mit dem Formular als Parent erzeugen.
- dem TDataSource auf dem Formular das passende TDataset des Datenmuduls zuweisen (dann braucht man nicht alle Datacontrols zur Laufzeit einzeln zuweisen.
Code: Alles auswählen
var
frmDatatest: TfrmDatatest;
DM:TdmDatatest;
implementation
{$R *.lfm}
{ TfrmDatatest }
procedure TfrmDatatest.FormCreate(Sender: TObject);
begin
DM:=TdmDatatest.create(self); //dann wird beim Schließen des Formulars auch das Datenmodul zerstört
Datasource1.DataSet:=DM.SQLQuery1;
DM.Initialize; //startet die nötigen Queries
end;
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Datenmodule und deren Verwendung
Warum nicht? Genau dafür wurde TDataSouce doch erfunden?charlytango hat geschrieben: Das klappt zwar, scheint mir aber noch nicht wirklich elegant weil das TDatasource noch auf dem Formular klebt
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Datenmodule und deren Verwendung
Im Sinne der Trennung von Datenlogik und GUI kann man jetzt diskutieren ob TDatasource aufs Formular oder ins Datenmodul gehört.mse hat geschrieben:Warum nicht? Genau dafür wurde TDataSouce doch erfunden?charlytango hat geschrieben: Das klappt zwar, scheint mir aber noch nicht wirklich elegant weil das TDatasource noch auf dem Formular klebt
Wenn aber Master-Detail Beziehungen abgebildet werden sollen braucht ein TDataset ein TDatasource als MasterSource.
Dann ist es wiederum von Vorteil wenn beide in einem Datenmodul liegen, sonst muss man wieder irgendwie auf das Formular zugreifen, um diese Verbindung herzustellen. (Stichwort zirkuäre Refewrenz von Units)
Ich suche halt nach einer eleganten Lösung

-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Datenmodule und deren Verwendung
Dir ist aber bewusst, dass ein TDataset eine beliebige Anzahl TDataSource bedienen kann?charlytango hat geschrieben: Ich suche halt nach einer eleganten Lösung
Für master/detail kann ein von Formularen unabhängiges TDataSource verwendet werden.
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Datenmodule und deren Verwendung
Nein, aber jetzt weiß ich es -- mercimse hat geschrieben:Dir ist aber bewusst, dass ein TDataset eine beliebige Anzahl TDataSource bedienen kann?charlytango hat geschrieben: Ich suche halt nach einer eleganten Lösung
Für master/detail kann ein von Formularen unabhängiges TDataSource verwendet werden.