Manipulando Coleções com Generics – TDictionary no Delphi

Generics – TDictionary no Delphi
TDictionary no Delphi

Introdução

Neste post iremos abordar sobre Generics – TDictionary no Delphi, que é uma classe poderosa.

O Delphi é uma poderosa ferramenta de desenvolvimento que oferece diversos recursos para manipulação de coleções de dados, como arrays, listas e dicionários. Uma das classes genéricas mais úteis para manipular pares de chave-valor é o TDictionary<TKey, TValue>, que faz parte da biblioteca System.Generics.Collections. Vamos explorar o uso do TDictionary, destacando suas vantagens e desvantagens.

Uso de TDictionary

O TDictionary<TKey, TValue> é uma classe genérica que permite armazenar e acessar dados em pares de chave e valor. Essa estrutura é ideal para cenários onde você precisa buscar rapidamente um valor com base em uma chave única.

Vantagens do uso de TDictionary

  • Busca eficiente: A estrutura interna de TDictionary oferece uma busca rápida por chaves, tornando-o ideal para grandes volumes de dados.
  • Flexibilidade: Por ser uma classe genérica, você pode usá-la com diferentes tipos de chave e valor, de acordo com as necessidades do seu projeto.
  • Leitura fácil: O uso de chaves descritivas melhora a legibilidade do código, permitindo identificar facilmente os valores armazenados.

Desvantagens do uso de TDictionary

  • Consumo de memória: Em alguns casos, o TDictionary pode consumir mais memória comparado a outras estruturas, como arrays ou listas simples, devido à sua arquitetura interna.
  • Ordenação: O TDictionary não mantém os elementos em uma ordem definida. Se a ordem de inserção ou uma ordenação específica for importante, será necessário usar outras estruturas ou tratamentos.
  • Complexidade: Para tarefas simples, como armazenar um pequeno conjunto de dados, o uso de TDictionary pode ser excessivo.

Práticas recomendadas

  • Verificar existência de chaves antes de acessar valores: Utilizar o método ContainsKey é fundamental para evitar exceções ao tentar acessar uma chave inexistente.
  • Liberação de recursos: Sempre chame Free para liberar a memória alocada pelo TDictionary após o uso, evitando vazamentos de memória.
  • Uso de pares complexos: Se precisar usar chaves ou valores que sejam objetos complexos, assegure-se de que o gerenciamento de memória está corretamente implementado.

Exemplo de Aplicação VCL Usando TDictionary

Imagine que você está criando uma aplicação de gerenciamento de contatos onde cada contato é armazenado em um TDictionary com o nome como chave e o número de telefone como valor.

1. Criando a Interface da Aplicação

Comece criando um novo projeto VCL:

  • No Delphi, clique em File > New > VCL Forms Application – Delphi.
  • Adicione os seguintes componentes ao formulário:
  • 2 TEdit para entrada de dados (um para o nome e outro para o número de telefone).
  • 3 TButton para adicionar, mostrar e excluir contatos.
  • 1 TMemo para exibir os contatos armazenados.

2. Criando o Código para Manipular o TDictionary

Adicione o seguinte código ao formulário para criar e gerenciar o TDictionary.

uses
  System.SysUtils, System.Generics.Collections, Vcl.Forms, Vcl.StdCtrls, Vcl.Controls, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    EditName: TEdit;
    EditPhone: TEdit;
    BtnAddContact: TButton;
    BtnShowContacts: TButton;
    BtnDeleteContact: TButton;
    MemoContacts: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure BtnAddContactClick(Sender: TObject);
    procedure BtnShowContactsClick(Sender: TObject);
    procedure BtnDeleteContactClick(Sender: TObject);
  private
    Contacts: TDictionary<String, String>;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Inicializa o dicionário
  Contacts := TDictionary<String, String>.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // Libera o dicionário ao fechar o formulário
  Contacts.Free;
end;

procedure TForm1.BtnAddContactClick(Sender: TObject);
var
  Name, Phone: String;
begin
  Name := EditName.Text;
  Phone := EditPhone.Text;

  if (Name = '') or (Phone = '') then
  begin
    ShowMessage('Por favor, preencha ambos os campos.');
    Exit;
  end;

  // Adiciona ou atualiza o contato no dicionário
  Contacts.AddOrSetValue(Name, Phone);
  ShowMessage(Format('Contato %s adicionado/atualizado com sucesso.', [Name]));
  EditName.Clear;
  EditPhone.Clear;
end;

procedure TForm1.BtnShowContactsClick(Sender: TObject);
var
  Pair: TPair<String, String>;
begin
  MemoContacts.Clear;
  for Pair in Contacts do
  begin
    MemoContacts.Lines.Add(Format('Nome: %s, Telefone: %s', [Pair.Key, Pair.Value]));
  end;
end;

procedure TForm1.BtnDeleteContactClick(Sender: TObject);
var
  Name: String;
begin
  //Deleta o contato a partir do nome digitado
  Name := EditName.Text;

  if Contacts.ContainsKey(Name) then
  begin
    Contacts.Remove(Name);
    ShowMessage(Format('Contato %s removido com sucesso.', [Name]));
    EditName.Clear;
  end
  else
  begin
    ShowMessage(Format('Contato %s não encontrado.', [Name]));
  end;
end;

3. Explicação do Código

  • FormCreate: Inicializa o dicionário Contacts quando o formulário é criado.
  • FormDestroy: Libera a memória do dicionário ao fechar o formulário para evitar vazamentos de memória.
  • BtnAddContactClick: Adiciona um novo contato ao dicionário. Se o nome já existir, o método AddOrSetValue atualiza o valor existente.
  • BtnShowContactsClick: Itera pelo dicionário usando um loop for...in para mostrar todos os contatos no TMemo.
  • BtnDeleteContactClick: Verifica se um contato existe usando ContainsKey e o remove com Remove.

4. Explicando o Funcionamento de Cada Parte

  • TDictionary: A estrutura usada para armazenar os contatos, onde a chave é o nome e o valor é o número de telefone.
  • AddOrSetValue: Adiciona uma nova entrada ou atualiza uma existente, facilitando a manutenção dos dados.
  • ContainsKey: Método útil para verificar a existência de uma chave antes de executar operações de exclusão.
  • Remove: Remove um par de chave-valor específico.

Veja abaixo a ilustração do projeto:

Ilustração do projeto.

Código fonte do exemplo

Você pode fazer o download do exemplo do projeto através do repositório do github:

https://github.com/Gisele-de-Melo/generics_tdictionary

Conclusão

O TDictionary<TKey, TValue> é uma ferramenta robusta no Delphi para manipulação de dados em pares de chave-valor, oferecendo flexibilidade e performance em buscas. No entanto, é importante considerar as suas características e limitações antes de utilizá-lo em projetos. Seguindo as práticas recomendadas, você pode garantir que o uso do TDictionary seja eficaz e seguro.

Esse exemplo mostra como o TDictionary pode ser utilizado em uma aplicação VCL real para gerenciar contatos de forma eficiente. A estrutura genérica do TDictionary permite uma busca rápida e um código mais legível, ideal para projetos que requerem operações de chave-valor.

Posts Relacionados


Livros + e-books

Delphi para Android e iOS

codedelphi.com
codedelphi.com

Delphi Start

codedelphi.com

Programando em Delphi XE

Aprenda programar Delphi

Banco de Dados RAD Delphi

Delphi Programming Projects

Deixe um comentário