Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Dibujar encabezado Columna TDBGrid (https://www.clubdelphi.com/foros/showthread.php?t=25359)

eureka 20-09-2005 18:23:23

Dibujar encabezado Columna TDBGrid
 
Saludos y gracias de antemano por su ayuda,

Como dibujar la "muesca","triángulo"... de ordenación en el encabezado de columna de un TDBGrid?

Neftali [Germán.Estévez] 21-09-2005 10:06:54

Lo primero es derivar el componente DBGrid. No puedes hacerlo (o al menos así a primeras no se ocurre como) desde el form.
Una vez derivado defines los dos métodos de dibujo en la parte privada.

Código Delphi [-]
      { Private declarations }
      procedure __PaintArrowUp(Canvas: TCanvas; var Rect: TRect);
      procedure __PaintArrowDown(Canvas: TCanvas; var Rect: TRect);

y su implementación:

Código Delphi [-]
  procedure TNeftaliDBGrid.__PaintArrowDown(Canvas: TCanvas; var Rect: TRect);
  var
    APolyLine: Array[0..2] of TPoint;
    SaveCol, BrushCol : TColor;
  begin
  
    // Utilizamos el canvas pasado como parámetro
    with Canvas do begin
  
      // Guardar los valores actuales
      SaveCol := Pen.Color;
      BrushCol := Brush.Color;
  
      // Activar los nuevos valores depintado
      Brush.Style := bsSolid;
      Pen.Color := Self.FixedColor;
      Brush.Color := Self.FixedColor;
  
      // Dibujar un rectágulo debajo para tapar el título
      Rectangle(Rect.Right-13, Rect.Top+3, Rect.Right-1, Rect.Top+15);
  
      // Dibujamos la flecha
      Pen.Color := clGray{clBlack};
      APolyLine[0]:=Point(Rect.Right-4, Rect.Top+5);
      APolyLine[1]:=Point(Rect.Right-11, Rect.Top+5);
      APolyLine[2]:=Point(Rect.Right-8, Rect.Top+11);
      PolyLine(APolyLine);
      Pen.Color := clWhite;
      MoveTo(Rect.Right-7, Rect.Top+11);
      LineTo(Rect.Right-4, Rect.Top+5);
  
      // Restaurar valores guardados
      Brush.Color := BrushCol;
      Pen.Color := SaveCol;
  
    end;
  end;
  
  procedure TNeftaliDBGrid.__PaintArrowUp(Canvas: TCanvas; var Rect: TRect);
  var
    SaveCol, BrushCol : TColor;
  begin
  
    // Utilizamos el canvas pasado por parámetro.
    with Canvas do begin
  
      // Guardar los valores de los colores
      SaveCol := Pen.Color;
      BrushCol := Brush.Color;
  
      // Nuevo estilo de pintado.
      Brush.Style := bsSolid;
      Pen.Color := Self.FixedColor;
      Brush.Color := Self.FixedColor;
  
      // Rectangulo por debajo para tapar el título
      Rectangle(Rect.Right-13, Rect.Top+3, Rect.Right-1, Rect.Top+15);
  
      // Dibujar la flacha
      Pen.Color := clGray{clBlack};
      MoveTo(Rect.Right-11, Rect.Top+11);
      LineTo(Rect.Right-8, Rect.Top+5);
      LineTo(Rect.Right-7, Rect.Top+5);
      Pen.Color:=clWhite;
      MoveTo(Rect.Right-7, Rect.Top+5);
      LineTo(Rect.Right-4, Rect.Top+11);
      LineTo(Rect.Right-11, Rect.Top+11);
  
      //Restaurar los colores
      Brush.Color := BrushCol;
      Pen.Color := SaveCol;
  
    end;
  end;

Para poder pintar la flecha cuando te interese debes redefinir el método para dibujar una celda:

Código Delphi [-]
  procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;

Y en la implementacion hacer las comprobaciones de fila y columna, para que sólo te lo pinte en la fila de títulos y en la columna que quieres. En éste ejemplo las columnas estñán como constantes, pero seguramente tú deberaás obtenerlas de alguna variable/propiedad (por ejemplo la que el usuario pulse con el ratón)

Código Delphi [-]
  procedure TNeftaliDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
    AState: TGridDrawState);
  begin
    inherited;
  
    // No es fila de títulos?
    if (ARow <> 0) then begin
      Exit;
    end;
  
    // Columna 3   (por ejemplo)
    if (ACol = 3) then begin
      __PaintArrowUp(Canvas, ARect);
    end;
  
    // Columna 4   (por ejemplo)
    if (ACol = 4) then begin
      __PaintArrowDown(Canvas, ARect);
    end;
  end;

Si tienes algun problema con el código ya me dirás...

NOTA: He subido todo el texto completo con alguna imagen y el código en un ZIP a la dirección:
http://neftali.clubdelphi.com/delphi...cha_ordenacion

vtdeleon 21-09-2005 13:43:31

Wow
:eek: :eek: :eek: :eek:

:p

fly 21-11-2005 03:02:44

Muy buena la explicación Neftali, me viene de perlas.

Muchas gracias lo probaré.


La franja horaria es GMT +2. Ahora son las 23:25:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi