Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Como poner color a filas de un DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=73164)

ToritoCapo 05-04-2011 00:47:18

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.

Casimiro Notevi 05-04-2011 00:50:40

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.

ToritoCapo 05-04-2011 23:11:35

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.

Casimiro Notevi 05-04-2011 23:13:40

Pon el código que lo veamos.

ecfisa 06-04-2011 00:03:03

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.

ToritoCapo 06-04-2011 00:03:21

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;

Casimiro Notevi 06-04-2011 00:25:08

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.

ToritoCapo 06-04-2011 00:28:53

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.

Casimiro Notevi 06-04-2011 00:29:09

Rectifico, mira la contestación completa de ecfisa, ahí tienes la solución.

ToritoCapo 07-04-2011 21:10:47

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

ecfisa 08-04-2011 00:13:13

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.

borlandpablo 23-11-2012 11:21:39

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.

Casimiro Notevi 23-11-2012 11:37:19

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


La franja horaria es GMT +2. Ahora son las 20:50:28.

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