Fórum Mudar a cor da fonte de uma linha no DBgrid #597079

12/09/2018

0

Boa tarde a todos(as).
Sou Iniciante no delphi, estou montando um sistema de cadastro de produtos e emissão de nfe usando o ACBR.
Cheguei em uma barreira estou a 3 dias tentando passa la , tenho duas tabelas tabela 01, e tabela 02,
Quando cadastro uma nota fiscal de entrada, primeiro o produto entra na tabela 01 depois passa para a tabela 02, fiz o código abaixo para determinar o seguinte:

TFrmXmlNfe.DBGridProdutosDrawColumnCell
begin
ean := SqlProdutoscodbarras.AsString;

If TBLPRODUTOSTEMPcodbarras.AsString = ean then
DBGridProdutos.Canvas.Font.Color:= clFuchsia;
DBGridProdutos.DefaultDrawDataCell(Rect, DBGridProdutos.columns[datacol].field, State);

end;

Faço uma pesquisa na tabela 02 se existe um produto com o mesmo código de barras do produto que estou cadastrando.
Criei uma varial chamada EAN pra pegar o registro do sql
E coloquei o código no OnDrawColumnCell do Dbgrid.

O código estar funcionando, mais, ele estar pegando apenas o ultimo registro da tabela, por ex se na tabela 01 existe 3 produtos iguais aos da tabela 02 ele registra apenas o ultimo item, isso se o ultimo item for igual ao da tabela 02.
Por ex: se na tabela 01 tem 5 itens e o item de num 4 for igual ao da tabela 02 ele não registra.

Resumindo estou querendo que quando eu cadastrar um produto, se este produto já existe que ele fique de outra cor.
Algum dos colegas poderiam me ajudar ?

Desde já agradeço
Jean Carlos

Jean Carlos

Responder

Post mais votado

13/09/2018

Fala Jean!

Aparentemente está tudo certo com a intenção de seu código. Analisando-o de longe, estão faltando alguns detalhes, como o envolvimento do bloco com begin/end, comando para atualização da visualização do Grid (FillRect) e adicionalmente coloquei também a manipulação do Brush para destacar. Tente usar o código abaixo:

if TBLPRODUTOSTEMPcodbarras.AsString = ean then
begin
DBGridProdutos.Canvas.Font.Color:= clFuchsia;

DBGridProdutos.Canvas.Brush.Color := clRed;
DBGridProdutos.Canvas.FillRect(Rect);

DBGridProdutos.DefaultDrawDataCell(Rect, DBGridProdutos.columns[datacol].field, State);
end;


Espero que te ajude. Qualquer coisa volte a postar um feedback por aqui.

Forte abraço!

Fabricio Kawata

Fabricio Kawata
Responder

Gostei + 1

Mais Posts

13/09/2018

Natanael Ferreira

Da maneira que está o seu código, a comparação está sendo feita apenas com o registro corrente da outra tabela e não com toda tabela.
Faça um teste com o código abaixo, utilizando o método Locate:
begin
  if SQLProdutos.Locate('codbarras', TBLPRODUTOSTEMPcodbarras.AsString, [loCaseInsensitive, loPartialKey]) then
    DBGridProdutos.Canvas.Font.Color := clFuchsia
  else
    DBGridProdutos.Canvas.Font.Color := clWindowText;

  DBGridProdutos.DefaultDrawDataCell(Rect, DBGridProdutos.columns[datacol].field, State);
end;
Responder

Gostei + 0

13/09/2018

Jean Carlos

Muito obrigado Frabicio

O seu codigo continua com a mesma funçao do meu ele destaca apenas o ultimo registro da tabela.
Tipo se na tabela 01 tem 4 registros e 3 desses registro ja tem na tabela 02, o codigo so estar encontranto um registro.
Responder

Gostei + 0

13/09/2018

Jean Carlos

Muito obrigado Natanael

O seu codigo continua com a mesma funçao do meu ele destaca apenas o ultimo registro da tabela.
Tipo se na tabela 01 tem 4 registros e 3 desses registro ja tem na tabela 02, o codigo so estar encontranto um registro.
Responder

Gostei + 0

13/09/2018

Natanael Ferreira

Faça um novo teste com o código abaixo, usando o Locate na TBLPRODUTOSTEMP.

begin 
  if TBLPRODUTOSTEMP.Locate('codbarras', SqlProdutoscodbarras.AsString, []) then 
    DBGridProdutos.Canvas.Font.Color:= clFuchsia 
  else 
    DBGridProdutos.Canvas.Font.Color:= clWindowText; 
  DBGridProdutos.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
end;
Responder

Gostei + 0

13/09/2018

Jean Carlos

Obrigado novamente Natanael.

Agora ele fez o seguinte
Se na tabela de entrada que e a produtostemp tiver 3 itens, ele encontra o ultimo item e joga o mesmo 3 vezes na tela veja a imagem abaixo

https://static.wixstatic.com/media/663946_40517295e61e4e629321ab6c7d0afc0f~mv2.png/v1/fill/w_600,h_105,al_c,q_80,usm_0.66_1.00_0.01/663946_40517295e61e4e629321ab6c7d0afc0f~mv2.webp

Responder

Gostei + 0

13/09/2018

Jean Carlos

Os componentes que uso sao da palheta firedac TFDtable
Responder

Gostei + 0

13/09/2018

Jean Carlos

Amigos.
Consegui resolver mudando o componente sql TFdquary, por um TFDtable

o codigo ficou o seguinte:

tblprodutos.Active := true;
tblprodutos.Edit;


if tblprodutos.Locate('codbarras', TBLPRODUTOSTEMPcodbarras.AsString, []) then
DBGridProdutos.Canvas.Font.Color:= clFuchsia
else
DBGridProdutos.Canvas.Font.Color:= clWindowText;
DBGridProdutos.DefaultDrawColumnCell(Rect, DataCol, Column, State);


Funcionou bacana porem nao estou conseguindo selecionar o item desejado quando clico no dbgrid nao consigo selecionar a linha.
Responder

Gostei + 0

13/09/2018

Natanael Ferreira

Você não está conseguindo selecionar a linha inteira? Está selecionando somente uma célula?

Remova a linha abaixo do seu código para testes:

tblprodutos.Edit;
Responder

Gostei + 0

13/09/2018

Jean Carlos

Natanael fiz de acordo com o que vc pediu mais continuo sem conseguir selecionar a linha inteira nem linha inteira nem uma celula.
Tipo assim eu kero clicar na linha e ver ela destacada p eu saber qual linha estar selecionada.

Sem o codigo eu consigo clicar na linha
Responder

Gostei + 0

13/09/2018

Jean Carlos

Amigos conseguir resolver o meu problema da seguinte maneira :

//Destacar os produtos iguais entre as duas tabelas
if tblprodutos.Locate('codbarras', TBLPRODUTOSTEMPcodbarras.AsString, []) then
begin
DBGridProdutos.Canvas.Font.Color:= clFuchsia;

end
else
begin
DBGridProdutos.Canvas.Font.Color:= clWindowText;
DBGridProdutos.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

//destacar a linha selecionada
if gdSelected in State then
with (Sender as TDBGridEh).Canvas do
begin
Brush.Color:=clSkyBlue; //aqui é definida a cor do fundo
FillRect(Rect);
end;

TDbGridEh(Sender).DefaultDrawDataCell(Rect, TDbGridEh(Sender).columns[datacol].field, State);

Tudo no OnDrawColumnCell do DBGrid em questao.

Tudo funcionando certinho

Desde ja agradeço a ajuda de todos.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar