Usando o ComboBox para selecionar valores normais e complexos
Introdução
O TComboBox é um componente fundamental que apresenta uma lista de vários valores onde tipicamente escolhemos um. Ele é a solução ideal quando precisamos de uma forma de escolha econômica em um formulário, ocupando pouco espaço visual mas oferecendo múltiplas opções de seleção.
Neste artigo, exploraremos desde o uso básico com strings literais até técnicas avançadas de mapeamento de objetos e pares chave/valor. Aprenderemos como desvincular o que o usuário vê do que o sistema processa internamente, permitindo o uso de IDs e estruturas de dados complexas diretamente no componente.
Imagine uma lista de frutas: Maracujá, Açaí, Avelã, Melão, Maçã e Mamão. Para apresentar isso de forma organizada, usamos o ComboBox:
Selecionando um elemento de um ComboBox
Valores Literais e Boas Práticas
Um ComboBox pode ser alimentado com valores literais, onde o que é exibido é exatamente o que será manipulado. No entanto, usar strings diretamente no código é uma má prática. O correto é utilizar constantes na seção implementation:
const
Maracuja = 'Maracujá';
Acai = 'Açaí';
Avela = 'Avelã';
Melao = 'Melão';
Maca = 'Maçã';
Mamao = 'Mamão';
procedure TForm1.FormCreate(Sender: TObject);
begin
cbLista.Clear;
cbLista.Items.Add(Maracuja);
cbLista.Items.Add(Acai);
cbLista.Items.Add(Avela);
cbLista.Items.Add(Melao);
cbLista.Items.Add(Maca);
cbLista.Items.Add(Mamao);
cbLista.ItemIndex := -1;
end;
Retornando Códigos Numéricos (Casting)
Se ao selecionar "Maracujá" você quiser que o sistema retorne o código 5, utilizamos o AddObject. Fazemos um casting de um inteiro para que ele se comporte como um objeto (ponteiro de memória):
cbLista.Items.AddObject(Maracuja, TObject(5));
cbLista.Items.AddObject(Acai, TObject(10));
// ...
Para recuperar o valor selecionado:
if cbLista.ItemIndex >= 0 then
begin
FrutaCodigoEscolhida := PtrUInt(cbLista.Items.Objects[cbLista.ItemIndex]);
Memo1.Lines.Add('Código escolhido: ' + IntToStr(FrutaCodigoEscolhida));
end;
ComboBox retornando um código via casting
Pares Chave/Valor e OwnerDraw
Para retornar uma String diferente (ex: "cod_maracuja"), usamos AddPair. Para que o usuário não veja o sinal de igual (ex: Nome=Valor), mudamos o Style para csOwnerDrawFixed e tratamos o evento OnDrawItem:
procedure TForm1.cbListaDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
begin
with (Control as TComboBox) do
begin
Canvas.FillRect(ARect);
Canvas.TextOut(ARect.Left, ARect.Top, Items.Names[Index]);
end;
end;
Exibindo apenas a chave do par no ComboBox
Objetos Complexos
Para situações onde cada item possui várias propriedades (Nome, Peso, Código), criamos uma classe TFruta. Isso permite acesso total aos dados do registro sem novas consultas ao banco:
type TFruta = class(TObject)
Nome: string;
PesoGrama: Integer;
Codigo: Integer;
constructor Create(ANome: String; APeso: Integer; ACod: Integer);
end;
ComboBox manipulando objetos complexos
Conclusão
O TComboBox é muito mais do que um simples seletor de texto. Ao dominar o uso de objetos e pares chave/valor, você transforma componentes visuais em poderosos gerenciadores de dados dentro do Lazarus. Essas técnicas garantem um código mais limpo, fácil de manter e profissional. Lembre-se sempre de garantir que os objetos criados sejam destruídos adequadamente para evitar vazamentos de memória.
Vídeo Tutorial
Assista abaixo à demonstração:
Aula completa sobre ComboBoxes Complexos
ASSISTIR VÍDEO NO YOUTUBE