Ir para conteúdo
Fórum Script Brasil
  • 0

DBGrid


Rodrigao

Pergunta

Bom dia a todos...

Estou fanzendo uma rotina de Conta Corrente, onde quando as parcelas são baixadas ficam em Azul e as parcelas não

baixadas e vencidas ficam em vermelho.

O problema é que no Vermelho quando a linha azul da seleção do dbgrid passa por cima dela a cor de fundo da celula fica azul escuro e automatico

fica branco na fonte. Mas no Azul não. Quando a linha de seleção azul escuro passa por cima da fonte que esta em azul ela continua azul...

Será que tem como resolver isso?

if (Date > DMX.IBChequeDataVencimento.Value) and (DMX.IBChequeVENCEU.Value <> 'S') then begin

DBGrid1.Canvas.Font.Color:= clred;

DBGrid1.Canvas.FillRect(Rect);

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

if (Date > DMX.IBChequeDataVencimento.Value) and (DMX.IBChequeVENCEU.Value = 'S') then begin

DBGrid1.Canvas.Font.Color:= clBlue;

DBGrid1.Canvas.FillRect(Rect);

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

Atenciosamente.

Rodrigo

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Rodrigao, só há mesmo este código no evento OnDrawColumnCell? Aparentemente não haveria nada de errado com ele, exceto que podemos otimizá-lo.

Vamos melhorar isto?

Quando você testa uma condição onde possam haver diferentes avaliações para uma determinada variável, use if..then..else. Você usou dois if's seguidos e mesmo que a primeira condição seja validada, ainda assim, quantas outras avaliações (if's) você faça, também serão testados (se uma condição foi satisfeita, não há porque testar outra - que não será). Também observe que DefaultDrawColumnCell apenas precisa ser chamado uma única vez antes do end final do evento - todas as definições do canvas devem ter sido alteradas antes:

begin
  if Date > DMX.IBChequeDataVencimento.Value then
  begin
    if DMX.IBChequeVENCEU.Value = 'S' then
      DBGrid1.Canvas.Font.Color:= clBlue
    else
      DBGrid1.Canvas.Font.Color:= clred;
  end;
  DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

Este código funcina independente de você ter, ou não, definido a propriedade DefaulDraw=False do DBGrid.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite Micheus, desculpe a demora a responder, foi porque fui operado esta semana e fiquei bem longe dos micros...hehe

vamos la

o codigo completo é:

if Date > DMX.IBChequeDataVencimento.Value then begin // já com as mudanças sugeridas...

if DMX.IBChequeVENCEU.Value = 'S' then

DBGrid1.Canvas.Font.Color:= clBlue

else

DBGrid1.Canvas.Font.Color:= clred;

end;

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

if Column.Field = DMX.IBChequeVenceu then begin

DBGrid1.Canvas.FillRect(Rect);

if DMX.IBChequeVenceu.Value = 'S' then

ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 14, Rect.Top + 1, 1) else

ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 14, Rect.Top + 1, 0);

end;

deixa eu ver se consigo explicar melhor... a linha do Dbgrid, aquela que seleciona a linha é azul escura certo.

Se a opção for a segunda o fonte é pintada de vermelho e quando a linha azul de seleçao fica em cima do vermelho,

o dbgrid muda a cor da fonte para branco, ao qual fica a linha de seleção em azul e a fonte de branco fica bem visivel.

Agora quando a opção for a primeira ele pinta a fonte de azul e a cor da linha de seleção do dbgrid é azul escuro e não muda a fonte

para branco, fica azul mesmo. Dae não da pra enchegar nada, fica ilegivel aquela linha selecionada.

Atenciosamente,

Rodrigo

Bom dia a todos...

Estou fanzendo uma rotina de Conta Corrente, onde quando as parcelas são baixadas ficam em Azul e as parcelas não

baixadas e vencidas ficam em vermelho.

O problema é que no Vermelho quando a linha azul da seleção do dbgrid passa por cima dela a cor de fundo da celula fica azul escuro e automatico

fica branco na fonte. Mas no Azul não. Quando a linha de seleção azul escuro passa por cima da fonte que esta em azul ela continua azul...

Será que tem como resolver isso?

if (Date > DMX.IBChequeDataVencimento.Value) and (DMX.IBChequeVENCEU.Value <> 'S') then begin

DBGrid1.Canvas.Font.Color:= clred;

DBGrid1.Canvas.FillRect(Rect);

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

if (Date > DMX.IBChequeDataVencimento.Value) and (DMX.IBChequeVENCEU.Value = 'S') then begin

DBGrid1.Canvas.Font.Color:= clBlue;

DBGrid1.Canvas.FillRect(Rect);

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

