Buscar

Usando estrutura (record), ponteiro e tlist na aplicação.

nome

João Marcos Sakalauska

Colunista ainda sem descrição. Caro colunista, por favor envie-nos sua descrição.

Olá amigos leitores!

Gostaria de mostrar nesse artigo, três recursos que quando utilizados junto no projeto, podem trazer resultados fantásticos para o desenvolvimento da aplicação.
Trata-se da Estrutura (Record), do Ponteiro para a Estrutura e também da Classe TList, capaz de armazenar objetos (nesse artigo o objeto Record).
Ao final desse artigo, você será capaz de trabalhar com Estrutura e seus ponteiros de forma bastante eficaz. Espero esse artigo ajude-o quando precisar trabalhar com Estrutura (Record).


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;


begin
   // Utilização das variáveis da estrutura
   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 no artigo é necessário que o leitor tenha algum conhecimento básico em ponteiros, pois o exemplo abaixo será apenas um lembrete básico. Observe:


Var
   a : integer;
   ch : ansichar;


begin
   a := 5;
   ch := ‘c’;

Quando passamos valores as 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.





O Ponteiro é um tipo de dado que armazena o endereço de memória correspondente a uma variável que possui o 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" recebe, mas sim o endereço de memória da variável "a", como mostrado no exemplo abaixo:



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).
Abra um novo projeto no Delphi e insira os seguintes componentes no delphi:


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

Ao término da construção sua aplicação deve ter a seguinte aparência:







Agora vamos ao código:
Na cláusula type declare a seguinte estrutura:




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





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 à estrutura 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 uma 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;


A princípio o trabalho mostrado nesse artigo pode ser complexo o código mostrado acima bem aproveitado quando se usa Record e se deseja armazenar o Objeto. Clique aqui para baixar o exemplo do artigo. Dúvidas: jsakalauska@gmail.com.


Publicidade

Vote no artigo




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes do artigo

Categoria: Object pascal
Adicionado dia: 29/06/07
Por: João Marcos Sakalauska
Visualizado: 60699 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009