Newsgroup: it.comp.lang.delphi
Titolo: Global variable

Una funzione restituisce una StringList i cui valori usavo per creare le 
pagine di un PageControl. Adesso altre parti dell'applicazione potrebbero 
avvantaggiarsi di questa lista. La cosa piů rapida  sarebbe spostare la 
dichiarazione della StringList dalla unit in cui adesso č usata portandola 
ad essere una var globale, in modo che anche le altre unit possano 
utilizzarla. Quale altra soluzione potrei adottare ? Non so ancora pensare 
ad oggetti, e chiedo: Vale la pena creare una classe il cui unico metodo 
sarebbe restituire questa StringList ? 
 

 Una funzione restituisce una StringList
 
Perche' ti serve questa cosa?
E poi da chi e' creata da chi e da chi sara' distrutta quando non
servira' piu?
 
A.

 sarebbe restituire questa StringList ?
 
Potresti semplicemente creare una unit che dichiara una variabile di tipo TStringList e inserire nelle parti *initialization* e *finalization* rispettivamente il codice necessario a crearla e riempirla (initialization) e il codice per distruggerla al termine del suo utilizzo (finalization).
 
In alternativa, la variabile potresti spostarla da *interface* a *implementation* e nella parte pubblica aggiungere una funzione che restituisca il riferimento all'oggetto andandolo a creare e inizializzare al primo utilizzo (una implementazione molto semplice del Singleton, 
http://it.wikipedia.org/wiki/Singleton
).
 
Per un esempio, prova a vedere nel sorgente della VCL, nel file Printers.pas, come viene inizializzato l'oggetto di tipo *TPrinter*.
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 

 ha scritto nel messaggio 
news:4d556bcd-51eb-4d36...@dv9g2000vbb.googlegroups.com...

Spiego a cosa mi serve, se questa è la domanda. Un form dell'applicazione 
mostra un PageControl le cui pagine sono tante quanti sono i  'Conti' 
contabili utilizzati. Attualmente, questa unit (al create del form) richiama 
una funzione che si occupa di fare una query al fine di individuare appunto 
quali sono questi 'Conti' e restituisce il risultato (Conto/Nome) in base al 
quale creo tante pagine del PageControl intestando ogni singola pagina con 
il nome del conto. La query vive nell'ambito del Create e una volta create 
le pagine viene distrutta. Adesso, un ulteriore implementazione 
dell'applicazione richiederebbe gli stessi dati, per cui ho trasformato la 
funzione in modo che restituisca una StringList con l'accoppiata Conto/Nome, 
StringList che dovrebbe rimanere disponibile per l'uso di queste altre unit 
e che andrebbe distrutta solo a chiusura applicazione.
 

 sarebbe restituire questa StringList ?
 
Potresti semplicemente creare una unit che dichiara una variabile di tipo 
TStringList e inserire nelle parti *initialization* e *finalization* 
rispettivamente il codice necessario a crearla e riempirla (initialization) 
e il codice per distruggerla al termine del suo utilizzo (finalization).
 
In alternativa, la variabile potresti spostarla da *interface* a 
*implementation* e nella parte pubblica aggiungere una funzione che 
restituisca il riferimento all'oggetto andandolo a creare e inizializzare al 
primo utilizzo (una implementazione molto semplice del Singleton, 
http://it.wikipedia.org/wiki/Singleton
).
 
Per un esempio, prova a vedere nel sorgente della VCL, nel file 
Printers.pas, come viene inizializzato l'oggetto di tipo *TPrinter*.
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 
In riferimento alla tua prima idea, la variabile di tipo TStringList come 
diventa conosciuta alle altre unit se non la dichiaro nella sez interface ? 
Cosě non sarebbe comunque una global variable ? 
 

 Cosï¿½ non sarebbe comunque una global variable ?
 
Oltre ad averla quotata tutta, cosa che ti suggerisco di evitare (leggi qui: 
http://it.wikipedia.org/wiki/Quotare
), hai anche letto quello che ti ho suggerito (fino in fondo, si intende)? :|


