Quick Tips: Trabalhando com Objeto no TreeView
Nesta Quick iremos ver como trabalhar com Objetos no TreeView
Olá galera, nesta Quick Tips mostrarei um componente no Delphi chamado TreeView. Veremos que neste componente não trabalhamos somente com textos adicionados a ele, formando aquela árvore, mas também adicionar um objeto inteiro, uma classe Cliente por exemplo, sendo o nó principal, e os telefones sendo seus nós filhos. Criaremos a aplicação e duas classes, sendo uma delas usando uma lista genérica, o famoso Generics, a partir do Delphi 2009.
Vamos ao exemplo! Adicione os itens a seguir, conforme a Figura 1:
- 1 TreeView.
- Cliente : 3 Bitbtns(BtnAdicionar, BtnEditar, BtnDeletar), 3 LabeledEdit(EdtCodigo, EdtNome, EdtCPF).
- Telefone : 2 Bitbtns(BtnAddTelefone, BtnDelTelefone), 2 LabeledEdit(EdtDDD, EdtNumero) 1 Combobox(CbxTipo) e 1 Label.
Iremos criar agora uma nova Unit - salve a mesma como uTelefone.Esta class será bem simples, porém com ela poderemos ver um recurso muito poderoso englobado no Delphi 2009 em diante, chamado Generics. Utilize o código a seguir:
uTelefone
unit uTelefone;
interface
Type
TTelefone = Class
private
FDDD: String;
FNumero: String;
FTipo: String;
procedure SetDDD(const Value: String);
procedure SetNumero(const Value: String);
procedure SetTipo(const Value: String);
published
public
property DDD : String read FDDD write SetDDD;
property Numero : String read FNumero write SetNumero;
property Tipo : String read FTipo write SetTipo;
End;
implementation
{ TTelefone }
procedure TTelefone.SetDDD(const Value: String);
begin
FDDD := Value;
end;
procedure TTelefone.SetNumero(const Value: String);
begin
FNumero := Value;
end;
procedure TTelefone.SetTipo(const Value: String);
begin
FTipo := Value;
end;
end.
Criaremos agora uma nova Unit e salve a mesma como uCliente.Nesta Unit observe que demos Uses em generics.defaults e generics.collections para podermos usar o Generics. Assim temos uma lista de Telefones para cada cliente, ou seja, um telefone pode ter um ou mais clientes. Com o código a seguir observe também que é bem simples excluir um telefone desta lista:
uCliente
unit uCliente;
interface
uses generics.defaults, generics.collections, uTelefone;
Type
TCliente = Class
private
FCodigo: Integer;
FCPF: String;
FNome: String;
FTelefones: TList;
procedure SetCodigo(const Value: Integer);
procedure SetCPF(const Value: String);
procedure SetNome(const Value: String);
procedure SetTelefones(const Value: TList);
published
public
Constructor Create;
property Codigo : Integer read FCodigo write SetCodigo;
property Nome : String read FNome write SetNome;
property CPF : String read FCPF write SetCPF;
property Telefones: TList read FTelefones write SetTelefones;
End;
implementation
{ TCliente }
constructor TCliente.Create;
begin
//Finalidade : Ao criar um Cliente já teremos a lista de telefones criadas
Telefones := TList.Create;
end;
procedure TCliente.SetCodigo(const Value: Integer);
begin
FCodigo := Value;
end;
procedure TCliente.SetCPF(const Value: String);
begin
FCPF := Value;
end;
procedure TCliente.SetNome(const Value: String);
begin
FNome := Value;
end;
procedure TCliente.SetTelefones(const Value: TList);
begin
FTelefones := Value;
end;
end.
Implementações no Form
A parte da manipulação do Cliente pode ser vista com o código a seguir:
//Form : OnCreate
//Form: onClose
//Declare duas procedures, ClearCliente e ClearTelefone.
procedure TFrmPrincipal.ClearCliente;
begin
{Finalidade : Limpar os Edits do Cliente}
EdtCodigo.Clear;
EdtNome.Clear;
EdtCPF.Clear;
EdtCodigo.SetFocus;
end;
procedure TFrmPrincipal.ClearTelefone;
begin
{Finalidade : Limpar os Edits e Combobox do Telefone}
EdtDDD.Clear;
EdtNumero.Clear;
CbxTipo.ItemIndex := -1;
EdtDDD.SetFocus;
end;
procedure TFrmPrincipal.FormCreate(Sender: TObject);
begin
TreeView1.HideSelection := False; //Destaca o item selecionado no ListView
end;
procedure TFrmPrincipal.FormClose(Sender: TObject; var Action: TCloseAction);
var
I: Integer;
c: TCliente;
begin
for I := 0 to TreeView1.Items.Count-1 do
begin
if TreeView1.Items[I].Level=0 then
//Exclui só a classe cliente que o resto será destruído,
com isso evitamos o erro de MemoryLeak.
begin
c:=TreeView1.Items[I].Data;
c.Free;
end;
end;
end;
//BtnAdicionar : OnClick
//Finalidade : Criar um cliente, atribuir os valores a suas propriedades e logo
// em seguida adicionarmos sua referência a TreeView
procedure TFrmPrincipal.BtnAdicionarClick(Sender: TObject);
Var
Cliente : TCliente;
begin
Cliente := TCliente.Create;
With Cliente do
begin
Codigo := StrToInt(EdtCodigo.Text);
Nome := EdtNome.Text;
CPF := EdtCPF.Text;
end;
TreeView1.Items.AddObject(Nil,Cliente.Nome,Cliente);
ClearCliente;
end;
//BtnEditar : OnClick
//Finalidade : Ao Carregar os dados podemos editar as informações de um Objeto
//selecionado, porém precisamos implementar
//o método que irá carregar, vamos ver na última parte desta série de Quick Tips.
procedure TFrmPrincipal.BtnEditarClick(Sender: TObject);
begin
if Assigned(TreeView1.Selected) then //Verifica se existe referencia no item selecionado
begin
TCliente(TreeView1.Selected.Data).Codigo := StrToInt( EdtCodigo.Text );
TCliente(TreeView1.Selected.Data).Nome := EdtNome.Text;
TCliente(TreeView1.Selected.Data).CPF := EdtCPF.Text;
TreeView1.Selected.Text := EdtNome.Text;
end;
end;
//BtnDeletar : OnClick
//Finalidade : Excluir um Objeto Cliente da TreeView, e removendo a referencia
procedure TFrmPrincipal.BtnDeletarClick(Sender: TObject);
begin
if Assigned(TreeView1.Selected) then
//Verifica se existe referencia no item selecionado
begin
if TreeView1.Selected.Level = 0 then
//Verifica se estamos no primeiro nível para poder deletar
begin
TreeView1.Selected.Data := Nil;
TreeView1.Items.Delete(TreeView1.Selected);
end;
end
else
ShowMessage('Nenhum item selecionado');
end;
Já os códigos a seguir cuidam das implementações no Form: a parte da manipulação do Telefone e a recuperação dos dados no TreeView.
//BtnAddTelefone : OnClick
//Finalidade : Adicionar um telefone ao cliente selecionado
procedure TFrmPrincipal.BtnAddTelefoneClick(Sender: TObject);
Var
Node : TTreeNode;
Cliente : TCliente;
Telefone : TTelefone;
begin
if Assigned(TreeView1.Selected) then
begin
if TreeView1.Selected.Level = 0 then //Verifica se estamos no primeiro Item
begin
Node := TreeView1.Selected;
Cliente := TCliente(TreeView1.Selected.Data);
Telefone := TTelefone.Create;
With Telefone do
begin
DDD := EdtDDD.Text;
Numero := EdtNumero.Text;
Tipo := CbxTipo.Text;
end;
Cliente.Telefones.Add(Telefone);
TreeView1.Items.AddChildObject(Node,Telefone.Numero, Cliente);
ClearTelefone;
end
else
ShowMessage('Não trabalhamos com mais de um Nivel de Node');
end
else
ShowMessage('Erro !!! Não existe um Node Pai Selecionado');
end;
//BtnDelTelefone : OnClick
//Finalidade : Excluir um telefone de um Cliente
procedure TFrmPrincipal.BtnDelTelefoneClick(Sender: TObject);
begin
if Assigned(TreeView1.Selected) then
//Verifica se existe referencia no item selecionado
begin
if TreeView1.Selected.Level = 1 then
//Verifica se estamos no segundo nível para poder deletar
begin
TCliente(TreeView1.Selected.Data).Telefones.Delete(TreeView1.Selected.Index);
TreeView1.Selected.Delete;
end;
end;
end;
//TreeView : OnClick
//Finalidade : Carregar para o Form as informações armazenadas no
//TreeView, permitindo exclusão ou alteração.
procedure TFrmPrincipal.TreeView1Click(Sender: TObject);
begin
ClearCliente;
ClearTelefone;
if TreeView1.Selected.Level = 0 then //Verifica se estamos no primeiro nível
begin
EdtCodigo.Text := IntToStr( TCliente(TreeView1.Selected.Data).Codigo );
EdtNome.Text := TCliente(TreeView1.Selected.Data).Nome;
EdtCPF.Text := TCliente(TreeView1.Selected.Data).CPF;
end
else
if TreeView1.Selected.Level = 1 then //Verifica se estamos no segundo nível
begin
EdtCodigo.Text := IntToStr( TCliente(TreeView1.Selected.Data).Codigo );
EdtNome.Text := TCliente(TreeView1.Selected.Data).Nome;
EdtCPF.Text := TCliente(TreeView1.Selected.Data).CPF;
EdtDDD.Text := TCliente(TreeView1.Selected.Data)
.Telefones[TreeView1.Selected.Index].DDD;
EdtNumero.Text := TCliente(TreeView1.Selected.Data)
.Telefones[TreeView1.Selected.Index].Numero;
CbxTipo.ItemIndex := CbxTipo.Items
.IndexOf(TCliente(TreeView1.Selected.Data)
.Telefones[TreeView1.Selected.Index].Tipo);
end;
end;
Testando o exemplo
Fico por aqui e na próxima Quick Tips.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo