Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-04-2011
ToritoCapo ToritoCapo is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 14
Poder: 0
ToritoCapo Va por buen camino
Como poner color a filas de un DBGrid

Hola amigos !!!

Hago la siguiente consulta desde mi programa en C++ Builder a Postgres en SQL :
"select * from mprimas where stock_actual < stock_minimo";

Estos resultados se muestran en un DBGrid donde figuran 4 columnas:
Nombre, Stock_Actual, Stock_Minimo y Stock_Critico

Lo que quiero hacer es, donde el stock_actual es inferior al stock_critico, pintar las filas de un color cualquiera asi resaltan del resto que no tienen color.

Espero que se entienda.
Saludos.
Responder Con Cita
  #2  
Antiguo 05-04-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Al final de esta página tienes varios enlaces sobre ese tema, también puedes hacer una búsqueda en clubdelphi, se ha tratado infinidad de veces ese asunto.
Responder Con Cita
  #3  
Antiguo 05-04-2011
ToritoCapo ToritoCapo is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 14
Poder: 0
ToritoCapo Va por buen camino
Si, ya busque por todos lados, pero ninguno está expresado para C++ Builder.

Ya lo logré hacer en un StringGrid, pero no puedo todavia en un DBGrid.
Lo que más me dificulta es poder comparar 2 filas del DBGrid, como puse en el ejemplo anterior.

Si alguien puede pasarme alguno de estos ejemplos en C++ se lo agradecería muchisimo.

Saludos.
Responder Con Cita
  #4  
Antiguo 05-04-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pon el código que lo veamos.
Responder Con Cita
  #5  
Antiguo 06-04-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola ToritoCapo.

Probá este código:
Código:
void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State)
{
  if(DBGrid1->DataSource->DataSet->FieldByName("STOCK_ACTUAL")->Value <
     DBGrid1->DataSource->DataSet->FieldByName("STOCK_CRITICO")->Value) {
    DBGrid1->Canvas->Brush->Color = clRed;
    DBGrid1->Canvas->Font->Color = clWhite;
    DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
  };
}
Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 06-04-2011 a las 00:06:09.
Responder Con Cita
  #6  
Antiguo 06-04-2011
ToritoCapo ToritoCapo is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 14
Poder: 0
ToritoCapo Va por buen camino
Esto seria muy parecido a lo que necesito hacer, pero en C++
Se están comparando dos columnas como yo necesito.

Saludos.


Código Delphi [-]
procedure TFMntInventario.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
iDif : Extended;
iFile: Extended;
begin
// Cambia color a Existencia por debajo del minimo
if ( Dt1.TInventario.FieldByName('ExistAct').AsInteger <
Dt1.TInventario.FieldByName('ExistMin').AsInteger ) then begin
DBGrid1.Canvas.Font.Color := clRed;
end;

Última edición por Casimiro Notevi fecha: 06-04-2011 a las 00:24:12.
Responder Con Cita
  #7  
Antiguo 06-04-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Añade la línea indicado por ecfisa, te la he copiado:

Código Delphi [-]
procedure TFMntInventario.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 
var 
  iDif : Extended; 
  iFile: Extended; 
begin // Cambia color a Existencia por debajo del minimo 
  if ( Dt1.TInventario.FieldByName('ExistAct').AsInteger < Dt1.TInventario.FieldByName('ExistMin').AsInteger ) then 
  begin 
    DBGrid1.Canvas.Font.Color := clRed; 
  end;

  DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);  // <- añade esta línea.
Responder Con Cita
  #8  
Antiguo 06-04-2011
ToritoCapo ToritoCapo is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 14
Poder: 0
ToritoCapo Va por buen camino
ecfisa, funcionó bien el código que me pasate !!!
Lo que no mencioné, es que los datos están en String y no en enteros, ahora tendría que ver la manera de compararlos, pero con los valores convertidos a numéricos.

Una ayudita más y no los molesto por un rato jeje.
Después pongo el código que funcionó bién para que sirva para otros.

Saludos.
Responder Con Cita
  #9  
Antiguo 06-04-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Rectifico, mira la contestación completa de ecfisa, ahí tienes la solución.
Responder Con Cita
  #10  
Antiguo 07-04-2011
ToritoCapo ToritoCapo is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 14
Poder: 0
ToritoCapo Va por buen camino
Bueno, acá pongo el código final, funciona perfecto para mi caso.

Código:
if(StrToFloat(DBGrid->DataSource->DataSet->FieldByName("stock_actual")->Value) <
StrToFloat(DBGrid->DataSource->DataSet->FieldByName("stock_critico")->Value))
   DBGrid->Canvas->Brush->Color = 0xFFAAFF;     //Pinta el fondo de las filas
 
DBGrid->Canvas->FillRect(Rect);
 
DBGrid->Canvas->Font->Color = clBlack;     //Color del texto
 
DBGrid->DefaultDrawColumnCell(Rect, DataCol, Column, State);

Quiero agradecer a ecfisa y a Casimiro Notevi, por la excelente ayuda que me brindaron, y la insistencia por resolver el tema.

Saludos !!!!!
Responder Con Cita
  #11  
Antiguo 08-04-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola ToritoCapo.

Me alegra mucho que hayas podido darle solución.

Pero creo importante aclararte un punto. No es necesaria la función StrToFloat cuando usas la propiedad Value ya que esta es de tipo Variant
y C++ se encarga de evaluar su tipo y hacer las conversiones pertinentes.

Es decir que el código que te puse funciona correctamente sin StrToFloat, que es lo que te dijo Casimiro en su último post.

Esta es una asignación totalmente válida:
Código:
  double x= DataSet->FieldByName("stock_actual")->Value;
También podés explicitar el tipo (si lo conoces):
Código:
  double y= DataSet->FieldByName("stock_actual")->AsFloat;
Pero con el uso de Value te olvidas de las conversiones.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 23-11-2012
borlandpablo borlandpablo is offline
Miembro
NULL
 
Registrado: oct 2012
Posts: 37
Poder: 0
borlandpablo Va por buen camino
Buenas, recupero este hilo porque he encontrado parte de lo que quiero hacer con mi programa. Ahora me gustaría controlar el color con un TEdit, es decir, yo tengo una lista de catálogos con los días que restan para terminar la promoción, entonces si yo escribo 5, que me coloree en rojo los días restantes menor o igual que el número que he puesto en el TEdit. Realmente lo que no sé es coger los valores de una función para pasarla a otra (DBGrid: OnDrawColumnCell -> TEdit: OnChange).

Un saludo.
Responder Con Cita
  #13  
Antiguo 23-11-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por favor, borlandpablo, si participas en el tema iniciado por otro forero, debe ser para ayudarle a solucionar su problema, pero no para que expongas el problema que tienes tú. Gracias por tu comprensión
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
Como poner color a una palabra buscada Alexander Conexión con bases de datos 7 12-09-2006 02:22:43
Cambiar color filas DBGrid Iskariote0087 Varios 5 23-01-2006 15:57:01
Color DBGrid según grupo de filas Cabanyaler OOP 11 28-11-2005 08:22:32
Listview vsReport : Como pintar parejas de filas de un solo color wvidela Varios 2 17-05-2005 21:47:57
Filas Diferente Color En Un Dbgrid jsc Varios 2 27-04-2004 17:32:44


La franja horaria es GMT +2. Ahora son las 17:19:50.


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