quinta-feira, 11 de dezembro de 2008

Colunas em ComboBox no Delphi

Eu sei que tenho postado muitas coisas em Delphi, isso é devido ao projeto em que estou agora que é feito em cima do Delphi 2007, mas espero estar postando sempre mais coisas novas para diversificar.

Bom, vamos ao assunto do Post.

Quase sempre precisei utilizar ComboBox com colunas, então eu até adotava alguns meios de adicioná-las em eventos "Draw" do Combobox, mas contece que eu queria ir mais além daquelas colunas estranhas. Eu gostaria de inserir dados com letras em negrito, cores de fundo ecolunas bem mais alinhadas. Foi pesquisando que achei o componente TColumnComboBox.
Com ele é possível colocar cores e adicionar quantas colunas forem precisas em seu Combo.
Ele pode ficar mais ou menos com o estilo abaixo:







Esse é um combo que utilizo em meu sistema.
Eu estou buscando essas informações pela minha base de Dados, mas nada impede de você inserir seus dados fixos.
Nós podemos inserir um código para identificar o registro que queremos trabalhar. Isso fica muito mais visível para o usuário que utiliza o sistema e mais "fácil" para quem esta implementando.

INSTALAÇÃO

O TColumnComboBox é feito pela empresa TMS Software.
Para fazer o download do TColumComboBox, acesse a seguinte URL:
http://www.tmssoftware.com/site/colcombo.asp

A instalação é bem parecida com o FreeBoleto, que é um componente que eu ensino como instalá-lo aqui no meu Blog.


FUNCIONAMENTO DO TCOLUMNCOMBOBOX

O TColumnComboBox não possui a propriedade Items como estamos acostumados a utilizar em um ComboBox comum.
Para adicionar os dados, utilizaremos as propriedades Columns e ComboItems.
Na propriedade Columns, adicionamos a quantidade e título das colunas que quizermos e em comboItens, adicionamos as linhas do TColumComboBox.

Nesse post, ensinarei como inserir os valores em modo de Execução e além de criar o Combo, criaremos uma procedure que amplia a largura do ComboBox quando ele é clicado.

Segue abaixo o código da criação dos items do TColumnComboBox:

var
//Cria um objeto do tipo TColumnComboBox
C: TColumnComboBox;
begin
//Faz referencia a classe
C := TColumnComboBox.Create(Self);

with C do
begin
Parent := Panel1;
Name := 'cmbFormaPagto';
Left := 10;
Top := 10;
Visible := true;
CharCase := ecUpperCase;
AutoSize := true;
//Inserimos uma função no evento ondropdown do ComboBox, para assim que
//Clicar no ComboBox, a largura seja ampliada.
OnDropDown := ExpandirComboFormaPagto;

//Cria a primeira coluna
with Columns.Add do
begin
Width:=25;
Font.Style:=[fsBold];
Color := clRed;
end;

//Cria a segunda coluna
with Columns.Add do
begin
Width:=220;
end;

//Cria a terceira coluna
with Columns.Add do
begin
Width:=220;
Font.Color:=clBlue;
Font.Style:=[fsBold];
Color := $00D1FCDC;
end;

//Adciona os itens aos combobox
with ComboItems.Add do
begin
Strings.Add('1');
Strings.Add('Primeiro item');
Strings.Add(' Descrição 1');
end;

with ComboItems.Add do
begin
Strings.Add(2');
Strings.Add('Segundo item');
Strings.Add(' Descrição 2');
end;

end;
end;

Segue abaixo o código da procedure para apliar a largura do ComboBox:

begin
//Aqui decidimos a largura do ComboBox para 500, mas você pode mudar a largura que quizer.
TComboBox(Sender).Perform(CB_SETDROPPEDWIDTH, 500, 0);
end;

Beleza pessoal?
Abraços e até +.

5 comentários:

Unknown disse...

aeeee, posta JAVA!!!

Anônimo disse...

Vi com entusiasmo este tópico, fiz o donwload do componente e carreguei informações de meu banco na combo sem nenhum problema, até ai tudo bem, porem como não uso DBControl's, eu necessitaria visualizar no componente os dados da tabela, por exemplo quando inicio meu form eu carrego na combo dados de uma tabela em especifico, sendo que carrego 3 colunas, gostaria de saber como ler a string de uma das colunas em especifico e como passar o valor para mesma ou seja, o valor já esta na combo, não necessito add novamente, quando o cliente clicar na grid de consulta (por exemplo) deve carregar os dados na TColumnComboBox, más não consegui passar os dados para ele, tentei o seguinte: ColumnComboBox.ComboItens[0].Strings.Text := Query.FieldByName('Codigo').AsString; ColumnComboBox.ComboItens[1].Strings.Text := Query.FieldByName('Nome').AsString;

Porem não ocorre nada, espero ter sido claro e espero que possa me ajudar, "lembrando": necessito ler a string de uma coluna em especifico e necessito passar string para colunas em especifico do mesmo (sem utilizar o metodo add, pois os dados já estao na combo, apenas quero exibi-los como se fosse um TComboBox.Text := xValor);

Maurício Vinicius de O. Santos disse...

Olá,
Para verificar o valor de um TColumnComboBox, vc terá que fazer um loop no combo e verificar se o valor do indice do momento é o valor que você está comparando.

Mas esse tipo de comparação é recomendada ser feita apenas para combos com poucos registros.

Você pode fazer algo parecido com isso:

for I := 0 to Combo.ComboItems.Count - 1 do
begin
if Combo.ColumnItems[I,0] = FieldByName('nomedocampo').AsString then
Combo.ItemIndex := U;

end;

blz cara? qq duvida posta ai

Anônimo disse...

Cara, blz? gostaria de saber se esse componente para delphi 7 é free???

Anônimo disse...

Olá Maurício, tudo bem ?

Utilizei este seu exemplo, mas com dados vindos de uma tabela.
O estranho é que está demorando para carregar os dados, uns 10 segundos.
E são somente 260 registros.
Tem alguma idéia do que pode ser ?

Abraço,

Marcos