O TListBox e o TComboBox do Delphi exibem uma lista de itens - strings em uma lista "selecionável". TListBox exibe uma lista rolável, o TComboBox exibe uma lista suspensa.
Uma propriedade comum a todos os controles acima é o Itens propriedade. Os itens definem uma lista de cadeias que aparecerão no controle para o usuário. No tempo de design, quando você clica duas vezes na propriedade Items, o "Editor de Lista de Sequências" permite especificar itens de sequência. A propriedade Items é na verdade um descendente do tipo TStrings.
Duas seqüências de caracteres por item em um ListBox?
Existem situações em que você deseja exibir um lista de strings para o usuário, por exemplo, no controle da caixa de listagem, mas também tem uma maneira de armazene mais uma sequência adicional ao longo da exibida ao usuário.
Além disso, você pode querer armazenar / anexar mais do que apenas uma string "simples" à string, você pode querer anexar um objeto ao item (string).
ListBox. Itens - TStrings "conhece" objetos!
Dê ao objeto TStrings mais uma olhada no sistema de Ajuda. Tem o Objetos propriedade que representa um conjunto de objetos que estão associados a cada um dos cordas na propriedade Strings - onde a propriedade Strings faz referência às seqüências reais na lista.
Se você deseja atribuir uma segunda string (ou um objeto) a cada string na caixa de listagem, preencha a propriedade Items em tempo de execução.
Enquanto você pode usar o ListBox. Itens. Adicionar Para adicionar seqüências à lista, para associar um objeto a cada sequência, será necessário usar outra abordagem.
o ListBox. Itens. AddObject O método aceita dois parâmetros. O primeiro parâmetro, "Item" é o texto do item. O segundo parâmetro, "AObject" é o objeto associado ao item.
Observe que a caixa de listagem expõe o Adicionar Item método que faz o mesmo que Items. AddObject.
Duas cordas para uma corda
Desde os dois itens. AddObject e AddItem aceitam uma variável do tipo TObject para seu segundo parâmetro, uma linha como:
// erro de compilação!
ListBox1.Items. AddObject ('zarko', 'gajic');
resultará em um erro de compilação: E2010 Tipos incompatíveis: 'TObject' e 'string'.
Você não pode simplesmente fornecer uma string para o objeto, pois no Delphi para Win32 os valores de string não são objetos.
Para atribuir uma segunda string ao item da caixa de listagem, você precisa "transformar" uma variável de string em um objeto - você precisa de um objeto TString personalizado.
Um número inteiro para uma string
Se o segundo valor que você precisa armazenar juntamente com o item da cadeia de caracteres for um valor inteiro, na verdade você não precisará de uma classe TInteger personalizada.
ListBox1.AddItem ('Zarko Gajic', TObject (1973));
A linha acima armazena o número inteiro "1973" junto com a sequência "Zarko Gajic" adicionada.
Uma conversão direta de um número inteiro para um objeto é feita acima. O parâmetro "AObject" é na verdade o ponteiro de 4 bytes (endereço) do objeto adicionado. Como no Win32, um número inteiro ocupa 4 bytes - uma conversão tão difícil é possível.
Para recuperar o número inteiro associado à sequência, você precisa converter o "objeto" de volta ao valor inteiro:
// ano == 1973
ano: = Inteiro (ListBox1.Items. Objetos [ListBox1.Items. IndexOf ('Zarko Gajic')]);
Um controle Delphi para uma string
Por que parar aqui? Atribuir strings e números inteiros a uma string em uma caixa de listagem é, como você acabou de experimentar, um pedaço de bolo.
Como os controles Delphi são realmente objetos, você pode anexar um controle a todas as strings exibidas na caixa de listagem.
O código a seguir adiciona às legendas ListBox1 (caixa de listagem) de todos os controles TButton em um formulário (coloque-o no manipulador de eventos OnCreate do formulário) junto com a referência a cada botão.
var idx: inteiro; iníciopara idx: = 0 para -1 + ComponentCount FazinícioE se Componentes [idx] é TButton então ListBox1.AddObject (TButton (Components [idx]). Caption, Components [idx]); fim; fim;
Para "clicar" programaticamente no botão "segundo", você pode usar a próxima instrução:
TButton (ListBox1.Items. Objetos [1]) Clique;
Quero atribuir meus objetos personalizados ao item de seqüência de caracteres
Em uma situação mais genérica, você adicionaria instâncias (objetos) de suas próprias classes personalizadas:
tipo TStudent = classeprivado fName: string; fYear: número inteiro; públicopropriedade Nome: leitura de string fName; propriedade Ano: inteiro ler ano; construtor Crio(const nome: corda; const ano: inteiro); fim;... construtor TStudent. Crio(const nome: corda; const ano: inteiro); início fName: = nome; fYear: = ano; fim; início// adiciona duas string / objetos -> alunos à lista ListBox1.AddItem ('John', TStudent. Criar ('John', 1970)); ListBox1.AddItem ('Jack', TStudent. Create ('Jack', 1982)); // pegue o primeiro aluno - John student: = ListBox1.Items. Objetos [0] Como TStudent; // exibe o ano de João ShowMessage (IntToStr (aluno. Ano)); fim;
O que você cria, você deve liberar
Aqui está o que a Ajuda tem a dizer sobre objetos em descendentes de TStrings: o objeto TStrings não possui os objetos que você adiciona dessa maneira. Os objetos adicionados ao objeto TStrings ainda existem, mesmo que a instância TStrings seja destruída. Eles devem ser explicitamente destruído pelo aplicativo.
Quando você adiciona objetos a seqüências de caracteres - objetos que você cria -, certifique-se de liberar a memória ocupada ou terá um vazamento de memória
Um procedimento personalizado genérico O FreeObjects aceita uma variável do tipo TStrings como seu único parâmetro. O FreeObjects liberará todos os objetos associados a um item na lista de cadeias. No exemplo acima, "alunos" (classe TStudent) são anexados a uma string em uma caixa de listagem, quando o aplicativo está prestes a ser fechado (evento OnDestroy do formulário principal, por exemplo), é necessário liberar a memória ocupado:
FreeObjects (ListBox1.Items);
Nota: Você chama este procedimento apenas quando objetos atribuídos a itens de sequência foram criados por você.