Criando uma Agenda de Contatos em Delphi

Agenda de Contatos em Delphi

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

  1. Abrir o Delphi: Abra o Delphi e crie um novo projeto VCL Forms Application.
  2. 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

  1. 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.
  2. Declaração da TContato: Um registro (record) para armazenar informações de um contato: nome, telefone e email.
  3. Declaração da Classe TForm1: A classe principal do formulário que contém componentes visuais e métodos para manipular os contatos.
  4. Componentes Visuais:
    • ListBoxContatos: Lista de contatos.
    • edtNome, edtTelefone, edtEmail: Campos de entrada para os dados do contato.
    • btnAdicionar, btnEditar, btnRemover, btnBuscar, btnAtualizar: Botões para ações diversas.
    • lblNome, lblTelefone, lblEmail, lblBuscar, lblListaContatos: Rótulos descritivos.
  5. 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:

Agenda de Contatos em Delphi
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/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.

Posts Recentes


Deixe um comentário