Newsgroup: it.comp.lang.delphi
Titolo: Aiuto! Non riesco a "friare" una TList!

Qualcuno sa dirmi cosa sbaglio nello scrivere questa procedura che
dovrebbe null'altro fare che friarmi una TList?
La TList che adopero contiene solo TStringList, č per questo che
utilizzo la var puntatore.
Da notare il "-2" nel ciclo for (non capisco perchč se metto "-1" cosě
come dovrebbe fare mi va crash)
---------------
Var
 ListaValori : TList;
 Puntatore   : TStringList; 
For X := 0 To ListaValori.Count -2 Do Begin
 Puntatore := ListaValori.Items[X];
 Puntatore.Free;
End;
ListaValori.Free;
Ho anche provato usando quest'altra sintassi
while ListaValori.Count > 0 do
 ListaValori.Delete(0);
ListaValori.Free;
...ma dal TaskManager noto che la memoria utilizzata sale sempre piů,
come se non mi "friasse" nulla!
Help me! 
Grazie a tutti
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 End;
Hai provato con:
For X:= 0 to ListaValori.Count-1 Do
 Begin
  If ListaValori.Items[X]<>Nil then ListaValori.Items[X].free
 End;
L'errore sull'ultimo elemento mi fa pensare ad un errore nel riempimento del
Tlist, che lascia l'ultimo elemento a NIL e quando fai il free dą errore
(giustamente)
Ciao
Matteo

 ListaValori.Free;
Per prima cosa di suggerisco di non utilizzare la parola "friare", č un tuo
neologismo e non ha molto senso, sarebbe meglio dire "fare il free"
Poi ti  suggerisco di utilizzare una TObjectList se devi metterci degli
oggetti, Fa il free dei componenti contenuti automaticamente.

 oggetti, Fa il free dei componenti contenuti automaticamente.
Con "Fa il free dei componenti contenuti automaticamente" intendi
che basta richiamare la procedura Free dell'oggetto senza preoccuparsi 
dei singoli oggetti in esso contenuti?
Grazie, Dario


Ops... me sa che c'è qualcosa che non va...
utilizzando quella sintassi mi dice che non va 
("record, object or class type required")
Perché? :(
Ciao


 ("record, object or class type required")
Scusa.. errore di sbaglio ;)
For X := 0 To ListaValori.Count -1 Do
 Begin
  Puntatore:= ListaValori.Items[X];
  IF Puntatore<>Nil then Puntatore.Free;
 End;
così va?
Se hai D5 o superiore, prova al posto di Free la funzione
FreeAndNil(Object)...
ciao
Matteo

 FreeAndNil(Object)...
 
Macchč.. sono ancora alla "vecchia" versione 4. La 5 non mi ha convinto
tanto e cosě son rimasto ancorato alla 4.
Ciao e grazie nuovamente
Dario


 E cosě devo usare "count -2"... fa schifo ma almeno cosě funziona!
mmm... funziona fino al prossimo errore....esperienza personale :)
Come lo riempi la lista?
Posteresti la procedura?
Ciao
Matteo

 Matteo


 End;
Servito a niente ?

"Friare" non esiste e non vuol dire niente. In italiano si dice
"deallocare".
Ciao, Sandro

 Ciao, Sandro
mmm.... per me c'è troppa serietà in questo NG!


> mmm.... per me c'è troppa serietà in questo NG!
no, dai non prenderla cosi'.. il fatto e' che gia' l'italiano traduzione
dell'inglese tecnico e' una tragedia ("deallocare", pur essendo il termine
corretto, fa ridere) .. se in piu' ci mettiamo pure a inventare neologismi,
andremo a finire che un giorno leggeremo "ho beginato la mia procedura" "ti
sei ricordato di friare la variabile?" "meglio repitare che waillare"
(repeat vs. while) e altri obbrobbri del genere. Quindi una preghiera per
tutti: se siete in dubbio, usate l'inglese, grazie :)
Ciao, Sandro

 wrote in message
news:a6ap2j$d3cvc$1...@ID-43509.news.dfncis.de...

Capisco il tuo punto di vista e ti do ragione. Però sono abbastanza
sicuro che chi
ha letto il mio messaggio abbia capito a cosa mi riferivo... e magari a
qualcuno è
anche scappato un sorriso. Quindi perchè negarci questi neologismi? Mica
offendono
qualcuno! 
...e comunque "ho beginato la mia procedura" è bellissimo! :)=
Ciao, Dario


