Newsgroup: it.comp.lang.delphi
Titolo: Informazioni aggiuntive lista

 
          Salve ho la necessita di memorizzare in una TListBox delle tabelle ed ad
ogni tabella di associare delle informazioni aggiuntive.
Ho visto che gli items della tabella hanno la proprietą objects che dovrebbe
essere un elenco di puntatori.
cosi mi sono definito una mia classe con il seguente codice
type
  TInfoJoin=class
      FieldSource:string;
      FieldTarget:string;
  end;
type
  TForm3 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
e ciclando la lista delle tabella del db aggiungo alla listbox:
procedure TForm3.cmdAddClick(Sender: TObject);
    var sNewItem:string;
    var NewItemData:TInfoJoin;
    var iNewIndex:integer;
begin
    newItemData.create;
    do ......................begin
        newItemData.create;
        iNewIndex:=lbTabelleTgt.Items.Add (sNewItem);
         lbTabelleTgt.Items.Objects[iNewIndex]:=newItemData;
    end
quello che ottengo perņ e che gli objects puntano tutti all'ultimo oggetto
newItemData che ho inserito.
Uso D5.
Spero qualcuno possa aiutarmi, Grazie.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

    end
-- 
Ore 18.30: premo invio.


grazie, purtroppo lavoro in delphi solo da pochi giorni e faccio ancora
degli errori pacchiani, cmq adesso ho corretto i problemi, solo che mi
rimane ancora un dubbio..
l'oggetto NewItemData lo passa ad una funzione che in base a certe
condizioni lo valorizza, io avevo pensato di passargileo senza fare la
create, poi se deve valorizzarlo lo crea la funzione altrimenti no.
credevo che per verificare se fosse stato creato il controllo da fare fosse
NewItemData=nil
invece anche senza create esso non vale mai nil, forse il nil vale solo per
i puntatori?
se si come si fa a aspere se un oggetto è stato istanziato?


se si come si fa a aspere se un oggetto è stato istanziato?
Delphi non inizializza le variabili (a parte le stringhe ma non è
sempre vero).
Nel tuo caso, però, non mi ben chiaro cosa intendi.
Tu hai una listbox che contiene al suo interno una collezione di
puntatori (objects[]) inizialmente a nil.
La tua funzione sarà qualcosa del tipo 
MiaFunzione( lbTabelleTgt.Items.Objects[iNewIndex])
Se l'oggetto è stato istanziato e assegnato alla lista ci potrai
lavorare, altrimenti il parametro sarà a nil.
in pratica se devi istanziare farai
 iNewIndex:=lbTabelleTgt.Items.Add (sNewItem);
 lbTabelleTgt.Items.Objects[iNewIndex]:=newItemData;
altrimenti
 iNewIndex:=lbTabelleTgt.Items.Add (sNewItem);
 lbTabelleTgt.Items.Objects[iNewIndex]:= nil;
La seconda istruzione non è necessaria, ma forse rende il codice più
pulito.
Nel momento in cui rilasci un oggetto usa FreeAndNil in modo tale da
essere sicuro che il puntatore sia nullo, in quanto il semplice free
rilascia la memoria ma non rimuove l'indirizzo a cui puntava e quindi
il controllo Assigned() fallisce.
Ciao.



Ho capito quello che dici, e sicuramente rappresenta una soluzione, a me
però rimane il seguente dubbio...
io definisco una classe
Type TPippo=class
    pluto:string;
end;
poi in una routine dichiaro var objPippo:TPippo;
il mio dubbio è: perchè prima che io faccio il create la variabile objPippo
non è nil?


non è nil?
Perché Delphi non inizializza le variabili.
L'unica soluzione per le variabili a scope locale è
var P, Q, R: TPippo;
begin
  P := nil;
  Q := nil;
  R := nil;
e poi, nel caso
  P := TPippo.Create;
