
Índice
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 peloTDictionary
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 noTMemo
. - BtnDeleteContactClick: Verifica se um contato existe usando
ContainsKey
e o remove comRemove
.
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:

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
Delphi para Android e iOS
Delphi Start
Programando em Delphi XE
Aprenda programar Delphi
Banco de Dados RAD Delphi
Delphi Programming Projects