Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Cambiar de color una celda de dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=82818)

zeta2 17-04-2013 07:22:06

Cambiar de color una celda de dbgrid
 
Muchachos, se que este tema se trató en otras publicaciones, sólo quiero una ayudita...

Quiero hacer lo siguiente: Tengo un dbgrid que me muestra el contenido de una tabla. Hay un campo llamado 'Hora de Entrada' (una columna), quiero que si el contenido de esa celda es antes de las 12 del mediodía sea de un color, y es despues sea de otro...

Tengo un código el cual funciona muy bien, pero funciona con enteros no con horas, le quise cambiar el ".asfloat" por ".astime" pero no me funciona. Donde Dice "Numero" iría el nombre del campo del tipo Time "Hora de Entrada"

El código va en el evento OnDrawColumnCell es el siguiente:

Código:

inherited;

if (Column.Index = 1) and (Column.Field.Dataset.FieldbyName('Numero').AsFloat < 12) then
 Begin
  TDrawGrid(sender).canvas.Brush.Color := clGreen;
  TdbGrid(sender).DefaultDrawColumnCell(Rect, Datacol, Column, State);
 end;

Espero que puedan ayudarme.

Muchas gracias por su tiempo.

Saludos.

Neftali [Germán.Estévez] 17-04-2013 10:45:45

Revisa la función HourOf de DateUtils (y el resto de funciones de esa unit). con eso deberías poder extraer la hora del campo y con ese valor comparar para saber el color a utilizar.

zeta2 17-04-2013 17:09:17

Le busco la vuelta pero nada funciona... Si le pongo "Asstring" el sistema levanta pero me marca cualquier cosa.

El campo es del tipo TTime y debería funcionar el "AsDateTime" pero no funciona. La verdad no se que ponerle...

Saludos.

ecfisa 17-04-2013 19:03:05

Hola zeta2.

Código Delphi [-]
procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  CCOLOR : array [Boolean] of TColor = (clLime, clMoneyGreen);
begin
  with Sender as TDBGrid do
  begin
    if Column.Field.FieldName = 'Hora_de_Entrada' then  // Nombre del campo DateTime
      Canvas.Brush.Color := CCOLOR[Frac(Column.Field.AsDateTime) > 0.5];
    DefaultDrawColumnCell(Rect, Datacol, Column, State);
  end;
end;

Saludos.

zeta2 17-04-2013 19:20:09

Lo probe y funciona, sólo que me marca todos los campos con contenido de un color y los nulos de otro... donde especifico que quiero pintar las celdas que tienen antes de las 12:00:00? donde dice "> 0.5"?

Gracias por ayudarme...

Saludos.

ecfisa 17-04-2013 19:28:41

Hola.

Había entendido que querías de un color las celdas de valor menor al mediodia y de otro las que eran despues.

Si se trata de pintar sólo las de valor menor sería:
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with Sender as TDBGrid do
  begin
    if Column.Field.FieldName = 'Hora_de_Entrada' then
      if Frac(Column.Field.AsDateTime) < 0.5 then
        Canvas.Brush.Color := clMoneyGreen;
    DefaultDrawColumnCell(Rect, Datacol, Column, State);
  end;
end;

Saludos.

zeta2 17-04-2013 19:46:22

AHí lo entendí bien y funciona de maravilla, ahoralo que quiero saber es que significa "> 0.5", modificando eso puedo cambiar el horario de la condición? Un ejemplo si quiero que en lugar de las 12 del medio día sea las 16:00 Hs, como sería?

Saludos y gracias por tu tiempo.

ecfisa 17-04-2013 20:48:14

Cita:

Empezado por zeta2 (Mensaje 458792)
AHí lo entendí bien y funciona de maravilla, ahoralo que quiero saber es que significa "> 0.5", modificando eso puedo cambiar el horario de la condición? Un ejemplo si quiero que en lugar de las 12 del medio día sea las 16:00 Hs, como sería?

Hola.

El tipo TDateTime está declarado como Double, la parte entera representa la fecha y la fraccionaria la hora. Esta última se manifiesta como la fracción transcurrida del día, por ejemplo:
Código:

6  h  = (1/4) => 0.25 * 24
12 h  = (1/2) => 0.5  * 24
16 h  = (2/3) => 0.666666666666667 * 24

Saludos

zeta2 25-02-2014 21:40:19

Ecfisa, todo funcionó perfecto, tuve que hacer el cálculo de cada hora para pasarlo a double, pero es una regla de 3 simple...

Ahora me ha surgido otro problema con el mismo código.

Este código momifica toda la columna, le pone un color a la celda si el horario es antes de las 12 y otro color si es después de las 12... Todo operando con mismo valor:

Código Delphi [-]
 if Frac(Column.Field.AsDateTime) < 0.5 then

Ahora, que pasa si necesito que el valor varíe según el registro. Es decir, en el registro tengo 2 campos:

Hora_de_Entrada (Hora en la que el sistema registró su entrada)
Hora_Oficial_de_Entrada (Hora oficial establecida por la empresa, el cual no se puede pasar por que indicaría tardanza)

