[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