Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cambiar el color en una celda de un DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=53466)

RoyTan 21-02-2008 11:53:16

Cambiar el color en una celda de un DBGrid
 
Saludos.

Bueno haber si me aclaro y alguien me aclara.

Necesito cambiar de color una celda de un DBGrid que cumpla una condición, como por ejemplo toda aquella del campo SALDO que contenga un número menor que 0.

Estoy dándole vueltas a este código, pero no se que falla.

if Column.Field.Dataset.FieldbyName('SALDO').AsFloat < 0
then
if (gdFocused in State)
then DBGCaja.Columns[4].color := clRed
else
DBGCaja.canvas.brush.color := clRed;
DBGCaja.DefaultDrawColumnCell(rect,DataCol,Column,State);

El resultado de este código es que pinta de color rojo toda la linea completa o sea todos los campos ( fecha,concepto,ingreso,gasto,saldo)

Y solo necesito que lo haga en el campo saldo.

Espero haberme explicado.

Gracias

Gabo 21-02-2008 12:12:56

Usa el evento OnDrawCell. Allí pon los condicionantes que quieras y usa la propiedad Canvas del DBGrid.

rafita 21-02-2008 13:03:18

Cita:

Empezado por RoyTan (Mensaje 267484)

if Column.Field.Dataset.FieldbyName('SALDO').AsFloat < 0
then
if (gdFocused in State)
then DBGCaja.Columns[4].color := clRed
else
DBGCaja.canvas.brush.color := clRed;
DBGCaja.DefaultDrawColumnCell(rect,DataCol,Column,State);

En el ELSE deberías poner otro color ¿no?

RoyTan 21-02-2008 15:34:33

Nada de nada.

Sigue sin funcionar.:confused:

RoyTan 22-02-2008 10:25:39

He probado de todas formas y nada.

Bueno pues se quedará sin el colorcito.

Gracias.:mad::confused:

gluglu 22-02-2008 10:55:59

Este tema ya ha sido tratado en múltiples ocasiones en los foros.

Seguro que utilizando la búsqueda encontrarías muchas referencias. No obstante, para que veas que en Delphi 'siempre' se puede, te invito a utilizar el siguiente código :

Código Delphi [-]
procedure TForm.DBGrid1DrawColumnCell(Sender: TObject;
  Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 
  If (Column.Index = 5) and (Column.Field.Dataset.FieldbyName('SALDO').AsFloat < 0) and (not DataSet.IsEmpty) then begin
    if gdFocused in State then begin
      DBGrid1.Canvas.Brush.Color := clBlue    // Color que quieras que tenga el fondo si la línea tiene foco
      DBGrid1.Canvas.Font.Color  := clWhite   // Color del Font que quieras que tenga si la línea tiene foco
    end
    else begin
      DBGrid1.Canvas.Brush.Color := clRed;    // Color que quieras que tenga si la línea NO tiene foco
      DBGrid1.Canvas.Font.Color  := clWhite   // Color del Font que quieras que tenga si la línea NO tiene foco
    end;
  end;
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
 
end;

Siendo Column.Index = al número de columna que quieras colorear. También podrías hacer referencia a dicha columna por el campo que se encuentra en ella.

DataSet es el DataSet asociado a tu DBGrid.

... y nunca desesperes si algo no te funciona ;)

RoyTan 22-02-2008 14:51:18

Siempre pienso en positivo,
raramente desespero,
he buscado en el foro,
eso sí, seguramente no he buscado bien.

Pero esto sigue sin funcionar, probablemente este haciendo algo mal, eso es seguro.

Seguimos intentandolo.

Gracias.

gluglu 22-02-2008 15:56:41

Si pones tu código aquí, a lo mejor será más fácil ayudarte. :rolleyes:

Supongo que bastaría con que pusieras el evento OnDrawColumnCell del DBGrid.

RoyTan 23-02-2008 00:34:19

Hola gluglu.

Gracias por soportar mi ignorancia y mi pesadez.

Si el código lo he puesto en el evento ondrawcolumncell.

El código que me has pasado pinta la linea completa, pero eso no es lo que necesito.

Yo necesito que pinte una celda nada más, no la linea completa.
Ejemplo:

Mi DBGrid tiene 5 columnas, Fecha,Concepto,Ingresos,Gastos y Saldo.

Tan solo necesito que si en la columna saldo hubiese algun valor negativo pues sencillamente que pinte esa celda de rojo, solo donde está el valor negativo.

Bueno y el código con el que lo estoy intentando es el siguiente.

