GARANTIR DESCONTO

Fórum Colorir dbgrid #269134

18/02/2005

0

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

Responder

Posts

18/02/2005

Motta

Pergunta frequente, veja no Pesquisar


Responder

Gostei + 0

21/02/2005

Salupe

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


Responder

Gostei + 0

21/02/2005

Massuda

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?


Responder

Gostei + 0

21/02/2005

Salupe

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.


Responder

Gostei + 0

21/02/2005

Massuda

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.


Responder

Gostei + 0

21/02/2005

Salupe

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.


Responder

Gostei + 0

21/02/2005

Massuda

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.


Responder

Gostei + 0

21/02/2005

Salupe

Obrigadaço Massuda, finalmente consegui.


Responder

Gostei + 0

19/05/2021

Sinval Lopes

Obrigadaço Massuda, finalmente consegui.





posta aqui como consgeuiu , to tentando fazer a mesma coisa
Responder

Gostei + 0

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

Aceitar