Atenciosamente.

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0
Agora quando a opção for a primeira ele pinta a fonte de azul e a cor da linha de seleção do dbgrid é azul escuro e não muda a fonte para branco, fica azul mesmo. Dae não da pra enchegar nada, fica ilegivel aquela linha selecionada.
Rodrigao, está quase tudo certo, inclusive o fato de você ter posto o desenho das imagens após chamar o método DefaultDrawColumnCell, apesar do que como eu disse:

"DefaultDrawColumnCell apenas precisa ser chamado uma única vez antes do end final do evento"

Este o único tipo de ação cabível de ser usado após o citado método, visto que o desenho padrão é feito por este método. O problema está associado ao fato de você ter pintado o fundo (FillRect) após ter chamado ele.

Veja o seu código organizado visualmente e com a referida linha comentada - deverá funcionar do jeito que você espera.

if Date > DMX.IBChequeDataVencimento.Value then 
begin // já com as mudanças sugeridas...
  if DMX.IBChequeVENCEU.Value = 'S' then
    DBGrid1.Canvas.Font.Color:= clBlue
  else
    DBGrid1.Canvas.Font.Color:= clred;
end;

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
if Column.Field = DMX.IBChequeVenceu then 
begin
//  DBGrid1.Canvas.FillRect(Rect);  <==== RETIRAR
  if DMX.IBChequeVenceu.Value = 'S' then
    ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 14, Rect.Top + 1, 1) 
  else
    ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 14, Rect.Top + 1, 0);
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Micheus,

Fiz o que você me orientou, mas a unica mudança foi que no desenho passou a aparecer o valor da field Venceu, no Caso "S" e "N" junto com os desenhos.

É possivel deixar aquela linha de seleção mais clara?

De repente tb seria uma boa solução.

Agradecido.

Rodrigo

Boa noite Micheus, desculpe a demora a responder, foi porque fui operado esta semana e fiquei bem longe dos micros...hehe

vamos la

o codigo completo é:

if Date > DMX.IBChequeDataVencimento.Value then begin // já com as mudanças sugeridas...

if DMX.IBChequeVENCEU.Value = 'S' then

DBGrid1.Canvas.Font.Color:= clBlue

else

DBGrid1.Canvas.Font.Color:= clred;

end;

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

if Column.Field = DMX.IBChequeVenceu then begin

DBGrid1.Canvas.FillRect(Rect);

if DMX.IBChequeVenceu.Value = 'S' then

ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 14, Rect.Top + 1, 1) else

ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 14, Rect.Top + 1, 0);

end;

deixa eu ver se consigo explicar melhor... a linha do Dbgrid, aquela que seleciona a linha é azul escura certo.

Se a opção for a segunda o fonte é pintada de vermelho e quando a linha azul de seleçao fica em cima do vermelho,

o dbgrid muda a cor da fonte para branco, ao qual fica a linha de seleção em azul e a fonte de branco fica bem visivel.

Agora quando a opção for a primeira ele pinta a fonte de azul e a cor da linha de seleção do dbgrid é azul escuro e não muda a fonte

para branco, fica azul mesmo. Dae não da pra enchegar nada, fica ilegivel aquela linha selecionada.

Atenciosamente,

Rodrigo

Bom dia a todos...

Estou fanzendo uma rotina de Conta Corrente, onde quando as parcelas são baixadas ficam em Azul e as parcelas não

baixadas e vencidas ficam em vermelho.

O problema é que no Vermelho quando a linha azul da seleção do dbgrid passa por cima dela a cor de fundo da celula fica azul escuro e automatico

fica branco na fonte. Mas no Azul não. Quando a linha de seleção azul escuro passa por cima da fonte que esta em azul ela continua azul...

Será que tem como resolver isso?

if (Date > DMX.IBChequeDataVencimento.Value) and (DMX.IBChequeVENCEU.Value <> 'S') then begin

DBGrid1.Canvas.Font.Color:= clred;

DBGrid1.Canvas.FillRect(Rect);

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

if (Date > DMX.IBChequeDataVencimento.Value) and (DMX.IBChequeVENCEU.Value = 'S') then begin

DBGrid1.Canvas.Font.Color:= clBlue;

DBGrid1.Canvas.FillRect(Rect);

DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

Atenciosamente.

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0
Fiz o que você me orientou, mas a unica mudança foi que no desenho passou a aparecer o valor da field Venceu, no Caso "S" e "N" junto com os desenhos.
e esta seria a posição onde você estaria sobrepondo a imagem?

É possivel deixar aquela linha de seleção mais clara?

De repente tb seria uma boa solução.

vou tentar fazer um exemplo.

Rodrigo

Abraços

p.s. Evite "quotar" todo o tópico (botão Resp.). Se houver parte de alguma coisa que deva ser mantida para comentário, remova o excedente com cuidado de não deixar a tag aberta (use a opção Visualizar post). Se não houver, use o botão Responder. Isto evita que os posts fiquem confusos. ;)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...