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 23-11-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Color DBGrid según grupo de filas

Hola el tema ronda el OnDrawColumCell del DBGrid y el Canvas.Brush.Color

He leido varios sobre lo del alternado de colores. Las filas pares de un color, las otras de otro, pero yo quiero algo más complicado.

Quiero imprimir en un color las que cumplan un determinado valor en una columna y al cambiar ese valor, cambiar tambien el color de todas las filas.

Ejemplo: Si imprimo estas columnas

103 07 ....
103 07 ....
103 07 ....
103 07 ....

103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....


Es decir cambiar el color cuando cambie el valor de una columna con respecto al valor de la misma columna de la anterior fila. He cambiado de color al cambiar en la segunda columna el valor de 07 a 08.

¿Alguien sabe?

Gracias por todo y hasta mañana.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #2  
Antiguo 23-11-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
Saludos
Podrias usar esto, en caso de que el campo sea Integer:
Código Delphi [-]
Begin
if (State = []) then begin
    with dbgrid do begin
      if (Column.Index=1) then
        case Columns[1].Field.AsInteger of
        0:Canvas.Brush.Color := clRed
        1:Canvas.Brush.Color := clGreen
        ....
        ....
        end;//Case
      DefaultDrawColumnCell(rect,DataCol,Column,State);
    end;//With
  end;//If
end;
__________________
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
  #3  
Antiguo 24-11-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Gracias por tu ayuda, pero....

Por lo que "trazo" en tu función los valores que debe tomar la columna en tu ejemplo (Column.Index=1) son discretos, es decir, valores conocidos y concretos como son 0, 1....
Código Delphi [-]
   case Columns[1].Field.AsInteger of
          0:Canvas.Brush.Color := clRed
          1:Canvas.Brush.Color := clGreen
          ....
          ....
y a razón de ellos cambio el color.

Perfecto.

Pero yo no necesito eso, y no sé como hacerlo lo que necesito.

Lo que deseo es:

Poder cambiar el color del fondo de las líneas o las letras, eso es igual, a razón del cambio de valor de una columna respecto de la fila anterior.

Si la columna 1 en la fila 1 del grid tenia valor '100' que salga en color azul, y si en la fila 2 la columna 1 vale '123' que cambie el color a rojo por ejemplo, y si en la línea 3 la columna 1 vuelve a cambiar el valor respecto de la columna 1 linea 2, volver a cambiarle el color a azul. No cambiando el color de la fila mientras no cambie el valor de la columna con respecto de la anterior fila

El resultado debería ser algo pareceido a eso:

103 07 ....
103 07 ....
103 07 ....
103 07 ....
Cambiando aqui el color por el cambio de valor de la columna
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....


En realidad la confusión la tengo a la hora de donde implementar el algoritmo que pueda almacenar el valor de la columna de la anterior fila para comprarlo con el valor de la misma columna pero de la fila actual para despues de compararlo poder cambiar el color si son diferentes.

Gracias.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.

Última edición por Cabanyaler fecha: 24-11-2005 a las 09:03:07.
Responder Con Cita
  #4  
Antiguo 24-11-2005
Nelet Nelet is offline
Miembro
 
Registrado: may 2003
Ubicación: Picassent - Valencia
Posts: 95
Poder: 21
Nelet Va por buen camino
No se si estaré diciendo una animalada, pero se me ocurre que puedes declarar una variable global en la unidad para guardar el valor del campo del registro anterior y después comparar el valor de la variable con el del registro actual en el procedimiento OnDrawColumCell.

Si el valor coincide no cambias el color ni el valor de la variable en el procedimiento. Si el valor difiere cambias el color y asignas a la variable el valor del campo.
__________________
_____________________________________
And follow me to where the real fun is
Responder Con Cita
  #5  
Antiguo 24-11-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Eso lo había pensado, y ahora lo voy a probar.

