Newsgroup: it.comp.lang.delphi
Titolo: Domanda non facile

Ho la esigenza di trasferire i valori di una StringList creata in un main ad
una form chiamata dal main. Pensavo di poterlo fare dichiarando nel chiamato
una property di tipo StringList. Ecco un pezzo del mio codice, ma non
funziona. Dove sbaglio ?
C'è un modo di passare una StringList da una unit ad un'altra ?
Nel main:
====================================
MLista: TStringList;
................
MLista:= TStringList.Create;
.............................
riempio di valori la stringList
............................
Application.CreateForm(TFormDetail, FormDetail);
// trasferisco i valori della MLista del Main all'analoga FLista del
chiamato:
FormDetail.FLista.AddStrings(MLista);
//
FormDetail.Showmodal;
Nel chiamato:
====================================
  private
    { Private declarations }
    fFLista: TStringList;
  public
    { Public declarations }
 //HO DUBBI SULLA CORRETTEZZA DI QUESTO
    property FLista: TStringList read fFLista write fFLista;
..............................................
Nel form OnCreate del chiamato:
FListaTitles:= TStringList.Create;
..............................................
In effetti, in FLista i valori di MLista non vengono trasferiti. Come si fa
? C'è un altro modo di trasferire dati da una unità ad un'altra ?
ListaTitles:= TStringList.Create;

 C'è un modo di passare una StringList da una unit ad un'altra ?
Non va semplicemente con...
Application.CreateForm(TFormDetail, FormDetail);
FormDetail.FLista.AddStrings(MLista);
FormDetail.Showmodal;
e nient'altro (niente public, oncreate...)?
Scusa ma ho un sonno bestiale e non ho proprio voglia di provare =___=
-- 
Jax

  Dove sbaglio ?
Nella progettazione.. :-)
Intendo dire che ritengo che sia l'approccio ad essere sbagliato: tu sei il
main form che chiama un altro form, e deve passargli un dato. L'altro form
a questo punto non deve fare altro che "chiedergli" quel dato. Il main
form, pertanto, espone una proprietą o un metodo che serva ad ottenere la
lista (il tuo dato).
E' sbagliato andare a modificare il form chiamato per due motivi: uno di
logica (chi possiede il dato da condividere?) e un'altro di manutenzione:
se modifichi il form chiamato aggiungendo una tstringlist, aumenti il
codice scritto inutilmente ( e quindi anche quello da manutenere). Invece,
esponendo il dato dal form main, il form chiamato (quello di detail) non
deve fare altro che rivolgersi al form main e invocare un metodo public
GetDetailList che ritorna la tstringlist.
Scusa la prolissitą.. non ho sonno e domani mi tocca fare 1 ora e mezzo di
strada per andare in ufficio: saro' in coma :-O
Ciao
-- 
Morde

 logica (chi possiede il dato da condividere?) e un'altro di manutenzione:
Non è sbagliato a mio parere, anche se preferirei che la StringList
venisse passata a un metodo per la dovuta elaborazione.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

La mia domanda poneva problema generico del tipo: Come si passano dati (nel
mio caso una StringList) tra due unit che entrambe la utilizzano per i loro
scopi ? Non so ancora come si fa, ma stavo cercando di risolvere la
questione dichiarando l'oggetto in comune (la StringList) come una property
della unit chiamata che il chiamante pertanto può utilizzare per passargli
il suo oggetto. Mi imbatto però nella difficaoltà di tradurre in pratica il
concetto, perchè tecnicamente e sintatticamente non so come si fa.
Qualcuno lo sa e può esemplificare ?
"Andrea Laforgia" <x...@xx.xx> ha scritto nel messaggio
news:fb3acm$6s2$1...@news.newsland.it...


 Qualcuno lo sa e può esemplificare ?
Io farei così: dichiari una stringlist nella sezione public della form 
chiamata (mettiamo di chiamarla slLista), dalla form chiamante fai 
formchiamata.slLista.assign(slLista1), dove slLista1 è nella form 
chiamante; visualizzi formchiamata, nel suo onShow fai il caricamento 
dalla variabile pubblica con AddString.
Non so se sia il metodo migliore, ma IMHO non è malaccio.
-- 
Jax

loro scopi ? 
Questa domanda, formalmente, non ha senso. I dati non si "passano" tra le
unit, ma semmai tra istanze di classi dichiarate in unit distinte. E il
metodo per passare un dato tra due istanze di classi (due oggetti per
intenderci) è, o quello di esporre una proprietà, o quella di passare un
parametro a un metodo.


 Qualcuno lo sa e può esemplificare ?
Semplicemente, crei un metodo nella classe a cui appartiene l'oggetto 
"ricevente" e introduci un parametro nel metodo che accetti un oggetto 
(o un qualsiasi altro valore di altro tipo) che vuoi passare.
Ti basterà invocare quel metodo passando il dato richiesto da qualsiasi 
altro oggetto che intende utilizzarlo.
Così come è esposto il problema, mi sembra la soluzione più semplice e 
immediata.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

Crea una procedura nella form secondaria che accetta in ingresso una 
TStringList tipo Procedure InsertData(Dati : TStringList) e, a questo 
punto ci fai quello che ti pare.
Inserire una property di tipo oggetto che non usa procedure per dare e 
prendere dati è una cosa che non si dovrebbe fare (in realtà vengono 
gestiti i puntatori dell'oggetto con relativi incasinamenti)
Comunque se proprio vuoi metti la parte fFLista: TStringList della form 
secondaria nella sezione public e togli la property che hai dichiarato. 
Dal main usa FormDetail.fFLista.AddStrings(MLista). Ripeto è un 
approccio sbagliato ma comunque....
Ciao,
David

 secondaria nella sezione public e togli la property che hai dichiarato. 
Direi che non è un approccio bellissimo. Nelle sezioni public è bene usare
le property che mappano dei membri privati in modo, se si vuole, da
frapporre del codice di gestione mediante getter/setter. Anche nel caso in
cui questo non serva da subito, l'approccio standard è quello di usare le
property, non di esporre direttamente le variabili.


 property, non di esporre direttamente le variabili.
Anche qui' sono daccordissimo con te ma se uno vuole complicarsi la vita 
a tutti i costi tanto vale dargli una mano.

 a tutti i costi tanto vale dargli una mano.
A me capita spesso, in occasione di corsi e tutoraggio vario, di vedere 
soluzioni più complicate proprio quando vengono usate per evitare 
complicazioni. :-)


Giusto ! Volevo solo vedere se eri attento ..
"Andrea Laforgia" <x...@xx.xx> ha scritto nel messaggio
news:fb3cpp$ipm$1...@news.newsland.it...
