Dúvida sobre TList
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.
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
Curtidas 0
Respostas
Carlosib
16/10/2008
amigo use TObjectList.
Adicione a unit Contnrs
Segue abaixo um pequeno exemplo:
Olhe os métodos... delete..clear...indexOf... entre outros...
É bem simples de usar.
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
16/10/2008
Carlos..
mas nesse caso o obejto _p tb seria destriudo da memoria?? junto com seu ponteiro?
mas nesse caso o obejto _p tb seria destriudo da memoria?? junto com seu ponteiro?
GOSTEI 0
Carlosib
16/10/2008
sim ele seria destuído quando:
1) ListaPessoas.Delete(_idxPessoa)
OU
2) ListaPessoas.Free
O que ocorrer primeiro.
1) ListaPessoas.Delete(_idxPessoa)
OU
2) ListaPessoas.Free
O que ocorrer primeiro.
GOSTEI 0
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??
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
16/10/2008
isso mesmo
GOSTEI 0