Lo que desconozco es si eso lo puedo implementar en ese Evento.
Es un algoritmo parecido al de eliminación de duplicados, bueno parecido...
Ya digo si me ha salido y soy pasto de mis lágrimas.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #6  
Antiguo 24-11-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Hola, ya lo he hecho, pero sólo me pinta la primera columna de la tupla apartir de la que debería empezar a tener el color deseado.
El código es:
Código Delphi [-]
procedure TFLibroNegro.DBGridLibroNegroDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
    if (NumSubObr_ant <> DBGridLibroNegro.Fields[1].Value) and (DBGridLibroNegro.Canvas.Brush.Color = clinfoBk) then
    begin
        DBGridLibroNegro.Canvas.Brush.Color := clSkyBlue;
        DBGridLibroNegro.Canvas.FillRect(Rect);
    end;

    NumSubObr_ant := DBGridLibroNegro.Fields[1].Value;

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

Y el resultado de una manera más o menos visual es:

103 07 ....
103 07 ....
103 07 ....
103 07 .... Cambiando aqui el color por el cambio de valor de la columna
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....

Cuando el resultado debería ser algo pareceido a eso:

103 07 ....
103 07 ....
103 07 ....
103 07 ....
Cambiando aqui el color por el cambio de valor de la columna
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #7  
Antiguo 24-11-2005
Nelet Nelet is offline
Miembro
 
Registrado: may 2003
Ubicación: Picassent - Valencia
Posts: 95
Poder: 21
Nelet Va por buen camino
Y si asignaras el color mediante otra variable global?.

Empiezas con uno y cuando cambie el valor del registro cambias el asignas la variable global donde guardas el valor y lo mismo con la variable para el color.
__________________
_____________________________________
And follow me to where the real fun is
Responder Con Cita
  #8  
Antiguo 24-11-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Si ya lo he probado Nelet, pero nada, el resultado es el mismo.

Desisto, tiro la toalla.

Como diría Tarantino : - Llebo todo el pu#o día con esta jod#*a mier+# y no me funciona.

Ya lo curraré de otro modo.
Gracias y un saludo a todos los que habéis intentado ayudarme.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #9  
Antiguo 25-11-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Creo que se escapa una cosa. Tienes que actualizar el valor de la variable sólo cuando sea distinta... si no te ocurre lo que ahora.

Código:
Código Delphi:
procedure TFLibroNegro.DBGridLibroNegroDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
    if (NumSubObr_ant <> DBGridLibroNegro.Fields[1].Value) and (DBGridLibroNegro.Canvas.Brush.Color = clinfoBk) then
    begin
        DBGridLibroNegro.Canvas.Brush.Color := clSkyBlue;
        DBGridLibroNegro.Canvas.FillRect(Rect);
  { observa que la he cambiado de sitio, pequño detalle }
       NumSubObr_ant := DBGridLibroNegro.Fields[1].Value;

    end;

    DBGridLibroNegro.DefaultDrawColumnCell(rect,DataCol,Column,State);
end;
A ver si tienes suerte...
Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #10  
Antiguo 25-11-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
Saludos

Pienso que este tema tiene que ver mas con programacio qeu con simple coneccion a BD, por tal razon lo he movido a esta area.
__________________
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
  #11  
Antiguo 26-11-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Despues de probar lo que te respondí, realmente he de reconocer que no funciona, porque no, sin más, no voy a entrar en detalles

Cuando el resultado debería ser algo pareceido a eso:

103 07 ....
103 07 ....
103 07 ....
103 07 .... Cambiando aqui el color por el cambio de valor de la columna
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....
103 08 ....

Lo más parecido a esto que puedes hacer es que cuando cambie el valor de la columna 2, hagas un cáculo y que cambies el valor del color. Para ello, tendrás que tener llena la secuencia 01, 02, 03, 04,..... Si tuvieses 01,03,04, no te valdría por lo menos según el código que te adjunto

Código:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
    if (Sender as TDBGrid).Datasource.DataSet.Fields[5].AsInteger mod 2 = 0 then
        (Sender as TDBGrid).Canvas.Brush.Color := clSkyBlue
      else
        (Sender as TDBGrid).Canvas.Brush.Color := clinfobk;
(Sender as TDBGrid).Canvas.Font.Color := clBlack;
(Sender as TDBGrid).DefaultDrawColumnCell(rect,DataCol,Column,State);


end;
Pues eso, si te vale bien, si no, .....

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #12  
Antiguo 28-11-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
... ya, gracias por tu interés. No obstante, he tirado por otro camino debido a que la secuencia de números, nunca tiene porqué ser secuencial.

Un saludo.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
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 18:03:22.


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