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

(Resolvido) TStringGrid (OnDrawCell) - Problema com CPU Usage


Buz

Pergunta

Pessoal,

Estou criando uma aplicação onde eu utilizo um StringGrid, e o OnDrawCell do mesmo.

O problema q estou tendo é q qd utilizo o On[name]DrawCell meu "CPU Usage" vai para +/- 50%.

Independente do código q coloco dentro do DrawCell, ocorre esse problema.

Eu sei q na verdade o OnDrawCell é um loop, e imagino q seja esse o porque da lentidão... mas num sei resolver

me ajudem pf....

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Na realidade independe do código q está dentro do evento. Isso acontece com qualquer código.

Em todo caso segue código abaixo:

procedure TAluno_form.grid_alunosDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin

with grid_alunos do begin
//Colorir a linha qd selecionada
if ARow = aluno_selecionado then Canvas.Brush.Color := $7FFFFF;
if ARow <> aluno_selecionado then Canvas.Brush.Color := clwhite;
Canvas.Brush.Style := bsSolid;
canvas.Font.Style := [];
canvas.Font.Color := clblack;
rect.Right := rect.Right + grid_alunos.GridLineWidth;
canvas.FillRect(rect);
Canvas.TextOut(Rect.Left,Rect.Top,Cells[ACol, ARow]);
Cells[ACol, ARow] := Cells[ACol, ARow]; //Para atualização da células
end;

panel1.Update; 
end;

[aluno_selecionado] é uma variável (integer) global q contem a linha em q o aluno selecionado está.

Espero q agora seja possível ajudar.....

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'Buz' !

TStringgrid usa uma matriz de x linhas por x colunas.

Qual o tamanho de sua matriz? Aí pode estar a chave da lentidão dentro de OnDrawCell. Uma matriz grande pode ocasionar stack overflow dependendo dos recursos que você estiver usando. Pode, também ocasionar lentidão no processamento, principalmente se tiver programas carregados que ocupem muita memória.

Link para o comentário
Compartilhar em outros sites

  • 0

Ae, descobri onde q tah o problema!!!! Agora só preciso resolver...rs

O problema ta na seguinte instrução:

Cells[ACol, ARow] := Cells[ACol, ARow]; //Para atualização da células

Se eu tiro essa linha do código o processamento fica normal de novo......maaaaas....o código não funciona como deveria....

O objetivo deste código é selecionar uma linha do grid de amarelo, mantendo os textos da coluna 1 e 2...

Sem tirar a linha de código acima funciona beleza, mas se tirar ele já da tudo errado...

Alguma dica?

Vlw!!!!

Link para o comentário
Compartilhar em outros sites

  • 0

O evento OnDrawCell é um evento que se repete indefinidamente enquanto voce estiver com o foco do mouse no form onde está a grid.

Cells[ACol, ARow] := Cells[ACol, ARow]; //Para atualização da células

voce com este comando está mantendo um loop infinito, o que acaba consumindo mais processamento

que tal fazer este procedimento apenas quando voce selecionar uma celula

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
   with grid_alunos do begin
   //Colorir a linha qd selecionada
   if ARow = aluno_selecionado then Canvas.Brush.Color := $7FFFFF;
   if ARow <> aluno_selecionado then Canvas.Brush.Color := clwhite;

   Canvas.Brush.Style := bsSolid;
   canvas.Font.Style := [];
   canvas.Font.Color := clblack;
   rect.Right := rect.Right + grid_alunos.GridLineWidth;
   canvas.FillRect(rect);
   Canvas.TextOut(Rect.Left,Rect.Top,Cells[ACol, ARow]);
   Cells[ACol, ARow] := Cells[ACol, ARow]; //Para atualização da células
   end;

   panel1.Update;

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Jhonas,

o que você disse resolve o meu problema nesse caso.......muito obrigado!

De qualquer maneira, andei pesquisando e achei exatamente o que queria. o que acontece é q na verdade é q qualquer input de texto em célula (não via canvas), com a instrução Cells[x,y]...gera esse problema no processamento....então nunca podemos inserir textos nas células pelo DrawCell...

o que resolveu meu problema para fins de atualiação do grid foi o "Grid.Repaint"...pode parecer idiota, mas ralei pra descobrir isso...rs

Vlw...é isso ae então....

Vlw a todos pela ajuda!!!!!

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...