Buscar

Usando listas - parte i

nome

Alessandro De Oliveira Alves

Colunista ainda sem descrição. Caro colunista, por favor envie-nos sua descrição.

Olá pessoal, meu nome é Alessandro Alves e este é meu primeiro artigo no site.

Pensei em vários assuntos que poderiam ser abordados e me lembrei de um bastante interessante que é a utilização de Listas no Delphi. Frequentemente necessitamos manipular grupos de componentes ou objetos e, além da utilização de arrays podemos utilizar algumas classes da VCL para ajudar nesta tarefa.

As listas são representadas pela lista de objetos genérica TList e pelas listas de strings TStrings e TStringList.

Nesse artigo, abordaremos um pouco da utilização da lista de objetos genérica TList.

A classe TList define uma lista de ponteiros, que pode ser usada para armazenar objetos de qualquer classe, sendo que é mais flexível do que um array dinâmico pois permite ser expandida automaticamente pela simples inclusão de novos itens. Em contra-partida, a desvantagem da TList em relação aos arrays dinâmicos é o fato de ela não permitir que você indique um tipo específico para os objetos que a compõem, dificultando assim a verificação de tipo correta em tempo de compilação.

Imaginemos que, necessitamos de uma lista genérica para armazenar informações de diferentes componentes e em quantidades desconhecidas. A utilização de uma TList, poderia facilmente resolver este problema.

Para este exemplo, vamos criar uma nova aplicação e, abaixo alguns valores sugeridos para as propriedades.

Formulário Principal
Name = frmExemploTList
Caption = Usando uma TList

Adicionemos neste formulário os seguintes componentes:

07 TButtom (Botões)

Botão 01
Name = btnCriaLista
Caption = Criar a Lista

Botão 02
Name = btnAdicionaItem
Caption = Adiciona Item à Lista

Botão 03
Name = btnContaItens
Caption = Conta Itens da Lista

Botão 04
Name = btnPercorreItens
Caption = Percorre Itens da Lista

Botão 05
Name = btnTransfItens
Caption = Transfere Itens p/ ListBox

Botão 06
Name = btnRemoveItem
Caption = Remove Item da Lista

Botão 07
Name = btnDestroiLista
Caption = Destrói a Lista

01 Combobox
Name = cbxItems
Adicione os seguintes Items:
TEdit
TCombobox
TButton

01 Edit
Name = edtIndice
No evento OnKeyPress insira o código: (aceitar apenas números e backspace)
procedure TfrmExemploTLista.edtIndiceKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9',#8]) then
key := #0;
end;

01 ListBox
Name = lstbxItensLista

O formulário, agora, deve ter a seguinte aparência:



Pela cara do formulário, já dá pra ter uma idéia do que é possível fazermos com uma TList.

VAMOS AOS CÓDIGOS:

Primeiramente, vamos criar na seção private do nosso form, uma variável com o nome “MyList” do tipo TList;


No evento “OnClick” do botão “Criar a Lista”, insira o código como na figura:



Portanto, no clique do botão, chamamos o método create para criar a lista que vamos utilizar no restante do nosso exemplo.

No evento “OnClick” do botão “Adiciona Item à Lista” , insira o código:


Primeiro, verificamos se o objeto MyList já foi criado e está atribuído, se não é um objeto inválido, fazemos isso verificando se o mesmo é diferente de “nil”.

Obs.: A palavra reservada NIL é uma constante especial que pode ser atribuída a qualquer ponteiro. Enquanto NIL estiver atribuída para um ponteiro, o ponteiro não faz referencia a coisa alguma.

Continuando....Em caso positivo, adicionamos o item à nossa lista.

Verifique que, como dissemos no início do artigo, a TList é uma lista de objetos, dessa forma, qualquer coisa herdada de TObject pode ser adicionada à lista, assim sendo, verificamos o valor da propriedade “ItemIndex” do combobox (cbxTipoItem) e assim, adicionamos à nossa lista o objeto correspondente. (um Edit, um combobox ou um Botão), para isto, criamos uma variável do tipo TObject com o nome “pComp” que irá receber o objeto adequado e no final do código adiciona-o à lista.

Para isso utilizamos o método Add da classe TList.

O TypeCast de tipo não é necessário já que todos os componentes ou classes são herdados de TObject.

No Evento “OnClick” do botão “Conta Itens da Listas, insira o código:



Utilizamos aqui o método Count para retornar a quantidade de itens existentes na nossa lista.
O valor é armazenado na variável local “i” do tipo inteiro.

No evento “OnClick” do botão “Percorre Itens da Lista”, insira o código:



Nesse código, definimos uma variável local “pComp” do tipo TObject para receber cada item da lista. Lembrem que não sabemos ao certo que tipo de componente está naquela exata posição da lista, sendo assim, recebemos cada um como sendo um TObject e então exibimos o nome da classe a que pertence.

Colocamos a variável I para começar sua contagem a partir de 0 (zero) até a quantidade de items – 1. Vamos esclarecer isso:

Suponhamos uma lista com 4 itens.

Count
Items
1
0
2
1
3
2
4
3
Ou seja, os Items começam sua contagem em 0 (zero) e o Count inicia em 1 (um).

Considerando ainda nossa lista de 4 itens, iniciamos a variável I no Item 0 (zero) e vamos até o Item que representa Count-1, ou seja, o índice (4 – 1) = 3.

No evento “OnClick” do botão “Transfere ClassName do Itens p/ Listbox”, insira o código:



Vejam que este código faz praticamente a mesma coisa que o código do botão anterior, a não ser por dois detalhes:

01 - Não usamos uma variável do tipo TObject para entermediar o processo, pois fizemos o TypeCast diretamente.
02 - Estamos enviando a saída para um listbox, ao invés de exibir uma mensagem com o nome da classe.

No evento “OnClick” do botão “Remove Item da Lista”, insira o código:


Declaramos uma variável do tipo inteiro (idx) que receberá o índice do item de lista que queremos remover. Lembre sempre que, os Items de uma TList iniciam em 0 (zero).

Se o índice informado existir poderá ser excluído, senão, o usuário será informado que o índice não existe.
Removido o item recarrega-se o listbox com os items restantes disparando o evento “btnTransfItensClick”

No evento “OnClick” do botão “Destrói a Lista”, insira o código:



Se a lista existe (foi criada e atribuída) precisamos percorrer todos os seus itens e libera-los (destruí-los). Lembram que, no início do artigo falei que a TList é uma lista de “ponteiros”? Pois bem, destruir a Lista não destrói os objetos que são referenciados nela. Sendo assim, precisamos percorrer a lista e liberar o espaço alocado por cada item, destruindo-os. É exatamente isso que fazemos no loop for acima, fazendo o TypeCast de cada objeto com um TObject e destruindo-o com o procedimento “Free”.

Terminada esta parte, finalmente destruímos a lista. Então atribuímos a ela Nil, informando que a mesma não faz referência a mais nada.

É isso aí pessoal, por hora ficamos por aqui. Acredito que a partir disso vocês poderão encontrar muitas utilidades para a TList.
No próximo artigo iremos aprender a manipular os valores já contido na TList e tirar algum proveito disso.

Para baixar os arquivos deste artigos clique aqui. Alessandro Alves
planetadelphi@oppus.eti.br
www.oppus.eti.br

Publicidade

Vote no artigo




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes do artigo

Categoria: Object pascal
Adicionado dia: 19/05/06
Por: Alessandro De Oliveira Alves
Visualizado: 56274 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009