Colorir uma celula no cxgrid

Delphi

19/08/2013

Boa tarde a todos,
Eu tenho um código para colorir uma celula do dbgrid em uma determinada situação:
//Alterando a Cor da Coluna CodEmp.
with dbgrid20 do
begin
if (column.field.fieldname) = 'codemp' then
begin
if ftd001datcan.value > 0 then
Canvas.Brush.Color := clred
else if ftd001temmdf.value = 1 then
Canvas.Brush.Color := clYellow
else
Canvas.Brush.Color := clbtnface;
Canvas.Font.Color := clwindowtext;
Canvas.FillRect(Rect);
end;
end;

Preciso que esse mesmo código funcione no cxgrid. O que consegui até agora é colorir de amarelo a coluna codemp inteira e nao é isso que dever fazer
Código que criei:

//Alterando a Cor da Coluna CodEmp.
if (AViewInfo.Item.Index = cxGrid5DBTableView1Column1.Index)then
begin
if ftd001datcan.value > 0 then
ACanvas.Brush.Color := clred
else if ftd001temmdf.value = 1 then
ACanvas.Brush.Color := clYellow
else
ACanvas.Brush.Color := clbtnface;
ACanvas.Font.Color := clwindowtext;
ACanvas.FillRect(AViewInfo.Bounds);
end;

Achei diversos ativo no google mas nenhum me ajuda, alguem que conhece pode me ajudar?
obrigado
"Deus Abençoe"
Wilton Júnior

Wilton Júnior

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

19/08/2013

Você deve selecionar a coluna na qual quer aplicar essa formatação e acessar o evento OnCustomDrawCell (DA COLUNA, não do grid todo).
Aí lá você pode verificar o conteúdo da célula usando o objeto AViewInfo e mexer na formatação usando o objeto ACanvas. Por exemplo:
procedure TFrmRelatorioPontoPedido.gridRelatorioDBTableView1STATUSCustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if AViewInfo.Text = 'Inataivo' then
  begin
    ACanvas.Font.Color := clRed;
  end;
end;


Aí eu verifiquei na coluna STATUS se alguma célula tem o texto "Inativo", Se tiver, pinto a fonte de vermelho.

É só adaptar.

Abraço.
GOSTEI 0
Wilton Júnior

Wilton Júnior

19/08/2013

Joel eu vi um exemplo desse em no google fiz e mesmo assim pintou toda a minha coluna.
para cada condição ela tem que ficar de uma cor.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

19/08/2013

Aqui deu certo, pintou só as células que atendem à condição. Confira se você está tratando o evento da coluna mesmo.
GOSTEI 0
Wilton Júnior

Wilton Júnior

19/08/2013

Eu não sei o que fazer mais não...fui no obtao custome cliquei na column1 que é o codemp fui na propridade customdrawcell e ele pinta toda a coluna

procedure TCR001.cxGrid5DBTableView1Column1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
//Alterando a Cor da Coluna CodEmp.
if (AViewInfo.Item.Index = cxGrid5DBTableView1Column1.Index)then
begin
if ftd001datcan.value > 0 then
ACanvas.Brush.Color := clred
else if ftd001temmdf.value = 1 then
ACanvas.Brush.Color := clYellow
else
ACanvas.Brush.Color := clbtnface;
ACanvas.Font.Color := clwindowtext;
ACanvas.FillRect(AViewInfo.Bounds);
end;
end;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

19/08/2013

Está pitando a coluna toda com que cor?
GOSTEI 0
Wilton Júnior

Wilton Júnior

19/08/2013

Sim, no teste que eu faço com dbgrid fica certo mas quando uso o cxgrid da esse problema, vc que conhece muito mais que eu nao tem como vc fazer um teste com um modelo de pintanto a linha conforme o valor tomado de outros campos?
GOSTEI 0
Deivison Melo

Deivison Melo

19/08/2013

O comportamento do CxGrid é diferente do DBGrid por isso que seu código está certo em um e no outro o comportamento é diferente!

Veja se isso aqui ajudará desenvolver o que está desejando:

http://www.activedelphi.com.br/forum/viewtopic.php?t=72347&sid=9476dfb99be9e6957fe00a4f416fe5e7

Abração e bons Códigos!

GOSTEI 0
Wilton Júnior

Wilton Júnior

19/08/2013

Deivison, obrigado pela dica, mas tb já via esse post o problema é que o temmdf " if ftd001temmdf.value = 1" não aparece da cxgrid .


obrigado
GOSTEI 0
Wilton Júnior

Wilton Júnior

19/08/2013

Deivison, obrigado pela dica, mas tb já via esse post o problema é que o temmdf " if ftd001temmdf.value = 1" não aparece da cxgrid .


obrigado
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

19/08/2013

Cara, para cada linha no cxGrid existe uma linha em outra tabela, é isso? Por que da forma que você está fazendo, você está comparando sempre com o mesmo registro em ftd001datcan, Por isso está colorindo toda a coluna, pois a verificação sempre cai na mesma condição.
GOSTEI 0
Wilton Júnior

Wilton Júnior

19/08/2013

Joel não sei mais nada, agora parece que deu certo.
Tem momentos que clico na coluna e fica amarelo.
Testei com aqueles que estao com datcan >0 e funcionou ficou em vermelho.
GOSTEI 0
Wilton Júnior

Wilton Júnior

19/08/2013

Os que deveriam aparecer em amarelo nao aparece mas o que tem que aparecer em vermelho sim
GOSTEI 0
Wilton Júnior

Wilton Júnior

19/08/2013

Consegui fzer dar certo no final tiver que incluir a coluna do temmdf e deixa invisivel na hora de comprar ela no envento customdrawcell eu fiz assim:

if (AViewInfo.Item.Index = cxGrid5DBTableView1Column1.Index)then
begin
if (AViewInfo.GridRecord.Values[cxGrid5DBTableView1Column19.Index] > 0) then //ftd001datcan.value > 0
ACanvas.Brush.Color := clred
else if (AViewInfo.GridRecord.Values[cxGrid5DBTableView1Column20.Index] = 1) then //ftd001temmdf.value = 1
ACanvas.Brush.Color := clYellow
else
ACanvas.Brush.Color := clbtnface;
ACanvas.Font.Color := clwindowtext;
ACanvas.FillRect(AViewInfo.Bounds);
end;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

19/08/2013

Ah, saquei a solução. Bom, pelo menos deu certo, é o que importa (ao menos inicialmente).
Neste caso, estou concluindo o tópico.
Abraço a todos.
GOSTEI 0
POSTAR