GARANTIR DESCONTO

Fórum Dúvida sobre TList #365171

16/10/2008

0

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

Responder

Posts

16/10/2008

Carlosib

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.


Responder

Gostei + 0

16/10/2008

Bianchini

Carlos..

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


Responder

Gostei + 0

16/10/2008

Carlosib

sim ele seria destuído quando:

1) ListaPessoas.Delete(_idxPessoa)

OU

2) ListaPessoas.Free

O que ocorrer primeiro.


Responder

Gostei + 0

16/10/2008

Bianchini

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??


Responder

Gostei + 0

16/10/2008

Carlosib

isso mesmo


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar