Newsgroup: it.comp.lang.delphi
Titolo: Problema di "concetto"

Ciao a tutti,
Ho un problema "concettuale".
Se io ho un progettino tipo:
Form1 contenente una DBGrid che punta al DataSource1 in DataModule1
(classico !)
In DataSource1 ho una tabella "CLIENTI" collegata al DataSource.
Mettiamo il caso che voglio permettere all'utente di avere aperte più Form1
!
Il problema è facilmente risolvibile:
MiaFormA := TForm1.Create(Self);
MioDataModuleA := TDataModule1.Create(Self);
MiaFormB := TForm1.Create(Self);
MioDataModuleB:= TDataModule1.Create(Self);
Il problema è ovvio: l'oggetto TForm1 ha delle proprietà che puntano al
DataModule (TDataModule1) e quindi è necessario "rimappare" le proprietà che
puntano a quel DataModule.
C'è un sistema più furbo ?
grazie
Solid Snake IT

 wrote

forse non ho capito bene il problema, ma credo che tu ti riferisci al fatto
di creare una nuova istanza del TDataModule e quindi rimappare le proprietà
degli oggetti data ware nel Form1 in modo che queste facciano riferimento
alla nuova istanza. E' così ?
Vabbè, se è così o se non le è, io ti posso dire che uso un sistema
totalmente diverso che intanto esclude la creazione di più oggetti
TDataModule tra l'altro equivalenti fra loro.
Io nel mio programma posso avere un solo oggetto TDataModule o al limite due
o 3 al massimo se il numero di TDataSource e TTable è talmente grande che un
solo TDataModule non riesce a contenerle graficamente.....insomma non
c'entrano nella finestra del TDataModule e a me non piace fare su e giù con
le scrollbar.
A parte questa piccola nota, supponiamo di avere un TDataModule. Io questo
lo creao prima delle form di programma e lo distruggo alla fine del
programma. In pratica lo metto nell'autocreate del DPR che fa tutto lui.
Se c'è un'eventuale form che carica dati dal database, non si deve
preoccupare nemmeno di creare il datamodule e tra l'altro tutte le form del
programma fanno riferimento a quel datamodule che è sempre in memoria.
Se ho 30 oggetti TDataSource, non pensare che tutti e trenta hanno le loro
rispettive tabelle aperte.
Io faccio una unit che si occupa di aprire e chiudere le tabelle quando
servono o non servono. Questa unit è globale quindi tutte le form possono
accederci per usare le procedure di apertura e chiusura di una tabella.
In pratica tutto il sistema permette di avere solo un TDataModule attivo e
visibile da tutte le form che devono usare gli oggetti TDataSource
contenuti, ed inoltre le tabelle con la proprietà Active a True, sono solo
quelle attualmente usate.
Mi pare che il sistema sia "furbo" ( diciamo quello che ho sempre usato ) e
poco dispendioso di risorse. Il path delle tabelle, glielo puoi assegnare
nell'evento di creazione del datamodule oppure passarglielo come parametro
alle procedure che si occupano di aprire le tabelle.
Poi se vedi che c'è una tabella che è usatissima da ogni form, senza fare
apri e chiudi, ti conviene lasciarla sempre aperta. Purtroppo queste sono
scelte che devi fare tu in base a come progetti il tuo programma.
Poi se il tuo programma permette di usare più form contemporaneamente, le
cose si complicano un po'. A questo punto ti conviene prendere un foglio,
metterti al tavolino e vedere come organizzare un po' la cosa.....oppure se
hai forti dubbi su quello che stai facendo, chiedi quì !!
Per ora ti saluto.....ciao !!
Antonio Tarolla

 puntano a quel DataModule.
Hai provato così:
MiaFormA := TForm1.Create(Self);
MiaFormA.Name := '';
MioDataModuleA := TDataModule1.Create(Self);
MioDataModuleA.Name := '';
MiaFormB := TForm1.Create(Self);
MiaFormB.Name := '';
MioDataModuleB:= TDataModule1.Create(Self);
MioDataModuleB.Name := '';
HTH
Andrea Casati

Ciao Antonio,
grazie del POST. Io utilizzo una tecnica diversa dalla tua ma cmq
efficiente.
Il mio dubbio è nato dal fatto che vorrei avere due form "IDENTICHE" che
fanno riferimento alla stessa tabella dello stesso database ma che possono
essere visualizzate conteporaneamente puntando ovviamente a record diversi.
La soluzione "ovvia" sarebbe quella di mettere le tabelle/datasource nella
form stessa
Quindi:
FormA := TForm1.Create(Self);
FormB := TForm1.Create(Self);
FormA.Show;
FormB.Show;
Però è chiaramente più "pulito" utilizzare i datamodule per tabelle/oggetti
non visibile e mi sarebbe piaciuto trovare un sistema per "rimappare" le
proprietà diverso da quello di scrivere codice.
grazie lo stesso
ciao
Solid Snake IT

 !
il subject non poteva essere piu' azzeccato ;)
... e' proprio il concetto che e' diverso, tutti gli oggetti db-awar
collegati allo stesso datasource/ttable/tquery sono sincronizzati, e
questo e' il "concetto" degli oggetti vcl... quello giusto, francamente...
pensa se un griglia e un dbnavigator collegati alla stessa tabella non
fossero "sincronizzati"....
penso che non ci siano altre soluzioni (ok, secondo me non ce ne sono, o
almeno non me ne vengono in mente...) che non quella di inserire sulla
form il TQuery/TTable e il datasource, cosi' nella creazione di una nuova
form avrai una form indipendente con i propri oggetti...
la tua soluzione (quella del datamodule) sembrerebbe piu' pulita, sempre
se nel datamodule non metti l'oggetto TDatabase, in quel caso sarebbe uno
spreco (ci sarebbe una nuova connesione al DB ad ogni form aperta...)
Ciao,
Alan Solo