Logo Gladiston Santana

Pascal: Delphi & Free Pascal

Desenvolvimento robusto, compilado e de alta performance.

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