|
Usuários |
|
128 Usuários Online
|
|
[Artigos]
Armazenando objetos em componentes visuais |
Publicado por rboaro : Sexta, Março 15, 2013 - 01:56 GMT-3 (752 leituras)
5 Comentários Enviar para um amigo Versão para impressão
|
Recentemente descobri que é possível armazenar objetos dentro de itens de componentes visuais, como por exemplo o TListView, TComboBox, TStringList, etc. Vamos ver isso na prática, começando com a criação da nossa classe de teste que terá seus objetos armazenados nos componentes.
type
TTeste = class
private
FCodigo: integer;
FNome: string;
FDescricao : string;
public
property codigo : integer read FCodigo write FCodigo;
property nome : string read FNome write FNome;
property descricao : string read FDescricao write FDescricao;
end;
Agora faremos uma rotina para povoar um ComboBox com uma lista de objetos desta classe TTeste que fizemos, já armazenando o ponteiro para cada objeto.
procedure TFrmPrincipal.alimentarComboBox(AObjetos: TList);
var
oTeste : TTeste;
begin
for oTeste in AObjetos do
cmbTeste.AddItem(oTeste.nome, oTeste);
end;
E por fim, vamos recuperar a instancia do nosso objeto a partir do item selecionado no ComboBox.
procedure TFrmPrincipal.btnMostrarObjetoSelecionadoClick(Sender: TObject);
begin
with TTeste(cmbTeste.Items.Objects[cmbTeste.ItemIndex]) do
ShowMessageFmt('Código: %d | Nome: %s | Descrição: %s',[codigo,nome,descricao]);
end;
É claro, são apenas exemplos didáticos, mas essa técnica evita o uso de controles pelo texto ou índice do ComboBox, obrigando nesse segundo caso que o combo respeite uma determinada ordem que pode deixar de fazer sentido. Vale ai um cuidado com os MemoryLeeks que podem ocorrer se você não se lembrar de liberar os objetos que estão no ComboBox da memória. Para alimentar um TListView o processo é exatamente o mesmo, porem para recuperar o objeto utilizamos a propriedade Data de um TListItem.
procedure TFrmPrincipal.btnMostrarObjetoSelecionadoListViewClick(Sender: TObject);
begin
with TTeste(lsvTeste.Selected.Data) do
ShowMessageFmt('Código: %d | Nome: %s | Descrição: %s',[codigo,nome,descricao]);
end;
Confesso que se tivesse descoberto esse recurso a pelo menos 1 ano atrás, teria me ajudado muito em alguns projetos. Para saber qual objeto possui esse recurso, procure pela propriedade data, vale lembrar que as classes descendentes da classe TStrings já possuem esse propriedade por herança.
|
|
Comentários | |
| | Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
por: tiago.prs (tiago.prs@gmail.com)
: Mar 19, 2013 - 10:16 (Informações sobre o membro | Enviar uma mensagem)
|
Montei pra mim um form genérico de pesquisa onde passo uma lista de objetos para popular um ClientDataSet usando CreateDataSet.
Então o método que cria e exibe o form recebe o tipo da classe por meio de generics. Monto a tela usando RTTI.
Nada d+! Porém, um pouco dentro do tema do seu artigo, uso uma coluna do tipo Integer para armazenar a referência do objeto e depois poder recuperá-lo.
Obtendo a referência:
---------------------
For Obj In ALista Do
CdsReferObj.AsInteger := Integer(Pointer(Obj));
Recuperando:
------------
Result := TTeste(Pointer(CdsReferObj.AsInteger));
|
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|