Colorir dbgrid
Uso Delphi 6
Preciso colorir ´uma´ célula do dbgrid ou do rxdbgrid para a indicação do menor preço de um produto, consigo reconhecer em qual célula ele se localiza, mas nao consigo colorir a mesma.
fiz uma rotina que colore só que ele faz em toda a coluna, fazendo com que os anteriores mostrem errado.
Alguém sabe como pintar uma célula em questão para cada registro indicado no dbgrid.
Agradeço antecipadamente qualquer ajuda.
Preciso colorir ´uma´ célula do dbgrid ou do rxdbgrid para a indicação do menor preço de um produto, consigo reconhecer em qual célula ele se localiza, mas nao consigo colorir a mesma.
fiz uma rotina que colore só que ele faz em toda a coluna, fazendo com que os anteriores mostrem errado.
Alguém sabe como pintar uma célula em questão para cada registro indicado no dbgrid.
Agradeço antecipadamente qualquer ajuda.
Salupe
Curtidas 0
Respostas
Motta
18/02/2005
Pergunta frequente, veja no Pesquisar
GOSTEI 0
Salupe
18/02/2005
pesquisei só que o comando que encontrei meche com toda a coluna portanto fica em vermelho a coluna do ultimo preço.
Só que eu preciso informar na linha qual é o produto que tem o menor valor, e no caso ele mostra em vermelho o menor preço da ultima linha e os das linhas anteriores ficam em vermelho o da mesma coluna do ultimo.
ex:
produto preco1 preco2 preco3 preco 4
A 10 8 11 12
b 15 10 20 5
c 10 20 30 15
neste exemplo a coluna do preco1 fica em vermelho prod 3 produtos e na verdade eu preciso que
no produto A fique em vermelho o preco2,
no produto b fique o preco4
e no produto c o preco1.
alguem saberia me dizer como conseguir isso.
Agradeço antecipadamente qualquer ajuda
Só que eu preciso informar na linha qual é o produto que tem o menor valor, e no caso ele mostra em vermelho o menor preço da ultima linha e os das linhas anteriores ficam em vermelho o da mesma coluna do ultimo.
ex:
produto preco1 preco2 preco3 preco 4
A 10 8 11 12
b 15 10 20 5
c 10 20 30 15
neste exemplo a coluna do preco1 fica em vermelho prod 3 produtos e na verdade eu preciso que
no produto A fique em vermelho o preco2,
no produto b fique o preco4
e no produto c o preco1.
alguem saberia me dizer como conseguir isso.
Agradeço antecipadamente qualquer ajuda
GOSTEI 0
Massuda
18/02/2005
No evento OnDrawColumnCell do seu dbgrid, faça algo assim:Para saber qual coluna está sendo pintada, use o parâmetro DataCol (índice da coluna no grid) ou Column.Field (nome do campo associado à coluna).
Para ter acesso aos outros campos do registro atual, use Grid.Fields[].
Você já sabe de antemão qual é o menor preço ou isso precisaria ser determinado quando a célula é pintada?
procedure TSeuForm.SeuGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Grid: TDBGrid; begin Grid := Sender as TDBGrid; if ...a coluna é a do menor preço... then begin // escreve em vermelho Grid.Canvas.Font.Color := clRed; end; Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State); end;
Para ter acesso aos outros campos do registro atual, use Grid.Fields[].
Você já sabe de antemão qual é o menor preço ou isso precisaria ser determinado quando a célula é pintada?
GOSTEI 0
Salupe
18/02/2005
só que isso vai fazer a mesma coisa e pintar toda a coluna e não somente a célula que eu to querendo.
a célula vai ser conhecida no momento da criação, por uma comparação dos preços.
como faço para isso acontecer.
Agradeço antecipadamente qualquer ajuda.
a célula vai ser conhecida no momento da criação, por uma comparação dos preços.
como faço para isso acontecer.
Agradeço antecipadamente qualquer ajuda.
GOSTEI 0
Massuda
18/02/2005
só que isso vai fazer a mesma coisa e pintar toda a coluna e não somente a célula que eu to querendo...
Como você informou, parece que o menor preço de cada produto é conhecido de antemão. Então um código possível seria:
procedure TSeuForm.SeuGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Grid: TDBGrid; Produto: string; // id do produto MenorPreco: Integer; // coluna com o menor preco begin Grid := Sender as TDBGrid; // se for a coluna dos preços... if DataCol in [1..4] then begin // obtem o produto Produto := Grid.Fields[0].AsString; // ou Produto := Grid.Columns[0].Field.AsString; MenorPreco := ColunaComMenorPreco(Produto); if DataCol = MenorPreco then begin // escreve em vermelho Grid.Canvas.Font.Color := clRed; end; end; Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State); end;
GOSTEI 0
Salupe
18/02/2005
o problema persiste, e as colunas ficam mostrando o menor valor do ultimo produto, e eu preciso que apareça em cada linha (cada produto)
seja indicado o menor preço dele.
acho que esse comando
Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
pinta o grid inteiro de acordo com as cores selecionadas, fazendo com que as linhas anteriores percam as indicações.
nao tem um comando que mostre as cores sem atualizar o grid inteiro.
Agradeço antecipadamente qualquer ajuda.
seja indicado o menor preço dele.
acho que esse comando
Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
pinta o grid inteiro de acordo com as cores selecionadas, fazendo com que as linhas anteriores percam as indicações.
nao tem um comando que mostre as cores sem atualizar o grid inteiro.
Agradeço antecipadamente qualquer ajuda.
GOSTEI 0
Massuda
18/02/2005
o problema persiste, e as colunas ficam mostrando o menor valor do ultimo produto, e eu preciso que apareça em cada linha (cada produto) seja indicado o menor preço dele. acho que esse comando
Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
pinta o grid inteiro de acordo com as cores selecionadas, fazendo com que as linhas anteriores percam as indicações.
Desculpe, mas tenho certeza que OnDrawColumnCell é executado para cada célula de cada coluna e que coisas que você faz para uma célula não influem nas outras células.Como você está determinando e armazenando o menor preço de cada um dos produtos da sua tabela? Você não pode utilizar um único integer (por exemplo), porque quando o grid é pintado ele irá percorrer sequencialmente todas as células que precisam ser repintadas e essas células podem corresponder a mais de um produto; o ideal seria ter um array ou, melhor, um campo calculado invisível em sua tabela. Se optar por um array, esse array precisa ser preenchido antes do grid ser exibido.
GOSTEI 0
Salupe
18/02/2005
Obrigadaço Massuda, finalmente consegui.
GOSTEI 0
Sinval Lopes
18/02/2005
Obrigadaço Massuda, finalmente consegui.
posta aqui como consgeuiu , to tentando fazer a mesma coisa
GOSTEI 0