Ciao Dario,
 certo che non offendono nessuno i neologismi, ci mancherebbe, ma per
restare tutti su una certa linea anche qualitativa di linguaggio cerchiamo
di evitarli, o almeno di usarli il meno possibile. Questo era il mio appello
:) Buon lavoro!
Ciao, Sandro

Ehi, ho un'idea...
Perchč non apriamo il NG it.comp.lang.delphi.neologismi ?
(Fix.......BUM !)
KZate a parte, sono d'accordo nel bocciare senza appello il termine
'friare'.
(Trovane una altro, Sam.....)
E dato che anche 'deallocare' č stato rimandato, potremmo usare il 'liberare
memoria', tanto per capirci...
ma... a proposito di capirci..
Hai capito niente del motivo per cui non funziona ? ( che forse era la cosa
piů importante... )

 come se non mi "friasse" nulla!
Il fatto che taskmanagerando non si displaya il friaggio della memoria
(ihihihi), puo' come ha detto Montanari essero dovuto al gestore della
memoria.
Il crashamento invece mi sembra quantomeno strano, a meno che non metti un
delete dentro al ciclo for.
ricorda che una cosa tipo:
for x:=0 to lista.count-1 do
 lista.delete(x);
da errore..
Pero' tu non hai riportato cosi', per cui non so.. inoltre che errore ti da?
Con crash intendi Access Violation, Out of Range, esplosione o cosa?
Il fatto che con -2 funzioni e' ancora piu' strano.. Mi fa pensare a quei
bug super-bastardi che sono generati da tutt'altra parte..
Facci sapere!             {MSX}

 più importante... )
io farei cosi':
for i:=lista.count-1 downto 0 do
 with TStringList(lista.items[i]) do begin
  clear; free;
 end;
(il clear e' giusto per maggior certezza che la memoria sia liberata).
Dovrebbe funzionare. Prova!
Ciao, Sandro

 End;
non funziona perche' tu tenti di distruggere il puntatore (e cioe'
l'elemento della lista) e non l'oggetto associato (vale a dire la
stringlist). Guarda il mio precedente messaggio per la soluzione corretta.
Ciao, Sandro

ListaValori.Free;
procedure TForm1.Button1Click(Sender: TObject);
var
  A, B, C: TStringList;
  MyList: TList;
begin
  MyList := TList.Create;
  try
    ShowMessage('Ora le creiamo...');
    MyList.Add(TStringList.Create);
    MyList.Add(TStringList.Create);
    MyList.Add(TStringList.Create);
    A := MyList.Items[0];
    B := MyList.Items[1];
    C := MyList.Items[2];
    A.Add('1 - eolo');
    A.Add('1 - mammolo');
    A.Add('1 - pisolo');
    B.Add('2 - gongolo');
    B.Add('2 - cucciolo');
    B.Add('2 - brontolo');
    C.Add('3 - dotto');
    C.Add('3 - frumbolo');
    C.Add('3 - pompolo');
    ShowMessage('Ora le visualizziamo...');
    ShowMessage(A.Text);
    ShowMessage(B.Text);
    ShowMessage(C.Text);
  finally
    ShowMessage('Ora le distruggiamo...');
    A.Free;
    B.Free;
    C.Free;
    MyList.Free;
  end;
  ShowMessage('Se mi vedi, allora hai capito tutto...');
end;
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

    C.Free;


 dei singoli oggetti in esso contenuti?
Dall'help in linea
Description
Use TObjectList to store and maintain a list of objects. TObjectList
provides properties and methods to add, delete, rearrange, locate, access,
and sort objects. If the OwnsObjects property is set to True (the default),
TObjectList controls the memory of its objects, freeing an object when its
index is reassigned; when it is removed from the list with the Delete,
Remove, or Clear method; or when the TObjectList instance is itself
destroyed.


 stringlist).
No.
Cio' che e' contenuto in ListaValori.Items[X] e' un puntatore.
Le istanze, in Object Pascal, sono, in realta', dei puntatori.
Quindi assegnare il valore di un puntatore (senza tipo) a un
altro puntatore (con tipo) e' del tutto lecito, cosi' come
usare il metodo Free su quest'ultimo puntatore (visto che
si tratta dell'istanza di una TStringList).
