logotipo Blog Giovani Da Cruz
Delphi

Entendendo o Uso de TList e TObjectList no Delphi

6 min de leitura 183 visualizações
Entendendo o Uso de TList e TObjectList no Delphi
Comparando classes TList e TObjectList do Delphi

 

Quando se trabalha com coleções de dados no Delphi, as classes TList e TObjectList são ferramentas indispensáveis. Embora tenham semelhanças, cada uma possui características específicas que as tornam úteis em situações diferentes. Este artigo explora suas diferenças, apresenta exemplos práticos e fornece dicas para o melhor uso em seus projetos.

 

O que é o TList?

O TList é uma classe genérica que permite armazenar uma coleção de elementos, sejam eles objetos, números, ou outros tipos de dados. Ele oferece flexibilidade, mas exige que o desenvolvedor gerencie a memória manualmente ao lidar com objetos.

 

Exemplo Básico de Uso do TList

uses
  System.Generics.Collections;

var
  Lista: TList<Integer>;
  I: Integer;
begin
  Lista := TList<Integer>.Create;
  try
    // Adiciona elementos à lista
    Lista.Add(10);
    Lista.Add(20);
    Lista.Add(30);

    // Iteração simples
    for I in Lista do
      Writeln(I);
  finally
    Lista.Free; // Libera a memória da lista
  end;

  Readln;
end.

Principais Métodos do TList

O TList oferece diversos métodos úteis para manipular os elementos armazenados:

  • Add(Item): Adiciona um elemento à lista.
  • Remove(Item): Remove a primeira ocorrência do elemento especificado.
  • Delete(Index): Remove o elemento na posição especificada.
  • Clear(): Remove todos os elementos da lista.
  • Count: Propriedade que retorna o número de elementos na lista.
  • Contains(Item): Verifica se o elemento especificado está na lista.
  • IndexOf(Item): Retorna o índice do primeiro elemento encontrado, ou -1 se não encontrado.
  • Insert(Index, Item): Insere um elemento em uma posição específica.
  • Sort(Comparer): Ordena os elementos da lista usando um comparador personalizado.

 

Cuidados ao Usar Objetos no TList

Se o TList contiver objetos, o desenvolvedor deve garantir que cada objeto seja explicitamente destruído para evitar vazamentos de memória:

uses
  System.Generics.Collections;

type
  TMeuObjeto = class
    Nome: string;
  end;

var
  Lista: TList<TMeuObjeto>;
  Obj: TMeuObjeto;
begin
  Lista := TList<TMeuObjeto>.Create;
  try
    // Adiciona objetos à lista
    Obj := TMeuObjeto.Create;
    Obj.Nome := 'Exemplo';
    Lista.Add(Obj);

    // Libera os objetos manualmente
    for Obj in Lista do
      Obj.Free;

    // Limpa a lista após liberar os objetos
    Lista.Clear;
  finally
    Lista.Free;
  end;

  Readln;
end.

O que é o TObjectList?

O TObjectList é uma especialização do TList projetada especificamente para armazenar objetos. Sua principal vantagem é a capacidade de gerenciar automaticamente a memória dos objetos contidos, desde que a propriedade OwnsObjects esteja definida como True (padrão).

Exemplo Básico de Uso do TObjectList

uses
  System.Generics.Collections;

type
  TMeuObjeto = class
    Nome: string;
  end;

var
  Lista: TObjectList<TMeuObjeto>;
begin
  Lista := TObjectList<TMeuObjeto>.Create(True); // OwnsObjects = True
  try
    // Adiciona objetos à lista
    Lista.Add(TMeuObjeto.Create);
    Lista.Last.Nome := 'Primeiro Objeto';

    // Objetos serão automaticamente destruídos ao liberar a lista
  finally
    Lista.Free;
  end;

  Readln;
end.

Métodos Adicionais do TObjectList

O TObjectList herda todos os métodos do TList e adiciona funcionalidades específicas para lidar com objetos:

  • OwnsObjects: Propriedade que define se os objetos da lista devem ser destruídos automaticamente quando removidos ou quando a lista é liberada. Por padrão, é True.
  • Extract(Item): Remove o objeto da lista sem destruí-lo, retornando uma referência ao mesmo.
  • FreeAndNil(Item): Remove o objeto da lista e o libera imediatamente.

Esses métodos tornam o TObjectList ideal para gerenciar coleções de objetos em projetos maiores, garantindo que o gerenciamento de memória seja mais seguro e simplificado.

 

 

