Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-05-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Comportamiento en cambio de color celda DBGRID

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?
Imágenes Adjuntas
Tipo de Archivo: jpg Movimiento.jpg (31,4 KB, 10 visitas)
Responder Con Cita
  #2  
Antiguo 09-05-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Lo siento se ve espantoso la imagen


Saludos
Responder Con Cita
  #3  
Antiguo 09-05-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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;
Responder Con Cita
  #4  
Antiguo 09-05-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Mira este ejemplo tan completo.
Responder Con Cita
  #5  
Antiguo 09-05-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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 
   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 
Responder Con Cita
  #6  
Antiguo 09-05-2022
chenech chenech is offline
Miembro
 
Registrado: dic 2013
Posts: 72
Poder: 11
chenech Va por buen camino
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);
	}
Responder Con Cita
  #7  
Antiguo 09-05-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No entiendo qué dices
Responder Con Cita
  #8  
Antiguo 09-05-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No entiendo qué dices
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;
Responder Con Cita
  #9  
Antiguo 09-05-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
Empezado por chenech Ver Mensaje
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
Responder Con Cita
  #10  
Antiguo 09-05-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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;
Imágenes Adjuntas
Tipo de Archivo: jpg Movimiento.jpg (36,0 KB, 10 visitas)
Responder Con Cita
  #11  
Antiguo 09-05-2022
chenech chenech is offline
Miembro
 
Registrado: dic 2013
Posts: 72
Poder: 11
chenech Va por buen camino
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);
       }

Última edición por chenech fecha: 09-05-2022 a las 23:36:22.
Responder Con Cita
  #12  
Antiguo 09-05-2022
chenech chenech is offline
Miembro
 
Registrado: dic 2013
Posts: 72
Poder: 11
chenech Va por buen camino
Imagen

Adjunto imagen como se ve las celdas con colores
Imágenes Adjuntas
Tipo de Archivo: jpg Sin título.jpg (31,9 KB, 10 visitas)
Responder Con Cita
  #13  
Antiguo 10-05-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
Empezado por chenech Ver Mensaje
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 Ver Mensaje
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;
Imágenes Adjuntas
Tipo de Archivo: jpg 2022-05-09 (2).jpg (34,4 KB, 8 visitas)
Tipo de Archivo: jpg 2022-05-09 (3).jpg (36,5 KB, 8 visitas)
Responder Con Cita
  #14  
Antiguo 10-05-2022
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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
Responder Con Cita
  #15  
Antiguo 10-05-2022
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cambiar de color una celda de dbgrid zeta2 Conexión con bases de datos 14 01-07-2016 23:33:12
DBGrid Color Celda hcalero Varios 2 13-04-2007 13:37:42
Cambio de color en el fondo de un DBGrid manu Conexión con bases de datos 1 31-12-2006 18:58:26
Cambiar el color de una celda de un DBGrid candido OOP 2 06-08-2004 10:22:28
Cambio color en una linea dbgrid nugame Gráficos 2 19-05-2003 17:58:29


La franja horaria es GMT +2. Ahora son las 18:53:51.


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