Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi drawgrid langsam (https://www.delphipraxis.net/97686-drawgrid-langsam.html)

Mr. Pink 14. Aug 2007 14:20


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:
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;
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.
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 :)

Hawkeye219 14. Aug 2007 14:57

Re: drawgrid langsam
 
Hallo,

ich habe eine ältere Routine mal etwas poliert:

Delphi-Quellcode:
procedure InvalidateGridCell (aGrid: TCustomDrawGrid; aCol, aRow: Integer);
var
  R : TRect;
begin
  R := aGrid.CellRect(aCol, aRow);
  InvalidateRect(aGrid.Handle, @R, False);
end;
Gruß Hawkeye

shmia 14. Aug 2007 15:05

Re: drawgrid langsam
 
Mit with ... do lässt sich das etwas beschleunigen:
Delphi-Quellcode:
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;
aber ich denke dein Flaschenhals liegt eher an anderer Stelle.
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.

Mr. Pink 14. Aug 2007 15:21

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 ,)

shmia 14. Aug 2007 15:39

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.

Mr. Pink 14. Aug 2007 15:53

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 hierdrum:
Delphi-Quellcode:
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;
jaa, ich weiß, is scheiße programmiert, aber ich wollts ja eigtl auch nicht veröffentlichen.

liegts denn iwie an dem code, dass es so langsam ist?

shmia 14. Aug 2007 16:16

Re: drawgrid langsam
 
Zitat:

Zitat von Mr. Pink
also ich brauche 4-5 mal so lange. entweder liegt es am restlichen code oder mein pc ist zu langsam^^ (p4, 2,5 ghz).

P4 - 2.8 Ghz, also vergleichbar
Zitat:

Zitat von Mr. Pink
jaa, ich weiß, is scheiße programmiert, aber ich wollts ja eigtl auch nicht veröffentlichen.

Mach doch ein schönes Open Source Projekt draus, dann lässt sich die Geschwindigkeit direkt vergleichen.


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