PDA

Ver la Versión Completa : Comportamiento en cambio de color celda DBGRID


novato_erick
09-05-2022, 19:04:12
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.



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í:
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 (https://intitec.com/varios/TrucosParaGrids.rar) tan completo.

novato_erick
09-05-2022, 21:20:49
Te falta "repintarlo" con los cambios, algo así:
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


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

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

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.


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
El inconveniente es por ejemplo:

https://clubdelphi.com/foros/attachment.php?attachmentid=3996&stc=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
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
Adjunto imagen como se ve las celdas con colores

novato_erick
10-05-2022, 01:12:37
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/attachment.php?attachmentid=3999&stc=1&d=1652137628

DBGrid1.Canvas.Brush.Color := clYellow;



Si tienes razón hasta nuestro amigo lo menciona aquí: https://clubdelphi.com/foros/attachment.php?attachmentid=3998&stc=1&d=1652137628

Te falta "repintarlo" con los cambios, algo así:
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
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:


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:


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
^\||/^\||/^\||/