String Grid Canvas

20/06/2006

0

Boa Tarde a Todos!

Estive pesquisando no forum sobre o canvas e o String Grid e consegui fazer algo parecido com o que eu preciso, no caso estou precisando que o String Grid verifique um valor numa celular e conforme esse valor mude a cor da linha, segue abaixo o codigo no evendo DrawCell do String Grid

  If Grade.Cells[0,Arow] = ´X´ Then
    Grade.Canvas.Brush.Color:= clYellow
  Else
    Grade.Canvas.Brush.Color:= clWindow;
  If ARow = 0 Then// para o titulo
    Grade.Canvas.Brush.Color:= clBtnFace;
  Grade.Canvas.FillRect(Rect);
  Grade.Canvas.TextRect(Rect,Rect.Left,Rect.Top,Grade.Cells[ACol,ARow]);


com esse codigo quando eu marco uma celula( ex.: cells[0,1] com o valor de ´X´ o sistema marca somente a celula com o ´X´ as demais celulas da linha ficam em branco. Estou precisando q quando a Cell[0,1] for Marcado fique toda a linha selecionada.

Para Marca a celula estou usando o evento onClick do String Grid:

  If Grade.Cells[0,Grade.Row] = ´´ Then
    begin
      Grade.Cells[0,Grade.Row]:= ´X´
    end
  Else
    Grade.Cells[0,Grade.Row]:= ´´;



Agradeço desde ja a atenção


Ednet

Ednet

Responder

Posts

21/06/2006

Rodc

Coloque no final do evento OnClick este código:
Grade.Repaint();

Depois avisa se era isto que você queria.


Responder

10/07/2006

Dcpleal

Porque quando utilizamos esse evento para mudança de cor da string grid ela fica piscando e mais lenta?


Responder

10/07/2006

Rodc

Porque quando utilizamos esse evento para mudança de cor da string grid ela fica piscando e mais lenta?

Porque ele gasta tempo repintando todo o Grid toda vês que você fizer alguma alteração no Grid.
Para ´suavizar´ o problema, coloque a opção DoubleBuffered do Grid para true. Isto fará com que o componente seja pintado primeiramente em memória e depois copiado para o Canvas.


Responder

10/07/2006

Dcpleal

eu nao tenho esta opcao aki


Responder

10/07/2006

Rodc

eu nao tenho esta opcao aki

Esta opção está em runtime. Ela não fica no ObjectInspector.


Responder

10/07/2006

Dcpleal

ok obrigado ja encontrei e coloquei no evento OnDrawCell


Responder

10/07/2006

Rodc

ok obrigado ja encontrei e coloquei no evento OnDrawCell

O código ´Grid.DoubleBuffered := true´ não precisa ficar no OnDrawCell. Coloca ele no OnCreate do Form.


Responder

12/07/2006

Dcpleal

Bom dia,

Utilizei a solução proposta, porém essa solução deixou a aplicação lenta, alguem sabe me dizer porque? utilizei a opcao DoubleBuffered mas mesmo assim, os botões demoram para ser carregados.


Responder

12/07/2006

Rodc

Bom dia, Utilizei a solução proposta, porém essa solução deixou a aplicação lenta, alguem sabe me dizer porque? utilizei a opcao DoubleBuffered mas mesmo assim, os botões demoram para ser carregados.

É que, pelo desenho do Canvas ser feito primeiramente em memória, consome mais memória e processamento. Pelo conhecimento que tenho, não tem como fugir deste problema. Apenas verifique se a rotina que altera o Canvas não está entrando em recursividade ou muitas vezes seguidamente. Analise uma forma de reduzir o desenho do Canvas.


Responder

12/07/2006

Dcpleal

o problema é realmente este se vc resolve debugar a aplicação ele só fica dentro da rotina, e a rotina eu fiz desta forma:

procedure TfrmProtocolos.tblItemDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
If (tblItem.Cells[7, ARow] <> ´´) AND (tblItem.Cells[7, ARow] <> ´__/__/____´) AND
(tblItem.Cells[7, ARow] <> ´ / / ´) AND (tblItem.Cells[7, ARow] <> ´Dta. pagto.´) Then
Begin
tblItem.Font.Color := clRed;
End
Else
tblItem.Font.Color := clBlack;
end;

onde esta o problema?


Responder

12/07/2006

Rodc

onde esta o problema?

Aparentemente não tem problema. Talvêz sua máquina seja muito lenta. Para verificar a quantidade de vezes que o código é executado, coloque a linha abaixo dentro do código Draw e verifique no Caption do form os números aumentando.

Caption := StrToIntDef(Caption, 0) + 1;


Responder

12/07/2006

Dcpleal

Impossível ser a maquina lenta é um notebook satellite P4 HT de 3.2Ghz, 512Mb de memória.

Ele passa mais ou menos umas 20 mil vezes nesse código, porque tanto assim?


Responder

12/07/2006

Rodc

Afff!! 20mil vezes? É muita coisa....
Tenta trocar usando o canvas, por exempo:
tblItem.Canvas.Pen.Color := clRed



Responder

12/07/2006

Dcpleal

mas este problema de o nro de vezes nao esta na procedure?


Responder

12/07/2006

Dcpleal

com o Canvas ele nao muda a cor da fonte do item, porque?


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar