Newsgroup: it.comp.lang.delphi
Titolo: TList e puntatori

Ho scritto il seguente programma:
type
  PTListView = ^TPInfo;
  TPInfo = record
    a: String;
    b: Cardinal;
  end;
----------------------------------------------------------------------
var
  a: String;
  b: Cardinal;
  ListView: TList;
  ListViewTmp: PTListView;
  ListViewTmp1: PTListView;
    begin
    ListView:=TList.Create();
    New(ListViewTmp1);
    ListViewTmp1^.a:='OK';
    ListViewTmp1^.b:=10;
    ListView.Add(ListViewTmp1);
    Dispose(ListViewTmp1);
    ListViewTmp:=ListView.Items[0];
    a:=ListViewTmp.a;
    b:=ListViewTmp.b;
    ListView.Free();
    end;
però i valori assegnati alle variabili "a" e "b" sono casuali; stranamente
eliminando Dispose tutto funziona, però non riesco a capirne il motivo,
poiché Dispose dovrebbe soltanto liberare la memoria allocata per il
puntatore ListViewTmp1.
Qualcuno saprebbe dirmi perché ed eventualmente come deallocare
correttamente ListViewTmp1?
Grazie.
Alex.

Con New(ListViewTmp1) allochi memoria per la struttura per cui hai tipizzato
il puntatore ListViewTmp1 che č di tipo PTListView
 type
   PTListView = ^TPInfo;
   TPInfo = record
     a: String;
     b: Cardinal;
   end;
Se esegui un Dispose(ListViewTmp1) deallochi la memoria allocata in
precedenza e elimini quindi la il record TPInfo. Ecco perchč i valori che
ottieni sono casuali.
Il Dispose lo devi effettuare quando hai finito di utilizzare i dati
contenuti nei records TPInfo, per esempio alla chiusura del programma.
Potresti provare ad inserire il Dispose dopo
ListView.Free();
Spero di aver capito il problema e di averti fornito un aiuto, anche se
l'esposizione non č delle migliori!!!!!!!!
Ciao.

eliminando Dispose tutto funziona, perň non riesco a capirne il motivo,
E' logico che sia cosi'.
Se allochi memoria per un oggetto non puoi deallocarla per
il tutto il tempo in cui lo utilizzi.
procedure TForm1.Button1Click(Sender: TObject);
var MiaLista : TList ;
    MioOggetto : ^Integer ;
    I : Integer ;
begin
  // istanzio la mia lista
  MiaLista := TList.Create ;
  // alloco 5 oggetti e gli aggiungo
  // mano a mano alla lista
  for I := 1 to 5 do
  begin
    New(MioOggetto) ;
    MioOggetto^ := 5 ;
    MiaLista.Add(MioOggetto) ;
  end ;
  // visualizzo i valori di tutti
  // gli elementi della lista
  for I := 0 to MiaLista.Count - 1 do
  begin
    ShowMessage(IntToStr(I)) ;
  end ;
  // ora che non mi servono piu'
  // dealloco tutti gli elementi precedentemente
  // allocati
  for I := 0 to MiaLista.Count - 1 do
  begin
    Dispose(MiaLista.Items[I]) ;
  end ;
  // infine, libero l'istanza della lista
  MiaLista.Free ;
end ;
--
Naquern Yansbetevn
naquern.y...@africamail.com

  end ;
Mai postare codice dopo le 23.00 !!! :-)
Cosi' mostri il valore dellavfariabile del ciclo for, non del puntatore.
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"

Cosi' mostri il valore dellavfariabile del ciclo for, non del puntatore.
ROTFL ! e' vero ... :)
Lo dicevo che funzionava bene !
Ovviamente va sostituito con :
for I := 0 to MiaLista.Count - 1 do
begin
  ShowMessage(MiaLista.Items[I]) ;
end ;
Spero di non aver detto cazzate, pur avendo spedito il
messaggio alle 18.34...
--
Naquern Yansbetevn
naquern.y...@africamail.com

Spero di non aver detto cazzate
AAAAAAAAAAAAAAAHHH...
ShowMessage(IntToStr(MiaLista.Items[I]^)) ;
--
Naquern Yansbetevn
naquern.y...@africamail.com

Grazie a tutti. Adesso č tutto chiaro.
Saluti.
Alex