procedure TF_Caja.DBGCajaDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin

if Column.Field.Dataset.FieldbyName('SALDO').AsFloat < 0 then
if (gdFocused in State) then
Begin
DBGCaja.canvas.brush.color := clBlue;
end
else
Begin
DBGCaja.Columns[5].Font.Color := clRed; // este para el Texto
DBGCaja.DefaultDrawColumnCell(rect,DataCol,Column,State);
end;

End;

Espero y deseo no molestar mucho.:o

Gracias.

jandok238 23-02-2008 01:13:21

no soy un experto... :D:D

solo tome el codigo de GLUGLU y lo adapte al tuyo...

Código Delphi [-]
 
 if (Column.Index = 2) and (Column.Field.Dataset.FieldbyName('PRECIO').AsFloat < 0) then  //cambie esta linea (bueno la adapte)
     if (gdFocused in State) then    
     Begin      
         DBGrid1.canvas.brush.color := clBlue;    
     end    
     else    
     Begin      
         DBGrid1.Canvas.Font.Color := clRed; //Cambie esta linea
         DBGrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);
     end;



espero te funcione..... por que a mi si ;):D:D

Gracias por el codigo GLUGLU....

salu2!!!!!!!!

RoyTan 23-02-2008 01:58:11

Vendito sea Dios todopoderoso, salió.

Gracias Jandock238 y gracias gluglu.

Creo y casi seguro, que soy el hombre mas torpe del mundo.
Lo mio no tiene remedio vamos.

Gracias a todos.:):):)

RoyTan 23-02-2008 02:03:23

Hasta para escribir soy torpe, bendito se escribe con B no con V.

Lo siento.

jandok238 23-02-2008 02:19:35

Cita:

Empezado por RoyTan (Mensaje 268048)
Hasta para escribir soy torpe, bendito se escribe con B no con V.

Lo siento.

y hasta para copiar... :D:D:D (es broma) ....
mi Nick no lleva 'C' es Jandok238 sin 'C' ...:D:D:D

salu2!!!!!!!!!

RoyTan 24-02-2008 00:20:39

Po zi. Je Je Je:D:D:D

Gracias Jandok238

Saludos.

dmassive 13-02-2009 16:18:36

Tengo una duda:

¿Para que sirve verificar si tiene foco?
Código Delphi [-]
 if (Column.Index = 2) and (Column.Field.Dataset.FieldbyName('PRECIO').AsFloat < 0) then  
     if (gdFocused in State) then    
     Begin      
         DBGrid1.canvas.brush.color := clBlue;    
     end    
     else    
     Begin      
         DBGrid1.Canvas.Font.Color := clRed;
         DBGrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);
     end;

pues si lo hago de esta manera funciona igual:

Código Delphi [-]
 if (Column.Index = 2) and (Column.Field.Dataset.FieldbyName('PRECIO').AsFloat < 0) then
     Begin      
         DBGrid1.Canvas.Font.Color := clRed;
         DBGrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);
     end;

jandok238 13-02-2009 16:44:20

Esa comparacion es solo para cambiar el COLOR si la fila tiene el foco ....

si la fila tiene el foco, en lugar de pintarla ROJA, la pinta AZUL ....;);)

salu2!!!!!!!

dmassive 14-02-2009 07:09:13

ah, pues, es que mi duda surgio porque jamas aparecio el color azul en todo el DBGrid... es por eso que no saco a qué foco se refiere, el codigo se ve logico, pero, en el DBGrid no aparece ningun azul por ningun lado... :)

jandok238 14-02-2009 17:06:48

Cita:

Empezado por dmassive (Mensaje 338122)
ah, pues, es que mi duda surgio porque jamas aparecio el color azul en todo el DBGrid... es por eso que no saco a qué foco se refiere, el codigo se ve logico, pero, en el DBGrid no aparece ningun azul por ningun lado... :)


perdon... tienes razon ... no habia checado bien el codigo ....

ahi va... ahora si... bien revisado ... :o:o

Código Delphi [-]
if (gdFocused in State) then
     Begin
         DBGrid1.canvas.Font.color := clBlue; //Corregir la linea, cambiar bursh  por  font
         DBGrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);  //Faltaba esta linea
     end
     else
     Begin
         DBGrid1.Canvas.Font.Color := clRed;
         DBGrid1.DefaultDrawColumnCell(rect,DataCol,Column,State);
     end;


ahora si, si la celda tiene el foco, las letras toman el color especificado... :D

salu2!!!!!!!


La franja horaria es GMT +2. Ahora son las 00:58:29.

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