Entwickler-Ecke

Datenbanken - Dem Formular eine Instanz von einem Datenmodul zuweisen


CONVERTIBLE95 - Fr 16.11.07 11:28
Titel: Dem Formular eine Instanz von einem Datenmodul zuweisen
Ich habe ja einem MDIForm Programm mehrere MDIChild Formulare die auf Ihre Daten zugreifen.
Jetzt möchte ich aber die DB-Zugriffe in DataModule auslagern, also für jedes Formular
ein eigenes Datenmodul.

Soweit stellt das kein Problem dar, doch wenn ich jetzt ein Formular z.B. FKunden ein
zweites mal öffne, um evtl. zwei Kunden zu vergleichen, werden die Daten bei beiden
Formularen synchron angezeigt. Es besteht also keine Möglichkeit unterschiedliche Daten-
sätze anzuzeigen.

Nun dachte ich damit ich bei dem TFKunden.FormCreate einfach auch das Datenmodul
neu erzeuge, also mit

_dataKunden := T_dataKunden.Create(Self);

geht ja auch, doch die Daten werden immer noch synchron angezeigt.

Wie kann ich das lösen damit jedes Formular sein eigenes Datenmodul zugewiesen bekommt?


jasocul - Fr 16.11.07 11:34

:welcome: in der Entwickler-Ecke.

Ist _datakunden auch eine lokale Variable?


Kroko - Fr 16.11.07 11:49

Wenn jedes Formular sein eigenes Datenmodul haben soll, dann brauchst Du doch eigentlich keins, sonder kannst die Komponenten, gleich ins Formular integrieren, oder :?:


jasocul - Fr 16.11.07 11:59

Kann man. Macht das aber sehr unübersichtlich. Zumindest, wenn man mehr als 2-3 Komponenten auf der Form hat.

Mal abgesehen davon, dass ein DataModul mehr als nur ein Container für Komponenten ist.


CONVERTIBLE95 - Fr 16.11.07 12:19

_dataKunden = T_dataKunden = class(TDataModule)

also das Datenmodul selbst.

"Wenn jedes Formular sein eigenes Datenmodul haben soll, dann brauchst Du doch eigentlich keins, sonder kannst die Komponenten, gleich ins Formular integrieren, oder"

Wenn es nur 2-3 Komponenten wären nicht, aber es sind meistens um die 30 verschiedene Tabellen die benötigt werden, deshalb will ich das nicht im Formular haben. Ausserdem sollen manche Funktionen auch für andere Formulare zur Verfügung gestellt werden, weil sie auf gleiche
Routinen zugreifen.


TProgger - Fr 16.11.07 12:25

die Datenmodule haben doch sicher einen Namen?
also ala DatenModul2.Table5...
So müsste doch alles von überallher ansprechbar sein, wenn die Datenmodul-Units in der uses stehen.


jasocul - Fr 16.11.07 12:26

Definiere Dir eine lokale Variable in der Form, wo Du das DataModul einbindest. Nimm nicht die Variable, die im DataModul automatisch erstellt wird.

Dann sollte es theoretisch in jeder Instanz des MDIChild unterschiedlich reagieren.


CONVERTIBLE95 - Fr 16.11.07 12:39

Mit der lokalen Variable in der Form geht es leider auch nicht.

Ich denke das Problem wird daran liegen weil

z.B. die Eigenschaften der Komponente

tBezeichnug : TDBEdit
...
DataField BEZEICHNUG
DataSource _dataKunden.ds_Kunden
...

also sie verweisen immer auf diese Datasource und deshalb laufen zwei Formulare
synchron wenn ich vor oder zurück blättere


jasocul - Fr 16.11.07 12:40

Die musst Du natürlich auf die lokale Variable umstellen.


CONVERTIBLE95 - Fr 16.11.07 12:53

Hab die Variable für das Datenmodul im Formular Kunden erzeuge das Datenmodul bei OnCreate
und die Zuweisung der DataSource für die Felder auch beim OnCreate, aber geht leider nicht.
Gleiche Situation wie vorher auch.


hansa - Fr 16.11.07 13:24

Die beiden Datenmodule greifen doch offensichtlich auf ein und dasselbe Dataset zu. Wie siehts denn damit aus ? Das Datenmodul selber ist eher uninteressant.


CONVERTIBLE95 - Fr 16.11.07 13:59

habe jetzt bei OnCreate:

_daten_Kunden := T_dataKunden.Create(Self);
ds_Kunden := TDataSource.Create(Self);
ds_Kunden.DataSet := _daten_Kunden.tab_Kunden;

tSuchname.DataSource := ds_Kunden;
tName.DataSource := ds_Kunden;
tBezeichnug.DataSource := ds_Kunden;

aber leider geht das auch nicht. Wenn ich jetzt zwei Formulare offen habe, wird nur bei dem ersten die Daten geändert, egal in welchem Formular ich auf Vor oder Zurück Klicke.


jasocul - Fr 16.11.07 14:33

Das kommt mir alles ein bisschen merkwürdig vor.

Wenn man verschiedene Instanzen einer Klasse erzeugt, sollten die auch unabhängig voneinander sein. Irgendwas machst Du falsch. Aber ich kann so nicht erkennen, was das sein sollte.