Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
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 16-06-2010
pablopessoa pablopessoa is offline
Miembro
 
Registrado: may 2008
Ubicación: Argentina
Posts: 162
Poder: 16
pablopessoa Va por buen camino
Pintar fila completa en un DBgrid segun un dato

Saludos!

tengo un dbgrid al que quiero que se le pinte la fila segun un valor de un campo de su datasource.
Por ejemplo:
si el campo "habilitado" del datasource es True se pinta de verde clarito.
Mirando en los post del foro lo pude hacer con el siguiente codigo :
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
       if Column.Field.Dataset.FieldbyName('habilitado').AsBoolean then
       If (gdFocused in State) then
         dbgrid1.canvas.brush.color := clGreen
       else
         dbgrid1.canvas.brush.color := clMoneyGreen;

     dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);
end;

cuando se dibuja la grilla efectivamente muestra la fila en verde clarito para las filas que cumplen con la condicion.
El problema es que cuando selecciono una fila, solo me pinta de verde oscuro la primer columna, no pinta toda la fila.
Como puedo hacer para que pinte toda la fila de verde oscuro cuando selecciono la fila?
Muchas gracias!!
Responder Con Cita
  #2  
Antiguo 16-06-2010
Avatar de afunez2007
afunez2007 afunez2007 is offline
Miembro
 
Registrado: oct 2007
Ubicación: La Ceiba, Honduras
Posts: 170
Poder: 17
afunez2007 Va por buen camino
Lightbulb

Umm me parece que suena a un tipico caso de la propiedad RowSelect=False
Cuando la pones en true y seleccionas una fila esta se selecciona toda.

Ves si es por alli el asunto

Saludos
__________________
Si robas, roba un beso, si mientes que sea por amor y si engañas que sea a la muerte!!
Responder Con Cita
  #3  
Antiguo 16-06-2010
pablopessoa pablopessoa is offline
Miembro
 
Registrado: may 2008
Ubicación: Argentina
Posts: 162
Poder: 16
pablopessoa Va por buen camino
Gracias por responder!!
te comento, la propiedad dgRowSelect esta en True y la propiedad DefaultDrawing esta en falso.
Responder Con Cita
  #4  
Antiguo 16-06-2010
osmuar_exp osmuar_exp is offline
Miembro
 
Registrado: ene 2008
Posts: 18
Poder: 0
osmuar_exp Va por buen camino
begin / end

Hola, creo que te falta un begin / end en esta parte:

Código Delphi [-]
if Column.Field.Dataset.FieldbyName('habilitado').AsBoolean then
If (gdFocused in State) then

lo demás creo que está bien...
Responder Con Cita
  #5  
Antiguo 16-06-2010
pablopessoa pablopessoa is offline
Miembro
 
Registrado: may 2008
Ubicación: Argentina
Posts: 162
Poder: 16
pablopessoa Va por buen camino
Hola!
Mira, lo modifique de esta manera para que las que no cumplen con la condicion las pinte de rojo, agregando los begin y end como decias:
Código Delphi [-]
 if Column.Field.Dataset.FieldbyName('habilitado').AsBoolean then
       begin
          If (gdFocused in State) then
              dbgrid1.canvas.brush.color := clGreen
          else
              dbgrid1.canvas.brush.color := clMoneyGreen;
       end
       else
       begin
           If (gdFocused in State) then
              dbgrid1.canvas.brush.color := clRed
          else
              dbgrid1.canvas.brush.color := clOlive;
       end;
     dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);

Pero sigue pintando solo la primer columna de la fila seleccionada.
puede ser que sea esta sentencia la que lo provoca?
Código Delphi [-]
dbgrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);
osea, al pasar DataCol y column no estoy provocando que pinte solo la primer columna?
Gracias a todos por responder e interesarse!
Responder Con Cita
  #6  
Antiguo 16-06-2010
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
A ver, no estoy seguro, pero no es lo mismo Focused que Selected. Prueba cambiando la condición a

Código Delphi [-]
if (gdSelected in State) then

// Saludos
Responder Con Cita
  #7  
Antiguo 16-06-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
Yo tuve el mismo problema y lo solucioné así:

Código Delphi [-]
 