Principais Diferenças entre TList e TObjectList

 

 

Trabalhando com Exemplos Avançados

Iterando Sobre Objetos com TObjectList

O TObjectList permite manipular diretamente os objetos armazenados. Veja um exemplo de como iterar e modificar objetos:

uses
  System.Generics.Collections, System.SysUtils;

type
  TProduto = class
    Nome: string;
    Preco: Double;
  end;

var
  Produtos: TObjectList<TProduto>;
  Produto: TProduto;
begin
  Produtos := TObjectList<TProduto>.Create(True);
  try
    // Adiciona produtos
    Produto := TProduto.Create;
    Produto.Nome := 'Produto A';
    Produto.Preco := 100.0;
    Produtos.Add(Produto);

    Produto := TProduto.Create;
    Produto.Nome := 'Produto B';
    Produto.Preco := 200.0;
    Produtos.Add(Produto);

    // Exibe informações dos produtos
    for Produto in Produtos do
      Writeln(Format('%s: R$%.2f', [Produto.Nome, Produto.Preco]));
  finally
    Produtos.Free;
  end;

  Readln;
end.

 

Filtrando Objetos em TObjectList

É possível implementar filtros simples com TObjectList para trabalhar apenas com objetos que atendem a certos critérios:

uses
  System.Generics.Collections, System.SysUtils;

type
  TProduto = class
    Nome: string;
    Preco: Double;
  end;

function ProdutosCaros(Lista: TObjectList<TProduto>; Limite: Double): TObjectList<TProduto>;
var
  Produto: TProduto;
begin
  Result := TObjectList<TProduto>.Create(False); // False porque não queremos que Result destrua os objetos originais.
  
  for Produto in Lista do 
    if Produto.Preco > Limite then 
      Result.Add(Produto);
end;

var 
  Produtos, ProdutosFiltrados: TObjectList<TProduto>; 
  Produto: TProduto; 
begin 
  Produtos := TObjectList<TProduto>.Create(True); 
  try 
    // Adiciona produtos 
    Produto := TProduto.Create; 
    Produto.Nome := 'Produto A'; 
    Produto.Preco := 150.0; 
    Produtos.Add(Produto);

    Produto := TProduto.Create;
    Produto.Nome := 'Produto B';
    Produto.Preco := 50.0;
    Produtos.Add(Produto);

    Produto := TProduto.Create;
    Produto.Nome := 'Produto C';
    Produto.Preco := 300.0;
    Produtos.Add(Produto);

    // Filtra produtos acima de R$100
    ProdutosFiltrados := ProdutosCaros(Produtos, 100.0);
    try
      for Produto in ProdutosFiltrados do
        Writeln(Format('%s: R$%.2f', [Produto.Nome, Produto.Preco]));
    finally
      ProdutosFiltrados.Free;
    end;

  finally 
    Produtos.Free; 
  end; 

  Readln;
end.

 

Considerações Finais

O uso de `TList` e `TObjectList` no Delphi oferece poderosas ferramentas para lidar com coleções de dados e objetos. Enquanto o `TList` é ideal para maior flexibilidade, o `TObjectList` simplifica o gerenciamento de memória em coleções de objetos. Entender seus métodos e diferenças é crucial para decidir qual usar em cada contexto, garantindo desempenho e segurança no desenvolvimento de suas aplicações.

Se você está iniciando ou buscando aprimorar seus conhecimentos em Delphi, experimentar os exemplos deste artigo será um ótimo ponto de partida!

 

 

💬 Sua opinião importa!

Adoramos ouvir nossos leitores! Tem alguma dúvida, sugestão ou experiência para compartilhar sobre o tema?

Deixe seu comentário abaixo! 📣

Vamos conversar e aprender juntos! 🚀

 

 

💻 Compartilhe o post com outras pessoas se ele te ajudou! 😊

 

 

 

📚 Obrigado por acompanhar até aqui! Explore outros posts relacionados no blog e continue evoluindo suas habilidades. Tem mais conteúdos sobre diversos assuntos te esperando! 👩‍💻 🔍✨

Até o próximo post. Valeu! 👋📖

 

 

 

#Delphi #Programação #DesenvolvimentoDeSoftware

#TList #TObjectList #DicasDelphi #CodeTips

#DevLife #ComunidadeTech

#GiovaniDaCruz

 

 

 

Deixe um comentário

Seu e-mail não será publicado.