Linha com cor dirente no DBGRID
Tenho um código que indentifica quantos dias de atraso uma determinada nota tem..
sendo que o campo ´ BD_CONT_RECGS_COR_DATRASO ´ é um campo tempórário só exite quando o form é ativado somente para receber os valores referentes aos atrasos...
a pergunta... exite uma forma de colorir em amarelo os atrasados até 30 dias e os que tiverem um valor acima de 30 dias ficer em vermelho ?
Valew...t+
var a:real; begin a:= date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime; if a > 0 then BD_CONT_RECGS_COR_DATRASO.Value := date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime; end;
sendo que o campo ´ BD_CONT_RECGS_COR_DATRASO ´ é um campo tempórário só exite quando o form é ativado somente para receber os valores referentes aos atrasos...
a pergunta... exite uma forma de colorir em amarelo os atrasados até 30 dias e os que tiverem um valor acima de 30 dias ficer em vermelho ?
Valew...t+
Gigatel
Curtidas 0
Respostas
Massuda
16/08/2005
O código para isso é algo assim...
procedure TSeuForm.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Grid: TDBGrid; Atraso: Integer; begin Grid := Sender as TDBGrid; // ajusta as cores Atraso := ...calcule o total de dias em atraso...; if Atraso > 0 then begin if Atraso <= 30 then begin Grid.Canvas.Font.Color :=clBlack; Grid.Canvas.Brush.Color :=clYellow; end else begin Grid.Canvas.Font.Color :=clYellow; Grid.Canvas.Brush.Color :=clRed; end; end; // usa a rotina padrão de desenho Grid.DefaultDrawDataCell(rect,Column.Field,State); end;
GOSTEI 0
Gigatel
16/08/2005
O código para isso é algo assim...
procedure TSeuForm.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Grid: TDBGrid; Atraso: Integer; begin Grid := Sender as TDBGrid; // ajusta as cores Atraso := ...calcule o total de dias em atraso...; if Atraso > 0 then begin if Atraso <= 30 then begin Grid.Canvas.Font.Color :=clBlack; Grid.Canvas.Brush.Color :=clYellow; end else begin Grid.Canvas.Font.Color :=clYellow; Grid.Canvas.Brush.Color :=clRed; end; end; // usa a rotina padrão de desenho Grid.DefaultDrawDataCell(rect,Column.Field,State); end;
o que entraria aki ?
// ajusta as cores Atraso := ...calcule o total de dias em atraso...;
GOSTEI 0
Massuda
16/08/2005
o que entraria aki ?
Sua rotina que calcula o total de dias em atraso. Imagino que BD_CONT_RECGS_COR_DATA_VENC seja a data de vencimento no dataset (TTable, TQuery, etc) ligado ao DBGrid através do datasource.GOSTEI 0
Gigatel
16/08/2005
[quote:ab32b45693=´Gigatel´]o que entraria aki ?
Sua rotina que calcula o total de dias em atraso. Imagino que BD_CONT_RECGS_COR_DATA_VENC seja a data de vencimento no dataset (TTable, TQuery, etc) ligado ao DBGrid através do datasource.[/quote:ab32b45693]procedure T_FormCRReceb.BD_CONT_RECCalcFields(DataSet: TDataSet); var a:real; begin a:= date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime; if a > 0 then BD_CONT_RECGS_COR_DATRASO.Value := date - BD_CONT_RECGS_COR_DATA_VENC.AsDateTime; end;
Tá dando erro...este campo
.....BD_CONT_RECGS_COR_DATA_VENC.... e do tipo Varchar e aí fiz o seguinte..
var Grid: TDBGrid; Atraso: Integer; begin Grid := Sender as TDBGrid; // ajusta as cores Atraso := StrToInt(BD_CONT_RECGS_COR_DATA_VENC.value); if Atraso > 0 then begin if Atraso <= 30 then begin Grid.Canvas.Font.Color :=clBlack; Grid.Canvas.Brush.Color :=clYellow; end else begin Grid.Canvas.Font.Color :=clYellow; Grid.Canvas.Brush.Color :=clRed; end; end;
más dá o seguinte erro....
ECOVERTE ERROR ...21/08/2005 não é um valor inteiro válido...será que tem algo a ver com conversão......
GOSTEI 0
Massuda
16/08/2005
Tá dando erro...
Bom... você não tinha avisado que tinha um campo calculado com o total de dias em atraso e eu não tinha reparado isso.Como você tem esse campo com os dias em atraso, o código fica mais simples...
procedure T_FormCRReceb.BD_CONT_RECCalcFields(DataSet: TDataSet); var Atraso: Double; begin Atraso:= Date - BD_CONT_RECGS_COR_DATA_VENC.AsDate; if Atraso > 0 then BD_CONT_RECGS_COR_DATRASO.AsDouble := Atraso; else BD_CONT_RECGS_COR_DATRASO.AsDouble := 0; end; ... var Grid: TDBGrid; Atraso: Integer; begin Grid := Sender as TDBGrid; // ajusta as cores Atraso := BD_CONT_RECGS_COR_DATA_VENC.AsInteger; if Atraso > 0 then begin if Atraso <= 30 then begin Grid.Canvas.Font.Color :=clBlack; Grid.Canvas.Brush.Color :=clYellow; end else begin Grid.Canvas.Font.Color :=clYellow; Grid.Canvas.Brush.Color :=clRed; end; end; ...
GOSTEI 0
Gigatel
16/08/2005
[quote:a991ef2e25=´Gigatel´]Tá dando erro...
Bom... você não tinha avisado que tinha um campo calculado com o total de dias em atraso e eu não tinha reparado isso.Como você tem esse campo com os dias em atraso, o código fica mais simples...
procedure T_FormCRReceb.BD_CONT_RECCalcFields(DataSet: TDataSet); var Atraso: Double; begin Atraso:= Date - BD_CONT_RECGS_COR_DATA_VENC.AsDate; if Atraso > 0 then BD_CONT_RECGS_COR_DATRASO.AsDouble := Atraso; else BD_CONT_RECGS_COR_DATRASO.AsDouble := 0; end; ... var Grid: TDBGrid; Atraso: Integer; begin Grid := Sender as TDBGrid; // ajusta as cores Atraso := BD_CONT_RECGS_COR_DATA_VENC.AsInteger; if Atraso > 0 then begin if Atraso <= 30 then begin Grid.Canvas.Font.Color :=clBlack; Grid.Canvas.Brush.Color :=clYellow; end else begin Grid.Canvas.Font.Color :=clYellow; Grid.Canvas.Brush.Color :=clRed; end; end; ...
quando copila..
[Error] Unit18.pas(868): Undeclared identifier: ´AsDate´
......
[Error] Unit18.pas(870): Undeclared identifier: ´AsDouble´..
será que tenho que declarar alguma coisa ?
GOSTEI 0
Massuda
16/08/2005
quando copila..
[Error] Unit18.pas(868): Undeclared identifier: ´AsDate´
[Error] Unit18.pas(870): Undeclared identifier: ´AsDouble´
Desculpe... engano meu. Troque o AsDate por AsDateTime e o AsDouble por AsFloat.GOSTEI 0
Gigatel
16/08/2005
[quote:774bc9c86d=´Gigatel´]quando copila..
[Error] Unit18.pas(868): Undeclared identifier: ´AsDate´
[Error] Unit18.pas(870): Undeclared identifier: ´AsDouble´
Desculpe... engano meu. Troque o AsDate por AsDateTime e o AsDouble por AsFloat.[/quote:774bc9c86d]Agora funcionol...
más Dá erro ... 28/08/2005 não é um valor inteiro....os campos que tenho..o calculado é INTEGER....O que recebe a data é VCHAR....
BD_CONT_RECGS_COR_DATA_VENC é um campo VChar
BD_CONT_RECGS_COR_DATRASO é um campo Integer..
Tá brabo,....
GOSTEI 0
Gigatel
16/08/2005
Deu certo só que tive que mudar o código..
Deu Certo é ficou muito bom o efeito...Vlw..Muito Obrigado..
procedure T_FormCRReceb.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if BD_CONT_REC.FieldByName (´GS_COR_DATRASO´).Value > 0 then begin if BD_CONT_REC.FieldByName (´GS_COR_DATRASO´).Value <= 30 then begin DbGrid1.Canvas.Font.Color :=clBlack; DbGrid1.Canvas.Brush.Color :=clYellow; end else begin DbGrid1.Canvas.Font.Color :=clYellow; DbGrid1.Canvas.Brush.Color :=clRed; end; // DbGrid1.Canvas.Font.Color := clRed; //DbGrid1.Canvas.Font.Style := [fsBold]; end; dbGrid1.DefaultDrawDataCell(rect,Column.Field,State); end; end.
Deu Certo é ficou muito bom o efeito...Vlw..Muito Obrigado..
GOSTEI 0