Newsgroup: it.comp.lang.delphi
Titolo: Altro consiglio

Siccome vedo che ricevo buoni consigli, cerco di animare il newsgroup anche 
con domande non fondamentali- Ecco quest'altra:
Nella mia applicazione, ho parecchie funzioni che mostrano forms con diverso 
layout e contenuto, ma con qualche cosa in comune. Per esempio un comboBox 
che consente all'utente di indicare una scelta tra Istituti finanziari o 
Società di gestione.
Attualmente, al momento del richiamo di un form o dell'altro, il form 
chiamato si occupa di predisporre il combobox, lanciando una query per 
raccogliere gli istituti presenti e riempiendo il combo con il risultato. 
Poichè questo si ripete in 5 o 6 forms, ho fatto una proc che ho messo in 
una unit che tutti questi form richiamano, per poi crearsi il loro comboBox. 
Vuol dire che la query è ripetuta tante volte quante form accedo nella 
singola sessione.
Mi è venuta in mente una soluzione diversa che sarebbe: Da qualche parte 
eseguire la query in una funzione che ritorna una stringlist, che dovrebbe 
diventare disponibile a tutte le form che ne hanno bisogno per crearne il 
combobox.
-E' meglio?
-La StringList dovrebbe essere dichiarata dove, per essere conoscibile da 
tutti ?
-Potrei riconoscere che esiste (e che quindi la query è già stata eseguita) 
interrogandola con if assigned(..) ?
-E se invece di una lista di valori singoli, avessi bisogno di ritornare una 
lista di coppie di valori ?
Trovate la forza di rispondere. Grazie
 
 
---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com
 
 

Ciao Stark,
 
S> Mi è venuta in mente una soluzione diversa che sarebbe: Da qualche
S> parte eseguire la query in una funzione che ritorna una stringlist, che
S> dovrebbe diventare disponibile a tutte le form che ne hanno bisogno per
S> crearne il combobox.
S> -E' meglio?
 
Sicuramente è meglio, anche se io andrei anche ad utilizzare l'ereditarietà 
delle form...
 
S> -La StringList dovrebbe essere dichiarata dove, per essere conoscibile da
S> tutti ?
 
In un datamodule per esempio.
 
S> -Potrei riconoscere che esiste (e che quindi la query è già stata
S> eseguita) interrogandola con if assigned(..) ?
 
Certo: la dichiari privata nel datamodule e nel costruttore di quest'ultimo 
la assegni a nil. Poi esponi una proprietà, sempre sul datamodule, in sola 
lettura in questo modo:
 
property IstitutiFinanziari: TStringList read GetIstitutiFinanziari;
 
e nella funzione GetIstitutiFinanziari, se la tua Stringlist è nil la crei 
e la popoli; in tutti i casi la ritorni.
 
E' più difficile da spiegare che da fare :-)
 
S> -E se invece di una lista di valori singoli, avessi bisogno di ritornare 
una lista di coppie di valori ?
 
Puoi ritornare una lista di oggetti che hanno all'interno le proprietà con 
i valori.
 
In questo caso puoi utilizzare una TList o TObjectList (dipende) al posto 
della TStringList oppure una TList<T> o TObjectList<T> se la tua versione 
di Delphi ha i generici.
 
HTH,
David
 
 

"David"  ha scritto nel messaggio 
news:7f4ddcd6a3a0e8...@news.eternal-september.org...

Perfetto, grazie davvero. L'unica cosa che mi spaventa un pò è sostituire la 
StringList che conosco, con una TList che mi pare un oggetto più complesso. 
In effetti, l'esigenza di avere in ritorno coppie di valori discende dal 
fatto che c'è un flag che mi direbbe se l'istituto in lista può essere 
visibile a tutti o solo a chi ha una password. E' solo questo, ma mi pare 
che non ci sia altra soluzione... 


