Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-09-2005
eureka eureka is offline
Miembro
 
Registrado: sep 2005
Posts: 13
Poder: 0
eureka Va por buen camino
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?
Responder Con Cita
  #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.275
Poder: 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
  #3  
Antiguo 21-09-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Wow


__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #4  
Antiguo 21-11-2005
fly fly is offline
Miembro
 
Registrado: abr 2005
Posts: 65
Poder: 20
fly Va por buen camino
Muy buena la explicación Neftali, me viene de perlas.

Muchas gracias lo probaré.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 02:27:52.


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
Copyright 1996-2007 Club Delphi