Buz Postado Maio 20, 2008 Denunciar Share Postado Maio 20, 2008 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 resolverme ajudem pf.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 20, 2008 Denunciar Share Postado Maio 20, 2008 Eu sei q na verdade o OnDrawCell é um loop, e imagino q seja esse o porque da lentidão... mas num sei resolverme ajudem pf....sem voce colocar o codigo que esta dentro do evento, fica dificil para qualquer umabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Buz Postado Maio 26, 2008 Autor Denunciar Share Postado Maio 26, 2008 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Maio 26, 2008 Denunciar Share Postado Maio 26, 2008 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Buz Postado Maio 26, 2008 Autor Denunciar Share Postado Maio 26, 2008 Denis,o que você disse faz todo sentido, mas ainda assim minha matriz é pequena. Atualmente, para fins de teste, ela é [2,8].....futuramente ela será [2,200]... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Buz Postado Maio 27, 2008 Autor Denunciar Share Postado Maio 27, 2008 Ae, descobri onde q tah o problema!!!! Agora só preciso resolver...rsO 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!!!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Maio 27, 2008 Denunciar Share Postado Maio 27, 2008 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élulasvoce com este comando está mantendo um loop infinito, o que acaba consumindo mais processamentoque tal fazer este procedimento apenas quando voce selecionar uma celulaprocedure 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Buz Postado Maio 27, 2008 Autor Denunciar Share Postado Maio 27, 2008 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...rsVlw...é isso ae então....Vlw a todos pela ajuda!!!!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Buz
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
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.