
Índice
Introdução
Gerenciar contatos é uma tarefa essencial no dia a dia, e criar uma aplicação em Delphi para isso pode ser um excelente projeto para iniciantes. Neste artigo, vamos desenvolver uma aplicação de Agenda de Contatos em Delphi, permitindo adicionar, editar, remover e buscar contatos. Durante o processo, aprenderemos a manipular componentes de interface, utilizar estruturas de dados e persistir dados para salvar e carregar contatos.
Passo a Passo
Passo 1: Configurando o Projeto
Criar um Novo Projeto
- Abrir o Delphi: Abra o Delphi e crie um novo projeto VCL Forms Application.
- Salvar o Projeto: Salve o projeto com um nome significativo, como “AgendaDeContatos”.
Adicionar Componentes
No formulário principal, adicione os seguintes componentes:
- TListBox: Para listar os contatos.
- TButton: Para adicionar, editar, remover, buscar e atualizar contatos.
- TEdit: Para entrada de dados dos contatos (nome, telefone, e-mail).
- TLabel: Para identificar os campos de entrada.
Organize os componentes de forma que a interface fique intuitiva e fácil de usar.
Passo 2: Definindo a Estrutura de Dados
Criar um Registro para Contatos
Vamos definir um registro para armazenar as informações dos contatos:
type TContato = record Nome: string; Telefone: string; Email: string; end;
Criar uma Lista de Contatos
Usaremos uma lista para armazenar os contatos:
private ListaContatos: TList<TContato>;
Passo 3: Manipulando Contatos
Adicionar Contatos
Crie um método para adicionar contatos à lista:
procedure TForm1.AdicionarContato; var Contato: TContato; begin Contato.Nome := edtNome.Text; Contato.Telefone := edtTelefone.Text; Contato.Email := edtEmail.Text; ListaContatos.Add(Contato); SalvarContatos; AtualizarListaContatos; end;
Atualizar a Lista de Contatos
Crie um método para atualizar a exibição da lista de contatos:
procedure TForm1.AtualizarListaContatos; var Contato: TContato; begin ListBoxContatos.Items.Clear; for Contato in ListaContatos do ListBoxContatos.Items.Add(Contato.Nome + ' - ' + Contato.Telefone + ' - ' + Contato.Email); end;
Editar e Remover Contatos
Para editar e remover contatos, podemos usar métodos semelhantes:
procedure TForm1.EditarContato; var Contato: TContato; Index: Integer; begin Index := ListBoxContatos.ItemIndex; if Index <> -1 then begin Contato := ListaContatos[Index]; Contato.Nome := edtNome.Text; Contato.Telefone := edtTelefone.Text; Contato.Email := edtEmail.Text; ListaContatos[Index] := Contato; SalvarContatos; AtualizarListaContatos; end; end; procedure TForm1.RemoverContato; var Index: Integer; Nome, Telefone, Email: String; begin if ListBoxContatos.Count <> ListaContatos.Count then begin ShowMessage('Atualize a lista antes de remover.'); Exit; end; Index := ListBoxContatos.ItemIndex; if Index <> -1 then begin ListaContatos.Delete(Index); SalvarContatos; AtualizarListaContatos; end; end;
Buscar Contatos
Crie um método para buscar contatos pelo nome:
procedure TForm1.BuscarContato; var Contato: TContato; NomeBusca: string; begin NomeBusca := edtBuscar.Text; ListBoxContatos.Items.Clear; for Contato in ListaContatos do if Pos(LowerCase(NomeBusca), LowerCase(Contato.Nome)) > 0 then ListBoxContatos.Items.Add(Contato.Nome + ' - ' + Contato.Telefone + ' - ' + Contato.Email); end;
Passo 4: Persistência de Dados
Salvar Contatos
Crie um método para salvar contatos em um arquivo, esse arquivo estará na mesma pasta do executável e terá o nome de Contatos.txt:
procedure TForm1.SalvarContatos; var Contato: TContato; ContatoFile: TextFile; FileName: String; begin FileName := ExtractFilePath(Application.ExeName) + 'Contatos.txt'; AssignFile(ContatoFile, FileName); Rewrite(ContatoFile); for Contato in ListaContatos do Writeln(ContatoFile, Contato.Nome + '|' + Contato.Telefone + '|' + Contato.Email); CloseFile(ContatoFile); end;
Carregar Contatos
Crie um método para carregar contatos de um arquivo:
procedure TForm1.CarregarContatos; var Contato: TContato; ContatoFile: TextFile; Linha: string; FileName: String; begin FileName := ExtractFilePath(Application.ExeName) + 'Contatos.txt'; if FileExists(FileName) then begin AssignFile(ContatoFile, FileName); Reset(ContatoFile); while not Eof(ContatoFile) do begin Readln(ContatoFile, Linha); Contato.Nome := Copy(Linha, 1, Pos('|', Linha) - 1); Delete(Linha, 1, Pos('|', Linha)); Contato.Telefone := Copy(Linha, 1, Pos('|', Linha) - 1); Delete(Linha, 1, Pos('|', Linha)); Contato.Email := Linha; ListaContatos.Add(Contato); end; CloseFile(ContatoFile); AtualizarListaContatos; end; end;
Código Completo da Agenda de Contatos em Delphi
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections; type TContato = record Nome: string; Telefone: string; Email: string; end; TForm1 = class(TForm) ListBoxContatos: TListBox; btnAdicionar: TButton; edtNome: TEdit; Label1: TLabel; btnEditar: TButton; btnRemover: TButton; btnBuscar: TButton; edtTelefone: TEdit; Label2: TLabel; edtEmail: TEdit; Label3: TLabel; edtBuscar: TEdit; Label4: TLabel; btnAtualizar: TButton; Label5: TLabel; procedure btnAdicionarClick(Sender: TObject); procedure btnEditarClick(Sender: TObject); procedure btnRemoverClick(Sender: TObject); procedure btnBuscarClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure btnAtualizarClick(Sender: TObject); private { Private declarations } ListaContatos: TList<TContato>; procedure AdicionarContato; procedure AtualizarListaContatos; procedure EditarContato; procedure RemoverContato; procedure BuscarContato; procedure SalvarContatos; procedure CarregarContatos; procedure LimparCampos; procedure LimparBusca; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.AtualizarListaContatos; var Contato: TContato; begin ListBoxContatos.Items.Clear; for Contato in ListaContatos do ListBoxContatos.Items.Add(Contato.Nome + ' - ' + Contato.Telefone + ' - ' + Contato.Email); end; procedure TForm1.btnAdicionarClick(Sender: TObject); begin AdicionarContato; LimparCampos; end; procedure TForm1.btnAtualizarClick(Sender: TObject); begin AtualizarListaContatos; end; procedure TForm1.btnBuscarClick(Sender: TObject); begin BuscarContato; LimparBusca; end; procedure TForm1.btnEditarClick(Sender: TObject); begin EditarContato; end; procedure TForm1.btnRemoverClick(Sender: TObject); begin RemoverContato; end; procedure TForm1.AdicionarContato; var Contato: TContato; begin Contato.Nome := edtNome.Text; Contato.Telefone := edtTelefone.Text; Contato.Email := edtEmail.Text; ListaContatos.Add(Contato); SalvarContatos; AtualizarListaContatos; end; procedure TForm1.EditarContato; var Contato: TContato; Index: Integer; begin Index := ListBoxContatos.ItemIndex; if Index <> -1 then begin Contato := ListaContatos[Index]; Contato.Nome := edtNome.Text; Contato.Telefone := edtTelefone.Text; Contato.Email := edtEmail.Text; ListaContatos[Index] := Contato; SalvarContatos; AtualizarListaContatos; end; end; procedure TForm1.FormCreate(Sender: TObject); begin ListaContatos := TList<TContato>.Create; CarregarContatos; end; procedure TForm1.LimparBusca; begin edtBuscar.Clear; edtBuscar.SetFocus; end; procedure TForm1.LimparCampos; begin edtNome.Clear; edtTelefone.Clear; edtEmail.Clear; edtNome.SetFocus; end; procedure TForm1.RemoverContato; var Index: Integer; Nome, Telefone, Email: String; begin if ListBoxContatos.Count <> ListaContatos.Count then begin ShowMessage('Atualize a lista antes de remover.'); Exit; end; Index := ListBoxContatos.ItemIndex; if Index <> -1 then begin ListaContatos.Delete(Index); SalvarContatos; AtualizarListaContatos; end; end; procedure TForm1.BuscarContato; var Contato: TContato; NomeBusca: string; begin NomeBusca := edtBuscar.Text; ListBoxContatos.Items.Clear; for Contato in ListaContatos do if Pos(LowerCase(NomeBusca), LowerCase(Contato.Nome)) > 0 then ListBoxContatos.Items.Add(Contato.Nome + ' - ' + Contato.Telefone + ' - ' + Contato.Email); end; procedure TForm1.SalvarContatos; var Contato: TContato; ContatoFile: TextFile; FileName: String; begin FileName := ExtractFilePath(Application.ExeName) + 'Contatos.txt'; AssignFile(ContatoFile, FileName); Rewrite(ContatoFile); for Contato in ListaContatos do Writeln(ContatoFile, Contato.Nome + '|' + Contato.Telefone + '|' + Contato.Email); CloseFile(ContatoFile); end; procedure TForm1.CarregarContatos; var Contato: TContato; ContatoFile: TextFile; Linha: string; FileName: String; begin FileName := ExtractFilePath(Application.ExeName) + 'Contatos.txt'; if FileExists(FileName) then begin AssignFile(ContatoFile, FileName); Reset(ContatoFile); while not Eof(ContatoFile) do begin Readln(ContatoFile, Linha); Contato.Nome := Copy(Linha, 1, Pos('|', Linha) - 1); Delete(Linha, 1, Pos('|', Linha)); Contato.Telefone := Copy(Linha, 1, Pos('|', Linha) - 1); Delete(Linha, 1, Pos('|', Linha)); Contato.Email := Linha; ListaContatos.Add(Contato); end; CloseFile(ContatoFile); AtualizarListaContatos; end; end; end.
Explicação do Código
- Declaração das Bibliotecas (
uses
): Incluímos bibliotecas necessárias para manipulação de strings, listas genéricas, controle de formulários e componentes visuais. - Declaração da
TContato
: Um registro (record
) para armazenar informações de um contato: nome, telefone e email. - Declaração da Classe
TForm1
: A classe principal do formulário que contém componentes visuais e métodos para manipular os contatos. - Componentes Visuais:
ListBoxContatos
: Lista de contatos.- ed
tNome
, edtTelefone
, edtEmail
: Campos de entrada para os dados do contato. btnAdicionar
,btnEditar
,
,btn
RemoverbtnBuscar
,btnAtualizar
: Botões para ações diversas.lblNome
,
,lbl
Telefone
,lbl
Emaillbl
Buscar,lbl
ListaContatos: Rótulos descritivos.
- Métodos do Formulário:
- AdicionarContato: Adiciona um novo contato à lista.
- EditarContato: Edita o contato selecionado na lista.
- RemoverContato: Remove o contato selecionado na lista.
- BuscarContato: Busca contatos na lista com base no texto fornecido.
- SalvarContatos: Salva os contatos em um arquivo de texto.
- CarregarContatos: Carrega os contatos de um arquivo de texto.
- AtualizarListaContatos: Atualiza a visualização da lista de contatos.
- LimparCampos: Limpa os campos com os dados do contato para que um novo seja adicionado, e posiciona o cursor do mouse na caixa de texto do nome.
- LimparBusca: Limpa o campo de busca para que uma nova busca seja feita, e posiciona o cursor do mouse na caixa de texto de busca.
Veja abaixo como ficou a ilustração do projeto Agenda de Contatos:

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/AgendaContatos
Conclusão
Desenvolver uma agenda de contatos em Delphi é um excelente projeto para iniciantes, pois envolve a manipulação de componentes de interface, estruturas de dados e persistência de dados. Com os conceitos aprendidos neste projeto, você está preparado para criar aplicações mais complexas e robustas. Continue explorando as funcionalidades do Delphi e aprimorando suas habilidades de programação.
Ao seguir este guia, você criou uma aplicação funcional de agenda de contatos, entendeu a lógica por trás do código e aprendeu a importância da persistência de dados. Mantenha a prática e explore novos projetos para se tornar um desenvolvedor Delphi cada vez melhor.