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 bjeto 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 := ‘
Este endereço de e-mail está protegido contra SpamBots. Você precisa ter o JavaScript habilitado para vê-lo.
’; 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;
Dúvidas:
Este endereço de e-mail está protegido contra SpamBots. Você precisa ter o JavaScript habilitado para vê-lo.
.
por: João Marcos Sakalauska
|