Ver Mensaje Individual
  #2  
Antiguo 21-09-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Reputación: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 21-09-2005 a las 10:37:42.
Responder Con Cita