PDA

Visualizza la versione completa : [Delphi] Oggetti "vari" e tdataset


lanciafiamme
14-07-2012, 16:18
Estenuato dal malefico php sto cercando di imbarcarmi verso un'altra avventura... che rischia di essere ancora peggiore!

La domanda riguarda la possibilità di "mascherare" il tipo di un oggetto, con riferimento ai vari tquery t-qualcosa-query e così via.

Esempio:
miaquery: tobject; (un oggetto generico)

querysumysql: tquerysumysql;
querysumssql: tquerysumssql; (nota: sono due Tipi diversi!)

if (tipodatabase=mysql) then
miaquery:=tquerysumysql
else
miaquery:=querysumssql;

in sostanza, a seconda di certe circostanze, voglio usare due oggetti query diversi per agganciare due database a loro volta diversi.

Paradossalmente sembra funzionare MA... poi devo "trasformare" il tobject in un tdataset mediante un cast esplicito.

Tdataset(miaquery).append;
tdataset(miaquery).fieldbyname('campo').asstring:= qualcosa;
tdataset(miaquery).post;

(...)
if tdatset(miaquery).recordcount=0 then blablabla
(...)
tdataset(miaquery).locate('chiave','qualcosa' (...)


Esiste (immagino di sì!) un sistema meno barbaro di questo?
:fagiano:

Caiodark
14-07-2012, 19:49
Un metodo meno "barbaro" sarebbe dichiarare miaquery direttamente come tdataset, a meno di non spiegare il motivo per cui l'hai dichiarato come tobject.

lanciafiamme
14-07-2012, 21:23
Originariamente inviato da Caiodark
Un metodo meno "barbaro" sarebbe dichiarare miaquery direttamente come tdataset, a meno di non spiegare il motivo per cui l'hai dichiarato come tobject. Per la verità non ho ben chiaro come fare, ho usato un tobject perchè mi permette di fare l'assegnazione

miooggetto:= praticamente-qualsiasi-cosa

Modo migliore?

Caiodark
14-07-2012, 21:37
Originariamente inviato da lanciafiamme
Per la verità non ho ben chiaro come fare, ho usato un tobject perchè mi permette di fare l'assegnazione

miooggetto:= praticamente-qualsiasi-cosa

Modo migliore?

Mmm studiare l'OOP aiuterebbe, non ci sono altre scorciatoie.

Nettuno95
14-07-2012, 22:49
mmm io opterei per una strada un po' diversa, butto giù un idea al volo, poi volendo ci si può lavorare.
Metterei n connessioni diverse in un datamodule, poi in un secondo datamodule ci metto i dataset, e ogni volta che creo il secndo datamodule lo faccio attaccare ad una connessione diversa in base all'esigenza... come ho detto è solo un idea 'al volo' ... ma ci si può ragionare

lanciafiamme
14-07-2012, 23:12
Originariamente inviato da Caiodark
Mmm studiare l'OOP aiuterebbe, non ci sono altre scorciatoie. Ok allora non si può fare, getto la spugna.
Però speravo meglio :cry:

lanciafiamme
14-07-2012, 23:14
Originariamente inviato da Nettuno95
mmm io opterei per una strada un po' diversa, butto giù un idea al volo, poi volendo ci si può lavorare.
Metterei n connessioni diverse in un datamodule, poi in un secondo datamodule ci metto i dataset, e ogni volta che creo il secndo datamodule lo faccio attaccare ad una connessione diversa in base all'esigenza... come ho detto è solo un idea 'al volo' ... ma ci si può ragionare la tecnica che ho messo funziona, sono sicuro di questo.
Però son due @@ dover tutte le sante volte metterci un tdataset(questo) invece di questo e basta.
Pazienza :zizi:

Nettuno95
14-07-2012, 23:50
Se l'unico "problema" è il CAST .. puoi ovviare come ha detto Caiodark dichiarando la variabile di tipo TDataSet, ma pensandoci anche TDataSource, e con una funzione incapsuli il tutto in modo da ritornare il collegamento al server desiderato.
Altra strada sarebbe usare gli "Anonymous Methods" o le interfacce (TInterfacedObject) con le nuove classi generics, le hai a disposizione da D2009 in avanti, ci vuole un po' di studio ma credo sia fattibile, anche se la strada della funzione che in base ai parametri passati ti ritorna un TDatasource già bello e pronto non sarebbe malvagia :)
Un Saluto
N.

lanciafiamme
15-07-2012, 12:42
Originariamente inviato da Nettuno95
Se l'unico "problema" è il CAST .. puoi ovviare come ha detto Caiodark dichiarando la variabile di tipo TDataSet, ma pensandoci anche TDataSource, e con una funzione incapsuli il tutto in modo da ritornare il collegamento al server desiderato.
Il "problema" è che lo metto in un tdataset, "spariscono" metodi e procedure proprie delle query (SQL.text, Open, ExecSQL e così via).
In pratica mentre un tobject posso "castarlo" un po' a tutto, un tdataset resta... un tdataset.
O almeno credo...




Altra strada sarebbe usare gli "Anonymous Methods" o le interfacce (TInterfacedObject) con le nuove classi generics, le hai a disposizione da D2009 in avanti, ci vuole un po' di studio ma credo sia fattibile, anche se la strada della funzione che in base ai parametri passati ti ritorna un TDatasource già bello e pronto non sarebbe malvagia :)
Un Saluto
N. Qui il convento passa delphi 5... altro che delphi 2009!
Grazie comunque

Caiodark
15-07-2012, 13:27
Studiati un attimo l'albero della VCL e scegli la classe meno astratta possibile in comune tra i componenti che vuoi utilizzare.
Con il cast salti il controllo sul tipo, cosa piuttosto pericolosa quando l'istanziazione della variabile avviene in un punto diverso del codice e quando qualcun altro deve metter mano al tuo codice (oppure quando tu stesso devi rimetter mano al tuo codice dopo qualche mese magari).

Loading