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
|