Fórum Colorir dbgrid #269134
18/02/2005
0
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
Curtir tópico
+ 0Posts
18/02/2005
Motta
Gostei + 0
21/02/2005
Salupe
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
21/02/2005
Massuda
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
21/02/2005
Salupe
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
21/02/2005
Massuda
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
21/02/2005
Salupe
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
21/02/2005
Massuda
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
21/02/2005
Salupe
Gostei + 0
19/05/2021
Sinval Lopes
posta aqui como consgeuiu , to tentando fazer a mesma coisa
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)