Newsgroup: it.comp.lang.delphi
Titolo: TStringList e AddObject

Ciao a tutti,
ho la necessità di associare ad ogni elemento di una StringList 4 valori
numerici. Cercando un po' nel NG, ho visto qualche post in cui si diceva di
usare AddObject. Ho fatto qualche prova prima di usarlo, ma qualcosa non mi
torna:
- Ho provato a creare una classe contenente i miei 4 campi numerici, ma
quando poi vado a leggere gli elementi aggiunti con AddObject, in tutti
leggo gli ultimi 4 che ho inserito.
Qualche suggerimento?
Grazie, Mario
Questa è la classe:
  TMyHandClass = class(TObject)
  private
    FNum1: Integer;
    FNum2: Integer;
    FNum3: Integer;
    FNum4: Integer;
  public
    property Num1:Integer read FNum1 write FNum1;
    property Num2:Integer read FNum2 write FNum2;
    property Num3:Integer read FNum3 write FNum3;
    property Num4:Integer read FNum4 write FNum4;
  end;
Questa è la routine di lettura/scrittura della StringList:
procedure TForm1.Button1Click(Sender: TObject);
var Lista:TStringList;
    VarHandle:TMyHandClass;
    Idx:Integer;
    St:String;
begin
  ListBox2.Clear;
  Lista:=TStringList.Create;
  VarHandle:=TMyHandClass.Create;
    for Idx:=1 to 10 do begin
      St:='Descri ' + IntToStr(Idx);
      with VarHandle do begin
        Num1:=100 + Idx;
        Num2:=200 + Idx;
        Num3:=300 + Idx;
        Num4:=400 + Idx;
      end;
      Lista.AddObject(St,TObject(Pointer(VarHandle)));
    end;
    Lista.Sort;
    ListBox1.Items.Assign(Lista);
 
 
    for Idx:=0 to Lista.Count - 1 do begin
      VarHandle:=Lista.Objects[Idx] as TMyHandClass;
      ListBox2.Items.Add(IntToStr(VarHandle.Num1) +
                         ' - ' +
                         IntToStr(VarHandle.Num2) +
                         ' - ' +
                         IntToStr(VarHandle.Num3) +
                         ' - ' +
                         IntToStr(VarHandle.Num4));
    end;
 
  VarHandle.Free;
  Lista.Free;
end;
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

      Lista.AddObject(St,TObject(Pointer(VarHandle)));
Lista.AddObject(St, VarHandle);

     end;
A.

    end;
for Idx := 1 to 10 do begin
  VarHandle .= TMyHandClass.Create;
  St := 'Descri '+ IntToStr(Idx);
  with VarHandle do begin
    ...
  end; 
  Lista.AddObject(St, VarHandle);
end;


Perfetto !!! Scusa la curiosità, quando alla fine faccio il Free della
StringList basta quella per liberare la memoria usata dai 10 oggetti che ho
creato oppure no?
Grazie ancora, Mario


creato oppure no?
Ovviamente no.  Non sarebbe corretto che il contenitore prendesse di
tali decisioni.  In ogni caso, impara a consultare l'help:
"AddObject method (TStringList)
...
The TStringList object does not own the objects you add this way.
Objects added to the TStringList object still exist even if the
TStringList instance is destroyed. They must be explicitly destroyed
by the application."

 tali decisioni.
Bè, dipende dall'uso che ne vuoi fare. Delphi mette a disposizione la classe 
TObjectList che si occupa delle distruzione degli oggetti in lista se così 
gli viene specificato tramite il parametro del suo .Create.
Acqua 

gli viene specificato tramite il parametro del suo .Create.
Appunto, viene data la scelta al programmatore mediante il settaggio
di OwnsObjects.

 di OwnsObjects.
Meglio una classe con un parametro nel suo .Create che due classi diverse :p
Acqua 

Meglio una classe con un parametro nel suo .Create che due classi diverse :p
A voler essere pignoli, è meglio avere due classi distinte, anche per
ragioni di performance (se so di non voler la deallocazione implicita,
uso la versione che non controlla se deve liberare gli oggetti) e
comunque non so cosa c'entri questo con quanto si sta dicendo... :-P

 e comunque non so cosa c'entri questo con quanto si sta dicendo... :-P
Ma voleva essere una pareeeeeentesi. -> () :P:P:P
Acqua