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 14-01-2006
pepe2000 pepe2000 is offline
Miembro
 
Registrado: dic 2003
Ubicación: Cajamarca
Posts: 93
Poder: 21
pepe2000 Va por buen camino
Question Otra vez color de fila de un DBGRID?

Tengo que decirlo así suene molesto:
Ya estoy 3 horas buscando la forma de pintar la fila de un un dbgrid y claro he encontrado muchos foros, trucos y tips, pero todos con la misma respuesta: pintar de acuerdo a cantidad>0, poblation=1500, precio<0, Condicion="SI".
Aclaro esto porque mi pregunta tiene que ver especificamente con saber "cual es la condición para conocer la fila en que estoy posicionado" y cual sería el codigo que debo aplicar en mi oncolumncell?
En definitiva que mi grid se vea como si tuviera la propiedad Rowselect=True, pero claro con los datos totalmente editables (poder moverme con otro color de cursor entre columnas).
Ojalá me hayan entendido.
Muchas gracias.
Responder Con Cita
  #2  
Antiguo 14-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
He de confesar que ya había yo intentado algo similar sin mayor éxito. El problema está en que el dibujado de celdas está basado en columnas de manera que el evento OnDrawColumnCell no manda información acerca de la fila a la que pertenece la celda que se va a dibujar.

Al ver este mensaje volví a buscar y en los foros de Borland encontré una respuesta para C++ cuya traducción a Delphi pongo aquí:

Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(
  Sender: TObject; const Rect: TRect; DataCol: Integer;
  Column: TColumn; State: TGridDrawState);
var
  Grid: TDBGrid;

begin
  Grid := Sender as TDBGrid;

  if gdSelected in State then
  begin
    Grid.Canvas.Brush.Color := clRed;
    Grid.SelectedRows.CurrentRowSelected := true;
  end;

  if Grid.SelectedRows.CurrentRowSelected then
  begin
    if not (gdFocused in State) then
      Grid.Canvas.Brush.Color := clGreen;
  end;

  Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Para que esto funcione debe activarse la opción dgMultiSelect del DBGrid.

En principio, parece funcionar bien, pero tiene un problema: si comenzamos a desplazar el grid mediante la flecha inferior de la barra de desplazamiento vertical, las nuevas líneas aparecen todas con el color verde.

Sin embargo, basándome en este código, lo he adaptado para funcionar sin la opción dgMultiSelect:

Código Delphi [-]
{$writeableconst on}
procedure TForm1.DBGrid1DrawColumnCell(
  Sender: TObject; const Rect: TRect; DataCol: Integer;
  Column: TColumn; State: TGridDrawState);
const
  Bookmark: String = '';

var
  Grid: TDBGrid;
  DataSet: TDataSet;

begin
  Grid := Sender as TDBGrid;
  DataSet := Grid.DataSource.DataSet;

  if Grid.Focused then
  begin
    if (gdSelected in State) and (Bookmark <> Table1.Bookmark) then
    begin
      Bookmark := DataSet.Bookmark;
      Grid.Invalidate;
    end;

    if (Bookmark = DataSet.Bookmark) then
      if gdFocused in State
        then Grid.Canvas.Brush.Color := clRed
        else Grid.Canvas.Brush.Color := clGreen;
  end;

  Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
{$writeableconst off}

Cualquiera de los dos códigos mantienen el color aún cuando el grid no tenga el foco, como si tuviera activada la opción dgAlwaysShowSelection; y el segundo código tiene el problema de que al perder el foco, el color rojo (el de la celda seleccionada) se pierde, aunque es un problema menor comparado con el otro.

De cualquier forma, el autor original menciona que si se desea ocultar la selección cuando el grid pierde el foco bastaría con borrar la lista SelectedRows en el evento OnExit del grid y englobar todo el código de OnDrawColumnCell en el condicional:

Código Delphi [-]
if Grid.Focused then
begin
  {
    código aquí
  }
end;

No pongo aquí la referencia original porque la busqué vía tamaracka y en este servicio las búsquedas caducan al poco tiempo de manera que los enlaces a ellas no funcionan. Pero puedes encontrarla buscando "paint selected row". Escoges la vista por hilo (thread). Es de losprimeros hilos, se llama "TDBGrid custom Drawing" y el autor del código es Ingvar Anderberg.

// Saludos
Responder Con Cita
  #3  
Antiguo 14-01-2006
Avatar de JavierB
JavierB JavierB is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 99
Poder: 22
JavierB Va por buen camino
Hola.

Tenía por ahí este código que podría servir:
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Num: Integer;
  R: TRect;
begin
  Num:=TStringGrid(DBGrid1).Row;
  R:=TStringGrid(DBGrid1).CellRect(DataCol,Num);
  if R.Top=Rect.Top then
    with DBGrid1 do
    begin
      if (gdFocused in State) then
        Canvas.Font.Color:=clWhite
      else
        Canvas.Font.Color:=clRed;
      Canvas.Font.Style:=[fsBold];
      DefaultDrawColumnCell(Rect,DataCol,Column,State);
    end;
end;
Saludos,
__________________
Lo importante no es saber, sino tener el e-mail del que sabe.
Responder Con Cita
  #4  
Antiguo 14-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Me quedo con el código de JavierB. Sencillo y eficaz.

// Saludos
Responder Con Cita
  #5  
Antiguo 16-01-2006
pepe2000 pepe2000 is offline
Miembro
 
Registrado: dic 2003
Ubicación: Cajamarca
Posts: 93
Poder: 21
pepe2000 Va por buen camino
Red face okey

que haríamos sin ustedes maestros !
Muchas gracias y hasta la proxima
Responder Con Cita
  #6  
Antiguo 16-01-2006
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
¿hay forma de que ese procedimiento funciona al hacer SCROLL con la ruedita del mouse?? Ya que solo marca unicamente la celda activa y no el resto de la fila?
Responder Con Cita
  #7  
Antiguo 16-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No estoy seguro de si tiene algo que ver, pero el DBGrid siempre ha funcionado mal con la dichosa ruedita. Prueba poner la solución expuesta aquí y mira si eso resuelve también este problema.

// Saludos
Responder Con Cita
  #8  
Antiguo 17-01-2006
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Thumbs up buenisimo

Buenisimo!

Gracias ahora funciona todo de maravillas!
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Fila del DbGrid Rabata Varios 3 08-11-2004 22:18:13
problema cambiar formato de fila en dbGrid VRO OOP 4 01-10-2004 17:38:52
como cambiar una fila seleccionada por otra en un DBgrid ? TURING Varios 1 04-08-2004 04:52:01
Leer fila en la que estoy situado en un DBgrid RyAr Conexión con bases de datos 10 09-07-2004 09:54:45
Seleccionar una fila en un DBGRID erickperez6 Conexión con bases de datos 1 02-05-2004 16:49:34


La franja horaria es GMT +2. Ahora son las 00:01:06.


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