Dúvida sobre TList

Delphi

16/10/2008

Prezados,

Gostaria de saber algumas coisas sobre o seguinte código:

Var

Lista: TList;

begin
Lista := TList.Create;

Lista.Add(TMinhaClasse.Create);

//Primeira duvida
Lista.Clear; //Isso vai limpar o objeto e o ponteiro criado pela TMinhaClasse??

//Segunda duvida
TMinhaClasse(Lista[0]).Free;
Lista[0] := nil;
//A rotina acima é mais garantida que o Lista.Clear ??

end;

Qual a melhor maneira de se incluir objetos em um TList e depois, quando eu quiser apaga-los, garantir que estes objetos criados não permanecem em memória? Nem seus ponteiros?

Obrigado.


Bianchini

Bianchini

Curtidas 0

Respostas

Carlosib

Carlosib

16/10/2008

amigo use TObjectList.

TObjectList maintains a list of (owned) objects. Unit Contnrs 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.


Adicione a unit Contnrs

Segue abaixo um pequeno exemplo:
  TmyClass = class
    _nome : string;
    _idade : integer;
  end;

  TForm1 = class(TForm)
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    _p : TmyClass;
    ListaPessoas : TObjectList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
  _p : TmyClass;
begin
 if not Assigned(ListaPessoas) then
   ListaPessoas := TObjectList.Create(true); 
 _p := TmyClass.Create;
 _p._nome := ´Pedro Paulo de Souza´;
 _p._idade := 19;
 //Adicionando a pessoa na lista
 ListaPessoas.Add(_p);


 //Lendo a pessoa da lista....
 // TmyClass(ListaPessoas.Items[indice])._nome
 showMessage(TmyClass(ListaPessoas.Items[0])._nome);

 //Caso vc deseje percorrer a lista
 //for _idx :=0 to ListaPessoas.Count-1 do
 //showMessage(TmyClass(ListaPessoas.Items[_idx])._nome);


 //Limpando a lista
 FreeAndNil(ListaPessoas);
end;



Olhe os métodos... delete..clear...indexOf... entre outros...

É bem simples de usar.


GOSTEI 0
Bianchini

Bianchini

16/10/2008

Carlos..

mas nesse caso o obejto _p tb seria destriudo da memoria?? junto com seu ponteiro?


GOSTEI 0
Carlosib

Carlosib

16/10/2008

sim ele seria destuído quando:

1) ListaPessoas.Delete(_idxPessoa)

OU

2) ListaPessoas.Free

O que ocorrer primeiro.


GOSTEI 0
Bianchini

Bianchini

16/10/2008

Desculpe minha insistência, mas ainda tenho uma duvida....

E se eu fizer o seguinte:

ListaPessoas.Add(TmyClass.Create);

??

Quando eu invocasse o ListaPessoas.Clear o objeto criado por TmyClasse.Create tb seria destruido??

teria o mesmo efeito??


GOSTEI 0
Carlosib

Carlosib

16/10/2008

isso mesmo


GOSTEI 0
POSTAR