Colorir dbgrid

Delphi

18/02/2005

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.


Salupe

Salupe

Curtidas 0

Respostas

Motta

Motta

18/02/2005

Pergunta frequente, veja no Pesquisar


GOSTEI 0
Salupe

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


GOSTEI 0
Massuda

Massuda

18/02/2005

No evento OnDrawColumnCell do seu dbgrid, faça algo assim:
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 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?


GOSTEI 0
Salupe

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.


GOSTEI 0
Massuda

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;
Nesse exemplo, assumo que ColunaComMenorPreco(Produto) retorna qual a coluna (no intervalo 1..4) que contem o menor preço para um determinado produto. Precisa adaptar para o seu caso.


GOSTEI 0
Salupe

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.


GOSTEI 0
Massuda

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

Salupe

18/02/2005

Obrigadaço Massuda, finalmente consegui.


GOSTEI 0
Sinval Lopes

Sinval Lopes

18/02/2005

Obrigadaço Massuda, finalmente consegui.





posta aqui como consgeuiu , to tentando fazer a mesma coisa
GOSTEI 0
POSTAR