Colunista ainda sem descrição. Caro colunista, por favor envie-nos sua descrição.
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.
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009