procedure TF_Camions.JvDBGrid2DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
        If F_ModulDades.Camions_AuxACTUAL.Value = 'N' then
        begin
                JVDBGrid2.Canvas.Brush.Color := clRed;
                JVDBGrid2.DefaultDrawColumnCell(rect,DataCol,Column,State);
        end;
end;

Cada vez que entro en el grid, me pinta la fila en rojo si el valor vale 'N'

Espero te sirva

Josep
Responder Con Cita
  #8  
Antiguo 16-06-2010
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.233
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
Coincido con Román, creo que en el primer código que pusiste debería bastar con cambiar gdFocused por gdSelected.

El hecho de que lo haga con la primera columna es porque tienes el dgRowSelect a True y en ese caso la columna que toma el foco (por decirlo así) es la primera. Si pones esa propiedad a False, te pasará lo mismo, pero siempre con la columna cuya celda tenga el foco.
__________________
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.
Responder Con Cita
  #9  
Antiguo 16-06-2010
pablopessoa pablopessoa is offline
Miembro
 
Registrado: may 2008
Ubicación: Argentina
Posts: 162
Poder: 16
pablopessoa Va por buen camino
Muchisimas Gracias a todos!!
Primero probe la solucion de Roman ya que era la que me producia menor cambio en el codigo y salio de diez!!
De todos modos jafera te agradezco mucho tu aporte. Que al final no haya utilizado tu solucion no le resta merito a tu intencion.
Saludos!
Responder Con Cita
  #10  
Antiguo 25-11-2010
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Smile

Hola Amigos

Revisando este hilo para sacar un truquito y funciono super....

ahora tengo otra consulta... como se condiciona para pintar las filas de forma intermedia de todo el DbGrid? algo así como pintar las impares... o las pares???

Bueno, esto no esta sujeto a condicion del dato que tiene la Tabla...

Salu2
__________________
BlueSteel
Responder Con Cita
  #11  
Antiguo 25-11-2010
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.233
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
En mi caso utilizo una comprobación como esta:

Código Delphi [-]
          ....
          // FILAS ALTERNADAS....
          num := DataLink.DataSource.DataSet.RecNo;
          if ((num mod 2) = 0) then begin
            Self.Canvas.Brush.Color := Config.App.ColorAlternativo;
          end;
__________________
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.
Responder Con Cita
  #12  
Antiguo 25-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Aprovechando la propiedad RecNo al igual que Neftali, yo he utilizado esto:

Código Delphi [-]
   if Odd(DBGrid1.DataSource.DataSet.RecNo) then

Es una alternativa más ...


Saludos.
Responder Con Cita
  #13  
Antiguo 26-11-2010
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.233
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
Cita:
Empezado por ecfisa Ver Mensaje
Es una alternativa más ...
Bueno, creo que es la misma, aunque la tuya es más elegante
La función Odd debe hacer algo así:

Código Delphi [-]
if ((num mod 2) = 0) then begin
__________________
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.
Responder Con Cita
  #14  
Antiguo 26-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Neftali.

Hacen prácticamente lo mismo, aunque evaluan condiciones diferentes.
Código Delphi [-]
  if ((num mod 2) = 0) then
es verdadera si num es par y
Código Delphi [-]
  if Odd(num) then
es verdadera si num es impar.

Pero para pintar las filas alternando dos colores cualquiera funciona perfectamente.


Saludos.
Responder Con Cita
  #15  
Antiguo 26-11-2010
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.233
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
Cita:
Empezado por ecfisa Ver Mensaje
...para pintar las filas alternando dos colores cualquiera funciona perfectamente.
Sí, a eso me refería.
__________________
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.
Responder Con Cita
  #16  
Antiguo 26-11-2010
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
En mi caso utilizo una comprobación como esta:

Código Delphi [-] .... // FILAS ALTERNADAS.... num := DataLink.DataSource.DataSet.RecNo; if ((num mod 2) = 0) then begin Self.Canvas.Brush.Color := Config.App.ColorAlternativo; end;

Hola Neftali

Estube provando con esto... y no me ha funcionado...

