Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 20 de Julho de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
52 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Usando Record, Ponteiro e TList
Publicado por ActiveDelphi : Sexta, Novembro 23, 2007 - 12:20 GMT-3 (2903 leituras)
Comentários 1 Comentário   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
João Marcos Olá amigos leitores! Gostaria de mostrar nesse artigo, três recursos que quando utilizados juntos em um projeto, podem trazer resultados fantásticos para o desenvolvimento da aplicação.

Trata-se de Estrutura (Record), de Ponteiros para a Estrutura e também da classe TList, capaz de armazenar objetos, no caso do artigo, o objeto Record.

Ao final do material você será capaz de trabalhar com Estrutura e seus ponteiros de forma bastante eficaz. Espero que esse artigo ajude-o quando precisar trabalhar com este recurso.

Antes de começarmos precisamos repassar alguns conceitos, como Estrutura e Ponteiros.

Record (Estrutura)

O tipo Record é uma forma de criar uma estrutura que possa armazenar valores de diferentes tipos de dados.

type

// Declaração da Estrutura
TPessoa = record
  Nome: String;
  Email: String;
end; 

// Declaração da Variável do Tipo Estrutura
var
  Pessoa: TPessoa;

// Utilização das variáveis da estrutura
begin
  Pessoa.Nome := 'José';
  Pessoa.Email := 'jose@email.com.br';
end;

Esse é apenas um exemplo básico. Na verdade, com o tipo Record é possível que o desenvolvedor trabalhe com uma estrutura dentro de outra estrutura, matriz de uma estrutura, etc.

Ponteiros

Aqui é o ponto chave do artigo, para entender o que será passado em seu decorrer é necessário que o leitor tenha algum conhecimento básico em ponteiros, pois o exemplo abaixo será apenas um lembrete. Observe:

Var
  a : integer;
  ch : ansichar;
begin
  a := 5;
  ch := 'c';
...

Quando passamos valores às variáveis, nós desenvolvedores entendemos que a variável "a = 5" e "ch = C", mas para o compilador, tanto as variáveis como os valores são posições de memória que serão alocados, sendo representado da seguinte forma:

  a   – possui 4 bytes, por isso ocupa os endereços de 0x0100 a 0x0103.
  ch – possui apenas 1 byte, ocupando assim o endereço 0x104.


Figura 1 - Exemplo de alocação de memória

O Ponteiro é um tipo de dado que armazena o endereço de memória correspondente a uma variável que possui um valor, também representado como memória alocada. Exemplo:

Var
  a : integer;
  ch : ansichar;
  aPtr : ^a;
...

Nesse caso, é importante destacar que o "aPtr" não recebe o mesmo valor que a variável "a", mas sim o seu endereço de memória, como mostrado no exemplo abaixo:


Figura 2 - Exemplo de Alocação de Ponteiro

Num primeiro momento pode ser esquisito o trabalho com ponteiros, mas pode ter certeza que esse recurso é uma arma muito poderosa quando utilizada da maneira correta. Bom, vamos dar início ao nosso artigo de uma vez por todas.

Construindo a aplicação

Como exemplo do artigo, construiremos um aplicativo de cadastro (nome, e-mail).

Teremos a seguinte interface:


Figura 3 - Interface do programa de exemplo

Para isso criá-la, abra um novo projeto no Delphi e insira os seguintes componentes:

2 Edits
- Name: EdtNome
- Text: ‘’
- Name: EdtEmail
- Text: ‘’;

3 Labels
- Name: LblEmail
- Caption: Nome:
- Name: LblNome
- Caption: E-mail:
- Name: LblItensAdicionados
- Caption: Ítens Adicionados

5 Botões
- Name: BtnAdicionar
- Caption: &Adicionar
- Name: BtnModificar
- Caption: M&odificar
- Name: BtnMostrar
- Caption: &Mostrar
- Name: BtnExcluir
- Caption: &Excluir
- Name: BtnConferir
- Caption: Conferir

1 Listbox
- Name: LstBxItensAdicionados

Agora vamos aos códigos. Na cláusula type declare a seguinte estrutura:


Figura 4 - Declarações na seção Type

E na cláusula Public da Classe do Form, declare as seguintes variáveis e procedimentos:


Figura 5 - Declarações na seção Public

Explicando Passo a Passo

Agora chegamos à parte mais fácil. Estarei explicando passo a passo como trabalharemos com nossa estrutura declarada anteriormente.

Corpo das procedures declaradas em public

A procedure Operação tem por finalidade verificar se uma informação está sendo adicionada ou se existe na estrutura que está sendo modificada.