"David"  ha scritto nel messaggio 
news:7f4ddcd6a3a0e8...@news.eternal-september.org...
 
property IstitutiFinanziari: TStringList read GetIstitutiFinanziari;
 
e nella funzione GetIstitutiFinanziari, se la tua Stringlist è nil la crei
e la popoli; in tutti i casi la ritorni.
David
 
Ci ho pensato un pò su e mi è venuta un'altra domanda. La prima volta che 
uso "IstitutiFinanziari", la funzione popola la StringList. A questo punto 
la StringList  "istitutiFinanziari" una volta usata in un form va distrutta 
e poi quindi ricreata e ridistrutta ogni volta che uno degli enne form la 
utilizzano ? Altrimenti creerei istanze multiple, vero ? Oppure verifico la 
sua esistenza e la lascio in memoria fino a chiusura dell'applicazione ?
Ho capito bene ? Cosa è meglio, secondo te ? (o non ho capito niente?) 


Ciao Stark,
 
S> Ci ho pensato un pò su e mi è venuta un'altra domanda. La prima volta che
S> uso "IstitutiFinanziari", la funzione popola la StringList. A questo punto
S> la StringList "istitutiFinanziari" una volta usata in un form va distrutta
S> e poi quindi ricreata e ridistrutta ogni volta che uno degli enne form la
S> utilizzano ? Altrimenti creerei istanze multiple, vero ? Oppure verifico 
la
S> sua esistenza e la lascio in memoria fino a chiusura dell'applicazione ?
S> Ho capito bene ? Cosa è meglio, secondo te ? (o non ho capito niente?)
 
La seconda, ti posto un esempio con un TObjectList<T>:
 
{ TIstitutoFinanziario }
 
  TIstitutoFinanziario = class
  strict private
    FDescrizione: string;
    FVisibile: boolean;
  public
    constructor Create(const ADescrizione: string; const AVisibile: boolean);
 
    property Descrizione: string read FDescrizione;
    property Visibile: boolean read FVisibile;
  end;
 
constructor TIstitutoFinanziario.Create(
  const ADescrizione: string; const AVisibile: boolean);
begin
    inherited Create;
    FDescrizione := ADescrizione;
    FVisibile := AVisibile;
end;
 
{ TMyDataModule }
 
  TMyDataModule = class(TDataModule)
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  strict private
    FIstitutiFinanziari: TObjectList<TIstitutoFinanziario>;
 
    function GetIstitutiFinanziari: TObjectList<TIstitutoFinanziario>;
  public
    property IstitutiFinanziari: TObjectList<TIstitutoFinanziario>
      read GetIstitutiFinanziari;
  end;
 
procedure TMyDataModule.DataModuleCreate(Sender: TObject);
begin
    FIstitutiFinanziari := nil;
end;
 
procedure TMyDataModule.DataModuleDestroy(Sender: TObject);
begin
    if Assigned(FIstitutiFinanziari) then
        FIstitutiFinanziari.Free;
end;
 
function TMyDataModule.GetIstitutiFinanziari: TObjectList<TIstitutoFinanziario>;
begin
    if not Assigned(FIstitutiFinanziari) then
    begin
        FIstitutiFinanziari := TObjectList<TIstitutoFinanziario>.Create(True);
        // Popolo la lista
        FIstitutiFinanziari.Add(TIstitutoFinanziario.Create('Istituto 1', 
True));
        FIstitutiFinanziari.Add(TIstitutoFinanziario.Create('Istituto 2', 
True));
        FIstitutiFinanziari.Add(TIstitutoFinanziario.Create('Istituto 3', 
False));
    end;
 
    result := FIstitutiFinanziari;
end;
 
A livello di applicazione, nelle form, andrai ad utilizzare MyDataModule.IstitutiFinanziari 
che la prima volta verrà creato e popolato, tutte le altre volte (se non 
distruggi e ricrei il datamodule) utilizzerà quello creato e popolato in 
precedenza.
 
David