Fórum Mudar a cor da fonte de uma linha no DBgrid #597079
12/09/2018
0
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
Curtir tópico
+ 0Post mais votado
13/09/2018
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
Gostei + 1
Mais Posts
13/09/2018
Natanael Ferreira
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;
Gostei + 0
13/09/2018
Jean Carlos
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.
Gostei + 0
13/09/2018
Jean Carlos
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.
Gostei + 0
13/09/2018
Natanael Ferreira
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;Gostei + 0
13/09/2018
Jean Carlos
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
Gostei + 0
13/09/2018
Jean Carlos
Gostei + 0
13/09/2018
Jean Carlos
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.
Gostei + 0
13/09/2018
Natanael Ferreira
Remova a linha abaixo do seu código para testes:
tblprodutos.Edit;
Gostei + 0
13/09/2018
Jean Carlos
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
Gostei + 0
13/09/2018
Jean Carlos
//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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)