Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comportamiento en cambio de color celda DBGRID (https://www.clubdelphi.com/foros/showthread.php?t=95682)

novato_erick 09-05-2022 19:04:12

Comportamiento en cambio de color celda DBGRID
 
1 Archivos Adjunto(s)
Hola a todos:

tengo este código para cambiar de color a AMARILLO o si es salida y verde si es ENTRADA sin embargo en el grid si traigo
mediante un procedimiento todas las entradas el color es correcto pero si en el procedimiento traigo "Todo" ENTRADA Y SALIDAS se pone Amarillo las Entrada y Verde la Salida pero solamente cuando traigo todo los movimientos.


Código Delphi [-]
procedure TfrmMovimientoProductos.dbgMovDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with TDBGrid(Sender).Canvas do
  begin
  if dbgMov.DataSource.DataSet.FieldByName('TIPO_MOVIMIENTO').AsString =
  'ENTRADAS' then
  begin
    dbgMov.Columns[8].Color := clGreen;
    dbgMov.Columns[8].Font.Color := clWhite;
  end
  else
  begin
    dbgMov.Columns[8].Color := clYellow;
    dbgMov.Columns[8].Font.Color := clWindowText;
  end;
  end;
end;

Agradeciendo cualquier comentario referente a este comportamiento. También adjunte imagen donde se muestra esto.




Saludos y Bendiciones

pd: como se hace para adjuntar directamente las imagenes?

novato_erick 09-05-2022 19:05:11

Lo siento se ve espantoso la imagen :confused::confused:


Saludos

Casimiro Notevi 09-05-2022 19:24:43

Te falta "repintarlo" con los cambios, algo así:
Código Delphi [-]
if Column.Field = ClientDataSet1SALDO then
  if ClientDataSet1SALDO.AsCurrency < 200 then
  begin
    DBGrid1.Canvas.Font.Color := clRed;
    DBGrid1.DefaultDrawDataCell(rect,Column.Field,State);
  end;

Casimiro Notevi 09-05-2022 19:25:55

Mira este ejemplo tan completo.

novato_erick 09-05-2022 21:20:49

Cita:

Empezado por Casimiro Notevi (Mensaje 546791)
Te falta "repintarlo" con los cambios, algo así:
Código Delphi [-]
if Column.Field = ClientDataSet1SALDO then
  if ClientDataSet1SALDO.AsCurrency < 200 then
  begin
    DBGrid1.Canvas.Font.Color := clRed;
    DBGrid1.DefaultDrawDataCell(rect,Column.Field,State);
  end;

Hola Casimiro gracia por tu extrema rápida respuesta :):
cabe señalar que

Código Delphi [-]
   DBGrid1.Canvas.Font.Color := clRed; //Trabaja es con el color de fuente no con celda en mi caso es la celda de la columna :confused:
   DBGrid1.DefaultDrawDataCell(rect,Column.Field,State);// esto pone encima un color en la fuente desagradable
//t al pintarse al cual si sufriera uno de miopía !!!:-|

chenech 09-05-2022 21:43:25

En C++ Builder
 
Yo con esto pongo el fondo en amarillo, rojo o verde según el estado del campo LIMPIA si es S o N o P, no se si será algo así lo que necesitas, a mi me funciona muy bien y rápido pintando el grid con cientos de filas. En C++ Builder, lo siento pero no me entero de Delphi, si alguien lo traduce. Un saludo.
Código:

        TDataSet *dataset = Column->Field->DataSet;
        if(dataset->FieldByName("NOMCLI")->AsString.Length() < 1)
                DBGrid1->Canvas->Brush->Color = clCream;
        else
        {
                if(dataset->FieldByName("NOMHAB")->AsString == "¡¡¡ BLOQUEADA !!!")
                        DBGrid1->Canvas->Brush->Color = clSilver;
                else
                        DBGrid1->Canvas->Brush->Color = clSkyBlue;
        }
        if(dataset->FieldByName("TIPOHAB")->AsString.SubString(1, 3) == "PRT")
                DBGrid1->Canvas->Brush->Color = clOlive;
// Para lo seleccionado cambio el color a rojo y negrita
        if(State.Contains(Grids::gdSelected))
        {
//                        DBGrid1->Canvas->Font->Color = clRed;
                        DBGrid1->Canvas->Font->Style = TFontStyles() << fsBold;
        }
        DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
        if(DataCol == 0)
        {
                if(dataset->FieldByName("LIMPIA")->AsString == "S")
                        DBGrid1->Canvas->Brush->Color = clGreen;
                else
                {
                        if(dataset->FieldByName("LIMPIA")->AsString == "P")
                                DBGrid1->Canvas->Brush->Color = clYellow;
                        else
                                DBGrid1->Canvas->Brush->Color = clRed;
                }
                DBGrid1->DefaultDrawDataCell(Rect, Column->Field, State);
        }


Casimiro Notevi 09-05-2022 22:32:42

No entiendo qué dices :confused:

novato_erick 09-05-2022 22:54:08

Cita:

Empezado por Casimiro Notevi (Mensaje 546798)
No entiendo qué dices :confused:

Sip disculpa a la finales no me expliqué lo siento creo que mis pensamientos fueron más rápido que mis dedos :(.

Al usar:
Código Delphi [-]
    DBGrid1.Canvas.Font.Color := clRed;
    DBGrid1.DefaultDrawDataCell(rect,Column.Field,State);

al usar el DBGrid1.Canvas.Font.Color := clRed me cambia el color de fuente necesito es la columna cuado está en estado de "ENTRADA" no la fuente o Fila.
he notado que al poner DBGrid1.DefaultDrawDataCell(rect,Column.Field,State); me pone en negrita en Windows 10 y en Windows 11 se ve horrible. no se entiende lo que dice.

Saludos;

novato_erick 09-05-2022 23:01:44

Cita:

Empezado por chenech (Mensaje 546796)
Yo con esto pongo el fondo en amarillo, rojo o verde según el estado del campo LIMPIA si es S o N o P, no se si será algo así lo que necesitas, a mi me funciona muy bien y rápido pintando el grid con cientos de filas. En C++ Builder, lo siento pero no me entero de Delphi, si alguien lo traduce. Un saludo.
Código:

        TDataSet *dataset = Column->Field->DataSet;
        if(dataset->FieldByName("NOMCLI")->AsString.Length() < 1)
                DBGrid1->Canvas->Brush->Color = clCream;
        else
        {
                if(dataset->FieldByName("NOMHAB")->AsString == "¡¡¡ BLOQUEADA !!!")
                        DBGrid1->Canvas->Brush->Color = clSilver;
                else
                        DBGrid1->Canvas->Brush->Color = clSkyBlue;
        }
        if(dataset->FieldByName("TIPOHAB")->AsString.SubString(1, 3) == "PRT")
                DBGrid1->Canvas->Brush->Color = clOlive;
// Para lo seleccionado cambio el color a rojo y negrita
        if(State.Contains(Grids::gdSelected))
        {
//                        DBGrid1->Canvas->Font->Color = clRed;
                        DBGrid1->Canvas->Font->Style = TFontStyles() << fsBold;
        }
        DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
        if(DataCol == 0)
        {
                if(dataset->FieldByName("LIMPIA")->AsString == "S")
                        DBGrid1->Canvas->Brush->Color = clGreen;
                else
                {
                        if(dataset->FieldByName("LIMPIA")->AsString == "P")
                                DBGrid1->Canvas->Brush->Color = clYellow;
                        else
                                DBGrid1->Canvas->Brush->Color = clRed;
                }
                DBGrid1->DefaultDrawDataCell(Rect, Column->Field, State);
        }


Hola gracias por tu respuesta sin embargo al usar DBGrid1->Canvas->Brush->Color = clRed; me cambia toda la fila.
lo que requiero es sólo la celda de la columna especifica.

Código Delphi [-]
if(dataset->FieldByName("NOMHAB")->AsString == "¡¡¡ BLOQUEADA !!!")
      DBGrid1->Columns[8]->Color = clSilver;
    else
      DBGrid1->Columns[8]->Color = clSkyBlue;
//lo siento no he trabajado con C++ Pero puedo imaginar que sería algo igual que esto

  if dbgMov.DataSource.DataSet.FieldByName('TIPO_MOVIMIENTO').AsString =
  'ENTRADAS' then
  begin
    dbgMov.Columns[8].DefaultColor; // solo la celda debe de pintar 
    dbgMov.Columns[8].Color := clGreen;
    //dbgMov.Canvas.Brush.Color := clGreen; //esto me marca toda la fila
   // dbgMov.Canvas.Font.Color := clWhite;
    dbgMov.Columns[8].Font.Color := clWhite;
  end
  else
  begin
     // dbgMov.Canvas.Brush.Color := clYellow;// igual toda la fila
    //dbgMov.Canvas.Font.Color := clWindowText;
    dbgMov.Columns[8].Color := clYellow;
    dbgMov.Columns[8].Font.Color := clWindowText;
  end;
  dbgMov.DefaultDrawColumnCell(Rect, Datacol, Column, State);

Gracias por tu código igual me parece interesante como se muestra la info. pero el requerimiento es por celda.


Saludos y Bendiciones.

novato_erick

novato_erick 09-05-2022 23:08:53

1 Archivos Adjunto(s)
El inconveniente es por ejemplo:

https://clubdelphi.com/foros/attachm...1&d=1652130314


Espero que se pueda ver mejor la imagen. en donde donde dice ENTRADA está en amarillo y SALIDA está en Verde
es algo que no encuentro cómo controlar


Saludos;

chenech 09-05-2022 23:18:20

Con esto cambio solo la celda
 
Código:

        if(DataCol == 0)
        {
                if(dataset->FieldByName("LIMPIA")->AsString == "S")
                        DBGrid1->Canvas->Brush->Color = clGreen;
                else
                {
                        if(dataset->FieldByName("LIMPIA")->AsString == "P")
                                DBGrid1->Canvas->Brush->Color = clYellow;
                        else
                                DBGrid1->Canvas->Brush->Color = clRed;
                }
                DBGrid1->DefaultDrawDataCell(Rect, Column->Field, State);
      }


chenech 09-05-2022 23:26:54

Imagen
 
1 Archivos Adjunto(s)
Adjunto imagen como se ve las celdas con colores

novato_erick 10-05-2022 01:12:37

2 Archivos Adjunto(s)
Cita:

Empezado por chenech (Mensaje 546802)
Código:

        if(DataCol == 0)
        {
                if(dataset->FieldByName("LIMPIA")->AsString == "S")
                        DBGrid1->Canvas->Brush->Color = clGreen;
                else
                {
                        if(dataset->FieldByName("LIMPIA")->AsString == "P")
                                DBGrid1->Canvas->Brush->Color = clYellow;
                        else
                                DBGrid1->Canvas->Brush->Color = clRed;
                }
                DBGrid1->DefaultDrawDataCell(Rect, Column->Field, State);
      }


Aquí pasa esto usando: https://clubdelphi.com/foros/attachm...1&d=1652137628

Código Delphi [-]
 DBGrid1.Canvas.Brush.Color := clYellow;



Si tienes razón hasta nuestro amigo lo menciona aquí: https://clubdelphi.com/foros/attachm...1&d=1652137628

Cita:

Empezado por Casimiro Notevi (Mensaje 546791)
Te falta "repintarlo" con los cambios, algo así:
Código Delphi [-]
if Column.Field = ClientDataSet1SALDO then
  if ClientDataSet1SALDO.AsCurrency < 200 then
  begin
    DBGrid1.Canvas.Font.Color := clRed;
    DBGrid1.DefaultDrawDataCell(rect,Column.Field,State);// aquí es donde digo que me pone horrible la fuente
  end;

Creo que me doy a Explicar.

Saludos;

novato_erick 10-05-2022 02:16:14

Solucionado Comportamiento en cambio de color celda DBGrid
 
Ahora si chicos en realidad el comportamiento extraño se da cuando usaba directamente el componente DBGrid para comparar la columna:
Este es la forma Antigua:

Código Delphi [-]
procedure TfrmMovimientoProductos.dbgMovDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with TDBGrid(Sender).Canvas do
  begin
  if dbgMov.DataSource.DataSet.FieldByName('TIPO_MOVIMIENTO').AsString =
  'ENTRADAS' then//<----- aquí se daba todo el problema
  begin
    dbgMov.Columns[8].Color := clGreen;
    dbgMov.Columns[8].Font.Color := clWhite;
  end
  else
  begin
    dbgMov.Columns[8].Color := clYellow;
    dbgMov.Columns[8].Font.Color := clWindowText;
  end;
  end;
end;

Haciendo esto por ayuda de ustedes:

Código Delphi [-]
procedure TfrmMovimientoProductos.dbgMovDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if Column.Field = dmLogicaArticulos.cdsMovimientoArticulosTotalTIPO_MOVIMIENTO then
  if dmLogicaArticulos.cdsMovimientoArticulosTotalTIPO_MOVIMIENTO.AsString =
  'ENTRADAS' then //<-- Aquí realicé el cambio y funcionó
  begin
   dbgMov.Canvas.FillRect(Rect);
   dbgMov.Canvas.Brush.Color := clGreen;
   dbgMov.Canvas.Font.Color := clWhite;
  end
  else
  begin
    dbgMov.Canvas.FillRect(Rect);
    dbgMov.Canvas.Brush.Color := clYellow;
    dbgMov.Canvas.Font.Color := clWindowText;
  end;
   dbgMov.DefaultDrawColumnCell(rect,DataCol, Column, State);
end;

En realidad fue extraño sin embargo pude solucionar obteniendo el comportamiento deseado.

Saludos a todos y mil gracias

novato_erick

Casimiro Notevi 10-05-2022 07:37:40

^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 05:25:00.

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