Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

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.323
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


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 01:51:37.


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