![]() |
drawgrid langsam
hi leutz,
habe mal was mit dem drawgrid programmiert und zwar soll nen [0..99,0..99]-array of boolean farblich auf das drawgrid übertragen werden, dass auch 100x100 groß ist.
Delphi-Quellcode:
so funzt auch alles super, allerdings wird das feld kontinuirlich verändert, und am besten wäre es, wenn man jede änderung sofort sehen könnte. hba das ganze dann per drawgrid1.refresh gemacht, also dass das nach jeder änderung aufgerufen wird, allerdings ist das ganze sehr langsam.
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); begin if feld[acol,arow] then drawgrid1.canvas.brush.color := clblack else drawgrid1.canvas.brush.color := clwhite; drawgrid1.canvas.fillrect(rect); end; es wird immer nur ein feld verändert - gibt es da eine möglichkeit, dass dann auch nur dieses eine feld, von dem ich natürlich die koordinaten habe, in drawgrid verändert wird? danke schon mal :) |
Re: drawgrid langsam
Hallo,
ich habe eine ältere Routine mal etwas poliert:
Delphi-Quellcode:
Gruß Hawkeye
procedure InvalidateGridCell (aGrid: TCustomDrawGrid; aCol, aRow: Integer);
var R : TRect; begin R := aGrid.CellRect(aCol, aRow); InvalidateRect(aGrid.Handle, @R, False); end; |
Re: drawgrid langsam
Mit with ... do lässt sich das etwas beschleunigen:
Delphi-Quellcode:
aber ich denke dein Flaschenhals liegt eher an anderer Stelle.
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); begin with drawgrid1.canvas do begin if feld[acol,arow] then brush.color := clblack else brush.color := clwhite; fillrect(rect); end; end; Versuch mal, nach jeder Änderung an feld[] die Methode Drawgrid1.Invalidate aufzurufen. Das Drawgrid wird dann nicht sofort neu gezeichnet, sondern nur dann wenn Windows Zeit hat die Windows Botschaften abzuarbeiten. Das bedeutet, dass sich durchaus mehrere feld[] Werte ändern können, bis neu gezeichnet wird, aber dafür ruckelt und flackert nichts. |
Re: drawgrid langsam
hi, danke für die antworten, allerdings peil ich die InvalidateGridCell-prcedure nicht ganz:
was muss ich denn bei aGrid übergeben? das drawgrid ist es ja ncih, funzt zumindest nicht bei mir... verstehe auch nciht ganz wie das ganze funktionieren soll, hab allerdings auch keine wirkliche ahnung von delphi... und solange es funktionieren würde wärs ja auch ok ;) drawgrid1.invalidate ist denk ich für meine zwecke nicht so geeignet, da es in dem prog. eigtl einzig und allein um das feld geht, das ununterbrochen per schleife verändert wird, sodass entweder wieder nur alles am schluss angezeigt wird (was ich ja eben nicht will), oder, wenn ich application.processmessages dazupacke, es genauso langsam ist. wie mit refresh.... trotzdem danke, vllt kann mir ja doch noch wer helfen ,) |
Re: drawgrid langsam
Ich habe hier gerade mal einen Test mit einem 100 * 100 DrawGrid + Timer gemacht:
In 10 Sekunden habe ich 310 mal den Inhalt geändert und gezeichnet Das sind 31 Änderungen pro Sekunde. Also mein Auge kann den Änderungen nicht folgen; es "wusselt" nur so. |
Re: drawgrid langsam
also ich brauche 4-5 mal so lange. entweder liegt es am restlichen code oder mein pc ist zu langsam^^ (p4, 2,5 ghz).
ich aknn ja mal den restlichen relevanten code posten (geht übrigens ![]()
Delphi-Quellcode:
jaa, ich weiß, is scheiße programmiert, aber ich wollts ja eigtl auch nicht veröffentlichen.
procedure vor(x,y,r:integer);
begin for i:=1 to ende do begin if feld[x,y] then begin feld[x,y]:=false; if r<>1 then r:=r-1 else r:=4; end else begin feld[x,y]:=true; if r<>4 then r:=r+1 else r:=1; end; form1.drawgrid1.Refresh; {form1.Label2.Caption:='aktuell: '+inttostr(i); application.ProcessMessages;} //////////////////////////////////////////////////////////////////////////////// begin if r=1 then begin if y>=1 then y:=y-1 else y:=99; end; if r=2 then begin if x<=98 then x:=x+1 else x:=0; end; if r=3 then begin if y<=98 then y:=y+1 else y:=0 end; if r=4 then begin if x>=1 then x:=x-1 else x:=99; end; end; end; end; liegts denn iwie an dem code, dass es so langsam ist? |
Re: drawgrid langsam
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz