Datenmodule und deren Verwendung

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
charlytango
Beiträge: 843
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

Datenmodule und deren Verwendung

Beitrag von charlytango »

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..

mse
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

Beitrag von mse »

charlytango hat geschrieben:müsste ich beim Erstellen eines Formulars das passende Datenmodul erzeugen

Ja, wenn das verwenden von gemeinsamen bestehenden Datenmodulen nicht möglich ist.
und per Code an die Datacontrols anbinden?

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 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?

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.

charlytango
Beiträge: 843
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

Beitrag von charlytango »

Nun, nach einigem Testen ist für mich im Moment die einfachste Methode dem Vorschlag des Posters mse zu folgen.

  1. Im Formular ein TDataSource platzieren an dem die DataControls hängen
  2. Im OnCreate des Formulars das passende Datenmodul mit dem Formular als Parent erzeugen.
  3. 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


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?

mse
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

Beitrag von mse »

charlytango hat geschrieben:Das klappt zwar, scheint mir aber noch nicht wirklich elegant weil das TDatasource noch auf dem Formular klebt

Warum nicht? Genau dafür wurde TDataSouce doch erfunden?

charlytango
Beiträge: 843
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

Beitrag von charlytango »

mse hat geschrieben:
charlytango hat geschrieben:Das klappt zwar, scheint mir aber noch nicht wirklich elegant weil das TDatasource noch auf dem Formular klebt

Warum nicht? Genau dafür wurde TDataSouce doch erfunden?


Im Sinne der Trennung von Datenlogik und GUI kann man jetzt diskutieren ob TDatasource aufs Formular oder ins Datenmodul gehört.

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 :-)

mse
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

Beitrag von mse »

charlytango hat geschrieben:Ich suche halt nach einer eleganten Lösung :-)

Dir ist aber bewusst, dass ein TDataset eine beliebige Anzahl TDataSource bedienen kann?
Für master/detail kann ein von Formularen unabhängiges TDataSource verwendet werden.

charlytango
Beiträge: 843
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

Beitrag von charlytango »

mse hat geschrieben:
charlytango hat geschrieben:Ich suche halt nach einer eleganten Lösung :-)

Dir ist aber bewusst, dass ein TDataset eine beliebige Anzahl TDataSource bedienen kann?
Für master/detail kann ein von Formularen unabhängiges TDataSource verwendet werden.


Nein, aber jetzt weiß ich es -- merci

Antworten