PDA

Ver la Versión Completa : Color de fuente en celda


Besto
05-09-2008, 08:12:19
Hola,

tengo un problema para cambiar el color de una celda en un dbgrid.
De primeras me va bien, pero cuando cambio de un color a otro me lo cambia con un registro de retraso, es decir, el primer registro del otro color me lo pone con el color anterior.

Os pongo el código que uso:

procedure Tformulario1.BaseEquiDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
with Sender as TDBGrid do
begin
if (datacol=4) then
begin
case frDatos.tbEqu.FieldByName('Estado').AsInteger of
1: begin
columns[4].Font.Color := $009900;
end;
3: begin
columns[4].Font.Color := $FF0000;
columns[4].Font.Style := [fsBold];
end;
25: begin
columns[4].Font.Color := $FF9900;
columns[4].Font.Style := [fsBold];
end;
26: begin
columns[4].Font.Color := $FF00CC;
columns[4].Font.Style := [fsItalic];
end;
end;
end;
end;
BaseEqui.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;


No sé que puede estar mal, he estado mirando por los foros y en principio parece que es así, no he encontrado nada.

coso
05-09-2008, 09:08:39
prueba, en vez de
frDatos.tbEqu.FieldByName('Estado').AsInteger

de hacer

(sender as TDBGrid).DataSource.DataSet.FieldByName('....

Si no funciona, buscaria por el foro '.ActiveRecord' (o '.currentrecord', uno de dos), que es el registro realmente activo en el momento de pintar.

tcp_ip_es
05-09-2008, 09:16:53
métele esto....

procedure Tformulario1.BaseEquiDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if frDatos.tbEqu.recordcount >0 then
begin
if state <> [gdfocused] then
begin
with Sender as TDBGrid do
begin
if (datacol=4) then
begin
case frDatos.tbEqu.FieldByName('Estado').AsInteger of
1: begin
columns[4].Font.Color := $009900;
end;
3: begin
columns[4].Font.Color := $FF0000;
columns[4].Font.Style := [fsBold];
end;
25: begin
columns[4].Font.Color := $FF9900;
columns[4].Font.Style := [fsBold];
end;
26: begin
columns[4].Font.Color := $FF00CC;
columns[4].Font.Style := [fsItalic];
end;
end;
end;
end;
end;
BaseEqui.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;

P.D. Lo que va en negrita es lo nuevo, creo que te falla por no controlar el estado ya nos contarás...

Besto
05-09-2008, 11:32:35
He probado con las dos ideas y me pasa lo mismo, no se corrige. No puedo mandar la imagen porque no se pero es algo así:

EN RESERVA
ACTIVO
ACTIVO
EN RESERVA
EN RESERVA

El primer Activo tenia que ir tambien en el otro color y no sale-

tcp_ip_es
05-09-2008, 11:41:10
uhmmmm prueba a sustituir los ...

columns[4].Font.Color := $009900;


por....

DBGrid.canvas.Font.Color:=$009900;

coso
05-09-2008, 12:38:03
en vez de columns[4].color, usa DBGrid.Canvas.Font.Color

coso
05-09-2008, 12:38:33
lo de tcp_ip, q escribi directo desde el email

Caro
05-09-2008, 13:22:04
Holas, no solo el ....font.color debe cambiar, todo donde tiene columns[4] debe cambiarlo por BaseEqui.Canvas, no debería importar si es el registro actual, ya que cuando se da este evento hace un recorrido por todo el dbGrid para realizar el pintado. Ahora si se quiere pintar de otro color el que esta selecionado entonces habra que preguntar si el state esta como gdSelected.

Saluditos

tcp_ip_es
08-09-2008, 07:23:48
y bien....??? Besto ¿qué pasó al final? ¿lo solucionaste con las Gambas?? uppps perdón con los Canvas.... :D


P.D. Lo sé es un chiste muuuu malo pero que queréis son las 8:30 de la mañana :cool:

Besto
11-09-2008, 07:20:17
Perdonar el retraso pero he estado un par de días desconectado de Delphi.

Muchas gracias, funciona perfecto como me dijisteis, cambiando por dbgrid.canvas el columns[4]

Sois unos fenomenos.