AGB  ·  Datenschutz  ·  Impressum  







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

Form + DataModule mehrere Instanzen

Ein Thema von Nersgatt · begonnen am 31. Jul 2017 · letzter Beitrag vom 31. Jul 2017
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#21

AW: Form + DataModule mehrere Instanzen

  Alt 31. Jul 2017, 16:31
Sollte es nicht reichen, die Datensourcen auf das Formular zu setzen, dann können die Formulare unabhängig voneinander in den Daten scrollen. Das Datenmodul darf Singleton bleiben.
In der Regel lade ich die Daten durch ein TuniQuery in ein TClientDataset. Der Query übergebe ich Parameter an den SELECT, damit die Datenbank für mich nur die relevanten Daten raus filtert.
Wenn ich nun 2 Instanzen mit verschiedenen Parametern öffnen möchte, benötige ich diese 2 Instanzen des Datenmoduls. Sonst müsste ich noch das ClientDataSet auf das Formular packen. Das möchte ich nicht, das finde ich unübersichtlich.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#22

AW: Form + DataModule mehrere Instanzen

  Alt 31. Jul 2017, 16:50
Wir haben einen TDataSource-Nachfahren der ein DataSet (pgDAC) drin hat.
Im Create holt der sich auch selber standardmäßig erstmal die Connection von einem globalen DataModul. (kann man notfalls danach was Anderes zuweisen ... man könnte sich da auch die erste Connection auf dem gemeinsamen Owner suchen, wenn im BeforeOpen noch keine Connection zugewiesen)

Dann noch paar Dinge, wie z.B. das SQL-Property, durchgereicht und als Published in die DataSource.


Nur eine Komponente auf der Form. (inkl. Preload der Default-Werte im AfterInsert uvm.)


Ist wie Delphi-Referenz durchsuchenTLabeledEdit ... man kann TEdit und TLabel alleine auf die Form packen, oder zusammen.
Zusammen kann/sollte man aber TLabeledEdit nochmal ableiten und die Label-Caption etwas schöner in dem Edit platzieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Jul 2017 um 16:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#23

AW: Form + DataModule mehrere Instanzen

  Alt 31. Jul 2017, 17:12
Im FormDesigner wird aber auch hier dennoch die globale Instanz verwendet.
Das ist ja auch so gewollt! In der IDE kann es ja auch nur eine Instanz des Forms geben (insbesondere wird dabei ja die lokale Instanz des Datenmoduls dort auch nicht erzeugt - nur zur Runtime) und das kann man ja bequem mit der Datenmodul-Instanz verknüpfen. Per Definition sind ja die Designtime-Instanz des Datenmoduls und die diversen Runtime-Instanzen vom selben Klassentyp.

Die Lösung ist vom Programmieraufwand her recht simpel und eingängig. Man muss lediglich im TForm.Create eine lokale Datenmodul-Instanz erzeugen und entsprechend benennen bevor man inherited aufruft.

Eigentlich kann das Datenmodul-Property im Form auch ganz anders heißen, solange der Name der Instanz passt. Will man diese Instanz nicht auch noch im Code selbst ansprechen, muss man die nicht mal als Property oder Feld deklarieren. Eine einzige Zeile reicht dann schon:

Delphi-Quellcode:
constructor TForm198.Create(AOwner: TComponent);
begin
  TMyDataModule.Create(Self).Name := 'MyDataModule';
  inherited;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#24

AW: Form + DataModule mehrere Instanzen

  Alt 31. Jul 2017, 17:47
{FFormVariableMyDataModuleOderSo :=} TMyDataModule.Create(Self, 'MyDataModule');

Wenn FFormVariableMyDataModuleOderSo ein Published-Feld mit dem Namen 'MyDataModule' ist, dann kümmert sich die VCL um das Befüllen dieser Variable.
TComponent.Name setzt automatisch ein eventuell vorhandenes gleichnamiges Published-Feld im Owner. Und beim Free/Destroy setzt es das auch wieder auf nil.

Ich hätte hier nur wegen des Owners leichte Bedenken gehabt. Die Child-Liste existiert ja noch nicht, aber scheinbar wird sie hier angelegt.
Vor dem Inherited ist ja noch nichts initialisiert. (alle Felder stehen auf 0 bzw. NIL, da vor der Constructor-Methode, zumindestens schonmal der Speicher mit NewInstance besorgt wurde)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Jul 2017 um 17:53 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 07:16 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