Se puede hacer que ese 0.5 sea reemplazado por el valor de Hora_Oficial_de_Entrada y así en cada registro?

Que la operación de cada registro sea independiente, no un valor para toda la columna...

Me explico?

Si no se entiende me dicen y busco la manera de explicarlo de nuevo.

Espero que puedan ayudarme.

Atte. Marco.

ecfisa 26-02-2014 00:00:33

Cita:

Empezado por zeta2 (Mensaje 473040)
...
Ahora, que pasa si necesito que el valor varíe según el registro. Es decir, en el registro tengo 2 campos:

Hora_de_Entrada (Hora en la que el sistema registró su entrada)
Hora_Oficial_de_Entrada (Hora oficial establecida por la empresa, el cual no se puede pasar por que indicaría tardanza)

Se puede hacer que ese 0.5 sea reemplazado por el valor de Hora_Oficial_de_Entrada y así en cada registro?
...

Hola Marco.

Si no entendí mal lo que solicitas arriba, sería:
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with Sender as TDBGrid do
  begin
    if Column.Field.FieldName = 'Hora_de_Entrada' then
      if Frac(Column.Field.AsDateTime) < Frac(DataSource.DataSet.FieldByName('Hora_Oficial_de_Entrada').AsDateTime) then
        Canvas.Brush.Color := clMoneyGreen;
    DefaultDrawColumnCell(Rect, Datacol, Column, State);
  end;
end;

Saludos :)

Muriel 30-06-2016 00:37:10

cambiar coloer de una celda en DBGrid
 
Hola amigos del foro.

Tengo un problema ayuden me por favor.

Es el siguiente tengo un DBGrid de color verde que me muestra el contenido de una tabla y las letras son blancas asta ahí todo bien el problema es cuando quiero modificar algo la celda se pone blanco y ya no se ve lo que escribo, como ago para que la celda donde esta el foco se mantenga verde o de otro color que no sea blanco.

Saludo y gracias.

Neftali [Germán.Estévez] 30-06-2016 11:21:47

A ese código tendrás que añadirle algo, para tener en cuenta el Estado en que se encuentra la fila del grid.
Para esto tienes el parámetro State, que te llega en el evento.

Aquí tienes un ejemplo de cómo usarlo:
http://www.clubdelphi.com/foros/showthread.php?t=68474

pacopenin 30-06-2016 11:32:46

Buenas.

A través del parámetro State: TGridDrawState puedes controlar el estado de la celda. Toma los valores (gdSelected, gdFocused, gdFixed).

Y por favor, revisa la ortografía y la forma de plantear la pregunta antes de enviarla....

pacopenin 30-06-2016 11:34:38

Veo que mientras preparaba la respuesta se me han adelantado. Mira el ejemplo que enlaza Neftali.

rretamar 01-07-2016 23:33:12

En LAZARUS lo hago de esta forma:

Código Delphi [-]
procedure TFAbm_Estudios.DBGrid1PrepareCanvas(sender: TObject; DataCol: Integer;  Column: TColumn; AState: TGridDrawState);   // Colorización de celdas
Var
  Finalizado, Reservado, Informado, Transcripto, Revisado: Boolean;
begin
  With Sender As TDBGrid Do
    Begin
       Finalizado := DataSource.DataSet.FieldByName('TECNICO').AsInteger > 0;
       Reservado := (DataSource.DataSet.FieldByName('MEDICO').AsInteger > 0) And DataSource.DataSet.FieldByName('FECHA_INFORME').IsNull;
       Informado := (DataSource.DataSet.FieldByName('MEDICO').AsInteger > 0) And (Not DataSource.DataSet.FieldByName('FECHA_INFORME').IsNull);
       Transcripto := DataSource.DataSet.FieldByName('TRANSCRIPCION').AsInteger > 0;
       Revisado := DataSource.DataSet.FieldByName('REVISION').AsInteger > 0;
       //
       If Revisado Then
         Begin
           Canvas.Brush.Color := Panel8.Color; // Estudio terminado de corregir y listo para entregar (celeste)
           Canvas.Font.Color := ClBlack;
           Exit;
         end;
       If Transcripto Then
         Begin
           Canvas.Brush.Color := Panel7.Color; // Transcripción terminada (verde)
           Canvas.Font.Color := ClBlack;
           Exit;
         end;
       If Informado Then
         Begin
           Canvas.Brush.Color := Panel6.Color; // Estudio terminado de informar (celeste)
           Canvas.Font.Color := ClBlack;
           Exit;
         end;
       If Reservado Then
         Begin
           Canvas.Brush.Color := Panel9.Color; // Estudio reservado por un médico para informar
           Canvas.Font.Color := ClBlack;
           Exit;
         end;
       If Finalizado Then
         Begin
           Canvas.Brush.Color := Panel5.Color; // Estudio finalizado (gris)
           Canvas.Font.Color := ClBlack;
           Exit;
         end;
    End;
end;


La franja horaria es GMT +2. Ahora son las 20:39:14.

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