String Grid Canvas
20/06/2006
0
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
Posts
21/06/2006
Rodc
Grade.Repaint();
Depois avisa se era isto que você queria.
10/07/2006
Dcpleal
10/07/2006
Rodc
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.
10/07/2006
Rodc
Esta opção está em runtime. Ela não fica no ObjectInspector.
10/07/2006
Rodc
O código ´Grid.DoubleBuffered := true´ não precisa ficar no OnDrawCell. Coloca ele no OnCreate do Form.
12/07/2006
Dcpleal
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.
12/07/2006
Rodc
É 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.
12/07/2006
Dcpleal
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?
12/07/2006
Rodc
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;
12/07/2006
Dcpleal
Ele passa mais ou menos umas 20 mil vezes nesse código, porque tanto assim?
12/07/2006
Rodc
Tenta trocar usando o canvas, por exempo:
tblItem.Canvas.Pen.Color := clRed
Clique aqui para fazer login e interagir na Comunidade :)