Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Color DBGrid según grupo de filas (https://www.clubdelphi.com/foros/showthread.php?t=27536)

Cabanyaler 23-11-2005 18:55:36

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. :D

vtdeleon 23-11-2005 22:23:00

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;

Cabanyaler 24-11-2005 08:53:44

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 :confused:

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.

Nelet 24-11-2005 10:09:59

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.

Cabanyaler 24-11-2005 10:31:19

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.

Cabanyaler 24-11-2005 13:08:49

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

Nelet 24-11-2005 13:17:18

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.

Cabanyaler 24-11-2005 17:46:58

Si ya lo he probado Nelet, pero nada, el resultado es el mismo.

Desisto, tiro la toalla. :mad:

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. ;)

fjcg02 25-11-2005 11:54:14

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

vtdeleon 25-11-2005 12:27:09

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.

fjcg02 26-11-2005 13:12:56

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

Cabanyaler 28-11-2005 08:22:32

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


La franja horaria es GMT +2. Ahora son las 19:52:24.

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