tengo lo siguiente
1.- Ejecuto el codigo en onDrawColumnCell
2.- Cree la variable Num de tipo Int
3.- Cambie DataLink por el nombre del DBGrid
4.- Cambie Config.App.ColorAlternativo por clMoneyGreen


En difinitiva... no me da el efecto.... el codigo que uso es asi:

Código Delphi [-]
     
num := DBGrid2.DataSource.DataSet.RecNo;
// num := Datos.AQ_AbonosVendidos.RecNo;    Si pruebo cualquiera de estas lineas el valor que entrega es el correcto
if ((num mod 2) = 0) then Self.Canvas.Brush.Color := clMoneyGreen;

igual.. voy a seguir intentando..

Salu2
__________________
BlueSteel

Última edición por BlueSteel fecha: 26-11-2010 a las 18:46:34.
Responder Con Cita
  #17  
Antiguo 26-11-2010
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.233
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
Revisa el ejemplo que te paso. Nos hemos dejado de indicarle que vuelva a pintar la fila.

Archivos Adjuntos
Tipo de Archivo: zip FilasAlternadasGrid.zip (157,0 KB, 29 visitas)
__________________
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.
Responder Con Cita
  #18  
Antiguo 26-11-2010
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Gracias Neftali

revise el ejemplo.. realice todo igual.... salvo 3 cosas:

cambiar el nombre del DBGrid... y de donde se obtienen los colores.

lo demás esta igual, pero no se por que no me pinta las filas.

si compilo tu ejemplo funciona bien.. pero quizas sea un bug de esos...

lo raro es que si quiero pintar las celdas que cumplan una condición si lo hace bien (en otro dbgrid)...

este es el codigo que utilizo...

Código Delphi [-]
procedure TTarjetas.DBGrid2DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var
  num : Integer;
begin
     num := Datos.AQ_AbonosVendidos.RecNo;
//     num := DBGrid2.DataSource.DataSet.RecNo;
     if ((num mod 2) = 0) then begin
        DBGrid2.Canvas.Brush.Color := clMoneyGreen;
        end
     else begin
          DBGrid2.Canvas.Brush.Color := clWindow;
     end;

    DBGrid2.DefaultDrawDataCell(Rect, Field, State);
end;

la proxima semana seguiré probando

Salu2 y que tengan un buen fin de semana
__________________
BlueSteel
Responder Con Cita
  #19  
Antiguo 29-11-2010
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.233
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
¿Sobre qué Base de Datos trabajas y con qué componentes estás probando?
Hay componentes que no implementan el Recno y puede ser que te esté devolviendo -1; En ese caso el pintado no funcionaría.
Esta propiedad está pensada para que sea redefinido por los derivados de TDataSet, si los componentes ue usas no la han redefinido no funcionará este código.
__________________
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.
Responder Con Cita
  #20  
Antiguo 29-11-2010
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
Hay una forma de pintar alternadamente las filas sin depender del número de registro que consiste en calcular la fila a partir de la posición de la celda que se está dibujando (Rect.Top) y la altura de las filas.

No la he encontrado pero creo que es algo como esto:

Código Delphi [-]
type
  TExDBGrid = class(TDBGrid);

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Odd(Rect.Top div (TExDBGrid(DBGrid1).DefaultRowHeight + Integer(dgRowLines in DBGrid1.Options))) then
    DBGrid1.Canvas.Brush.Color := clMoneyGreen;

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

procedure TForm1.MyTable1AfterScroll(DataSet: TDataSet);
begin
  DBGrid1.Refresh;
end;

Creo recordar que era algo más sencillo pues aquí hay que manejar el evento AfterScroll del DataSet que se esté usando. Pero por ahí va la idea.

// Saludos
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como pintar la fila de un DBGrid Gustavo Gowdak OOP 2 04-05-2006 22:34:04
Pintar toda una fila de un DBGrid Luciano M. Varios 4 02-05-2006 23:30:24
Pintar Fila del DBGrid Palmiro Conexión con bases de datos 2 06-04-2006 00:25:51
Copiar Fila Completa de un DBGrid a otro jdangosto OOP 2 19-07-2005 10:15:48
Pintar Fila por medio en ub DBGrid josem OOP 3 01-01-2005 21:54:52


La franja horaria es GMT +2. Ahora son las 18:05:08.


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