procedure TFrmExemplo.Operacao(AFlag: boolean);
begin
   // Se for verdadeiro adiciona um os dados na estrutura
   if AFlag then
   begin
      // Quando for trabalhar com ponteiros é importante
      // usar o new para alocar espaço na memória
      Ponteiro := New( PtrPessoa );
      Ponteiro^.Nome := EdtNome.Text;
      Ponteiro^.Email := EdtEmail.Text;
      // Adiciona ao listbox os dados que foram armazenados
      // na estrutura e o ponteiro que foi guardado no TList
      LstBxItensAdicionados.Items.Add(
      IntToStr( ListaDeCadastrados.Add( Ponteiro ) )
      + ' - ' + IntToStr( Integer( Ponteiro ) )
      + ' - ' + Ponteiro^.Nome
      + ' - ' + Ponteiro^.Email );
   end
   else
   // Se for falso altera um item
   begin
      Ponteiro^.Nome := EdtNome.Text;
      Ponteiro^.Email := EdtEmail.Text;
      LstBxItensAdicionados.Items.Strings[
      LstBxItensAdicionados.ItemIndex ] :=
      IntToStr( ListaDeCadastrados.IndexOf( Ponteiro ) )
      + ' - ' + IntToStr( Integer( Ponteiro ) )
      + ' - ' + Ponteiro^.Nome
      + ' - ' + Ponteiro^.Email;
   end;
   EdtNome.Text := EmptyStr;
   EdtEmail.Text := EmptyStr;
end;

Procedimento que limpa um TList

procedure TFrmExemplo.EmptyTList(Var AList: TList);
var
   intContador: integer;
begin
   for intContador:= (AList.Count-1) Downto 0 do
   begin
      Dispose(AList.Items[intContador]);
      AList.Delete(intContador);
   end;
end;

No evento OnCreate do Form criaremos uma instância do Objeto TList, exemplo:

procedure TFrmExemplo.FormCreate(Sender: TObject);
begin
   // Cria em ListaDeCadastrados uma instância do objeto Tlist.
   ListaDeCadastrados := TList.Create;
end;

Botão Adicionar

procedure TFrmExemplo.BtnAdicionarClick(Sender: TObject);
begin
   // Operacao(True) - Indica que está adicionando item
   Operacao(True);
end;

Botão Excluir

procedure TFrmExemplo.BtnExcluirClick(Sender: TObject);
begin
   try
      ListaDeCadastrados.Delete( LstBxItensAdicionados.ItemIndex );
      LstBxItensAdicionados.Items.Delete( LstBxItensAdicionados.ItemIndex );
   except
      on E : Exception do 
         Abort;
   end;
end;

Botão Modificar

procedure TFrmExemplo.BtnModificarClick(Sender: TObject);
begin
   // Operacao(False) - indica que está alterando um item
   Operacao(False);
   BtnModificar.Visible := False;
end;

Botão Mostrar

procedure TFrmExemplo.BtnMostrarClick(Sender: TObject);
begin
   BtnModificar.Visible := True;
   try
      // A variável ponteiro recebe o endereço de memória
      // da estrutura guardada no Tlist.
      Ponteiro := ListaDeCadastrados.Items[ LstBxItensAdicionados.ItemIndex ];
      EdtNome.Text := Ponteiro^.Nome;
      EdtEmail.Text := Ponteiro^.Email;
   except
      ShowMessage( 'Selecione um item.' );
   end;
end;

Botão Conferir

procedure TFrmExemplo.BtnConferirClick(Sender: TObject);
var
   i : integer;
begin
   for i := 0 to ListaDeCadastrados.Count - 1 do
   begin
      Ponteiro := ListaDeCadastrados.Items[ i ];
      ShowMessage( IntToStr( ListaDeCadastrados.IndexOf( Ponteiro ) )
      + ' - ' + IntToStr( Integer( Ponteiro ) )
      + ' - ' + Ponteiro^.Nome
      + ' - ' + Ponteiro^.Email );
   end;
end;

Pronto. Agora rode o projeto e veja como o uso deste recurso pode ser interessante!

A princípio o trabalho mostrado pode ser complexo, mas o código acima também pode ser bem aproveitado quando se usa Record e se deseja armazenar o Objeto.

Clique aqui para baixar o exemplo do artigo

João Marcos Sakalauska
Contato: jsakalauska@gmail.com



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: n.marx (normelio@arroionet.com.br) : Jan 28, 2008 - 09:17
(Informações sobre o membro | Enviar uma mensagem)
Muito útil esse artigo. Realmente ajuda bastante no desenvolvimento do sistema. Valeu!!!!!
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados