[Lazarus-es] Combobox con columnas multiples
josé Antonio Cuello Principal
josea en artextrading.com
Jue Mar 4 08:31:29 CET 2010
Te envio un ejemplo de dibujar tres columnas al desplegar un ComboBox.
El truco está en guardar el valor de las tres columnas en el mismo item
pero con un separador (en el ejemplo el punto y coma).
Después implementamos nuestra propia función de dibujado de columnas
para que muestre las tres columnas. Para ello metemos en el evento
OnDrawItem del ComboBox. Espero te sea de utilidad.
Un saludo.
Rutina de pintado:
procedure TFormulario.ComboBoxDrawItem( Control: TWinControl; Index:
Integer; Rect: TRect; State: TOwnerDrawState );
var
sValor, sTodo: string;
i, iPos: Integer;
rc: TRect;
AnchoColumna: array[0..3] of Integer;
begin
ComboBox.Canvas.Brush.Style := bsSolid;
ComboBox.Canvas.FillRect( Rect );
// Las columnas deben ir separadas por un ;
sTodo := ComboBox.Items[Index];
// Establecemos el ancho de las columnas
AnchoColumna[0] := 0;
AnchoColumna[1] := 100; // Ancho de la columna 1
AnchoColumna[2] := 200; // Ancho de la columna 2
AnchoColumna[3] := 300; // Ancho de la columna 3
// Leemos el texto de la primera columna
iPos := Pos( ';', sTodo );
sValor := Copy( sTodo, 1, iPos - 1 );
for i := 0 to 3 do
begin
// Dibujamos la primera columna
rc.Left := Rect.Left + AnchoColumna[i] + 2;
rc.Right := Rect.Left + AnchoColumna[i+1] - 2;
rc.Top := Rect.Top;
rc.Bottom := Rect.Bottom;
// Escribimos el texto
Combobox.Canvas.TextRect( rc, rc.Left, rc.Top, sValor );
// Dibujamos las líneas que separan las columnas
if i < 3 then
begin
Combobox.Canvas.MoveTo( rc.Right, rc.Top );
Combobox.Canvas.LineTo( rc.Right, rc.Bottom );
end;
// Leemos el texto de la segunda columna
sTodo := Copy( sTodo, iPos + 1, Length( sTodo ) - iPos );
iPos := Pos( ';', sTodo );
sValor := Copy( sTodo, 1, iPos - 1 );
end;
end;
Rutina que añade los items al combobox:
with Combobox.Items do
begin
Add( 'JOSE;SANCHEZ;GARCIA;' );
Add( 'MARIA;PEREZ;GOMEZ;' );
Add( 'ANDRES;MARTINEZ;RUIZ;' );
end;
rutina de asignación de evento de pintado al combobox:
procedure TFormulario.FormCreate(Sender: TObject);
begin
// Le decimos al ComboBox que lo vamos a pintar nosotros
Combobox.Style := csOwnerDrawFixed;
end;
El mié, 03-03-2010 a las 10:52 -0500, Fredy Gonzales escribió:
> Amigos,
>
> Alguien sabe como agregar dos colunmas a un comboBox, pero que cuando se
> desplieque enseñe las dos y cuando esta sin desplegar solo muestre la
> primera.
>
> Esto es posible.
>
> Gracias.
>
> FG
>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
________________________________________________________________________
ARTEX TRADING S.A.
JOSÉ ANTONIO CUELLO PRINCIPAL
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20100304/621979b6/attachment-0002.html>
More information about the Lazarus-es
mailing list