Oltre ad averla quotata tutta, cosa che ti suggerisco di evitare (leggi qui: 
http://it.wikipedia.org/wiki/Quotare
), hai anche letto quello che ti ho 
suggerito (fino in fondo, si intende)? :|
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 
 
Per una ragione o per l'altra, non ne combino una giusta e vengo sempre 
ripreso.. Adesso ho quotato solo la tua reprimenda. Comunque ho letto fino 
in fondo e stavo ora leggendo su wikipedia l'art da te citato (senza capirci 
un gran che, ma occorrerà meditarlo). Nel tuo messaggio la seconda parte è 
un'alternativa. Quindi io mi sono fermato alla tua prima ipotesi che mi 
sembrava semplice, ma rimaneva il dubbio che ho esternato. Non puoi fermarti 
lì anche tu e sciogliermelo spiegando come a un deficiente ? 
 

 e che andrebbe distrutta solo a chiusura applicazione.
 
Quindi attualmente hai gia' un metodo di una classe che restituisce la
stringList che ti interessa.
Cosa ti interessa se viene richiamata anche da altri (quindi senza
modifiche, se non il renderla pubblica)?
Se hai paura dell'overhead dato dalla query, puoi aggiungere un membro
private a quella classe e modificare il metodo in modo da eseguire la
query solo se i dati non sono ancora stati caricati.
Ma sei sicuro di volere da questo metodo sempre i dati che erano
presenti all'avvio dell'applicazione e non, magari, quelli più
aggiornati?
 
Saluti
Paolo Arosio

 diventa conosciuta alle altre unit se non la dichiaro nella sez interface?
 
Infatti la devi dichiarare nella sezione *interface*, se decidi di scegliere quella strada.


Quindi attualmente hai gia' un metodo di una classe che restituisce la
stringList che ti interessa.
Cosa ti interessa se viene richiamata anche da altri (quindi senza
modifiche, se non il renderla pubblica)?
Se hai paura dell'overhead dato dalla query, puoi aggiungere un membro
private a quella classe e modificare il metodo in modo da eseguire la
query solo se i dati non sono ancora stati caricati.
Ma sei sicuro di volere da questo metodo sempre i dati che erano
presenti all'avvio dell'applicazione e non, magari, quelli più
aggiornati?
 
Saluti
Paolo Arosio
 
Mi sembrava inefficiente rieseguire sempre la query per riottenere ogni 
volta quello che avrei già disponibile. I dati reperiti sono codici e 
descrizioni immodificabili (almeno dall'utente), per cui raccoglierò il tuo 
suggerimento di eseguire la query solo se non  è stata eseguita. Questa 
funzione che restituisce la stringList però, finora era una funzione private 
di un form. La StringList viveva solo il tempo della proc Create del form, 
dove la StringList era dichiarata. La mia domanda era: come faccio a far 
conoscere la StringList ad altre unit, a parte spostare la dichiarazione 
della StringList alla sezione Interface ? 
 

 della StringList alla sezione Interface ?
 
Mettila in un DataModule che venga creato all'avvio dell'applicazione, inizializzandola in fase di creazione del modulo stesso (dopo che il Data Module che contiene i componenti di connessione ai dati è stato inizializzato e la connessione è stata aperta) ed esponi il riferimento alla TStringList come proprietà del DataModule che lo contiene.


 della StringList alla sezione Interface ?
 
Personalmente non farei conoscere la StringList ad alcun altro, a meno
che questo qualcuno debba effettivamente accedere a una cosa di questo
tipo.
In realtà, chi dovrebbe usarla, di cosa ha bisogno?
 
 
TBaseConfig=class
private
  fData: TStringList;
protected
  procedure Load(); virtual;
public
  constructor Create;
  destructor Destroy override;
  property numParams: integer read getNumParams;
  property Params[i: integer]: string read getParam(i: integer);
  property ParamByName[name: string]: string read getParamByName(name:
string);
end;
 
La puoi istanziare come suggerisce Marco in un DataModule e la
richiami da dove vuoi, oppure semplicemente nella sezione
inizialization della sua unit.
 
Saluti
Paolo Arosio