AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Resize + SetBounds beschleunigen

Ein Thema von stahli · begonnen am 14. Jan 2012 · letzter Beitrag vom 15. Jan 2012
 
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#1

Resize + SetBounds beschleunigen

  Alt 14. Jan 2012, 02:52
In einem Designer stelle ich Controls dar (Panel-Ableitungen, an die Datenobjekte gebunden sind), die wieder andere Controls enthalten.
Wird die Rastergröße geändert, werden die Controls an das Raster angepasst.

Das geht zu langsam, wenn einige hundert Controls dargestellt werden.

AQTime hat mir schon gute Dienste geleistet, aber in der XE-Version geht keine Zeilenanalyse.

Ich habe mir mal notdürftig etwas zusammengeschrieben. Die meiste Zeit geht bei den SetBounds der SubControls drauf.

Gibt es eine Möglichkeit, das zu beschleunigen?
Ich könnte mir vorstellen, vorübergehend die Verabeitung von CMInvalidate zu verhindern, weiß aber nicht recht, ob der Ansatz etwas taugt oder ob es einfacherere Lösungen gibt.


Delphi-Quellcode:
procedure TodvKoGame.Resize;
var
  W: Integer;
  KOG: TodKoGame;
  dt: TDatetime;

  procedure d(i: Integer);

    procedure Swap(var i, j: tda);
    var
      H: tda;
    begin
      H := i;
      i := j;
      j := H;
    end;

    procedure Sort;
    var
      i, j: Integer;
    begin
      for i := Low(da) to High(da) - 1 do
        for j := i + 1 to High(da) do
          begin
            if da[j].dt > da[i].dt then
              Swap(da[i], da[j]);
          end;
    end;

  begin
    dt := now - dt;
    da[i].nr := i;
    da[i].dt := da[i].dt + dt;
    if i = high(da) then
      begin
        inc(dc);
        if dc = 240 then
          begin
            Sort;
            for i := Low(da) to High(da) do
              codesite.send(pchar(FormatDateTime('ss.zzz', da[i].dt) + ': ' + inttostr(da[i].nr)));
            dc := 0;
          end;
      end;
    dt := now;
  end;

begin
  PaintBackground;
  KOG := KoGame;
  if KOG <> nil then
    begin
// inc(xxxr);
// outputdebugstring(pchar('Resize: ' + inttostr(xxxr)));
      dt := now;
      if odvLinkIn1.BevelOuter <> bvNone then
        odvLinkIn1.BevelOuter := bvNone;
      d(1);

      if odPanelGameParty1.BevelOuter <> bvNone then
        odPanelGameParty1.BevelOuter := bvNone;
      d(2);

      if odvLinkIn2.BevelOuter <> bvNone then
        odvLinkIn2.BevelOuter := bvNone;
      d(3);

      if odPanelGameParty2.BevelOuter <> bvNone then
        odPanelGameParty2.BevelOuter := bvNone;
      d(4);

      if odvLinkOutWin.BevelOuter <> bvNone then
        odvLinkOutWin.BevelOuter := bvNone;
      d(5);

      if odvLinkOutLose.BevelOuter <> bvNone then
        odvLinkOutLose.BevelOuter := bvNone;
      d(6);

      W := Pred(Width);
      d(7);

      odvLinkIn1.Visible := True;
      d(8);

      odPanelGameParty1.Visible := True;
      d(9);

      if KOG.ToLeft then
        odvLinkIn1.SetBounds(W - 24, Succ(LineTop), 24, Pred(LineTop)) // <---
      else
        odvLinkIn1.SetBounds(0, Succ(LineTop), 24, Pred(LineTop)); // <---
      d(10);

      if KOG.ToLeft then
        odPanelGameParty1.SetBounds(1, Succ(LineTop), W - 24, Pred(LineTop))
      else
        odPanelGameParty1.SetBounds(24, Succ(LineTop), W - 24, Pred(LineTop));
      d(11);

      odvLinkIn2.Visible := True;
      d(12);

      odPanelGameParty2.Visible := True;
      d(13);

      if KOG.ToLeft then
        odvLinkIn2.SetBounds(W - 24, LineBottom - LineTop, 24, Pred(LineTop))
      else
        odvLinkIn2.SetBounds(0, LineBottom - LineTop, 24, Pred(LineTop));
      d(14);

      if KOG.ToLeft then
        odPanelGameParty2.SetBounds(2, LineBottom - LineTop, W - 24, Pred(LineTop))
      else
        odPanelGameParty2.SetBounds(24, LineBottom - LineTop, W - 24, Pred(LineTop));
      d(15);

      odvLinkOutWin.Visible := True;
      d(16);

      if KOG.ToLeft then
        odvLinkOutWin.SetBounds(1, (Height div 2) - (Pred(LineTop) div 2) - 1, 24, Pred(LineTop))
      else
        odvLinkOutWin.SetBounds(Width - odvLinkOutWin.Width - 1, (Height div 2) - (Pred(LineTop) div 2) - 1, 24, Pred(LineTop));
      d(17);

      odvLinkOutLose.Visible := True;
      d(18);

      if KOG.ToLeft then
        odvLinkOutLose.SetBounds(Width - odvLinkOutLose.Width - 1, (Height div 2) - (Pred(LineTop) div 2) - 1, 24, Pred(LineTop))
      else
        odvLinkOutLose.SetBounds(0, (Height div 2) - (Pred(LineTop) div 2) - 1, 24, Pred(LineTop));
      d(19);

// outputdebugstring(pchar('Resize: ' + inttostr(xxxr) + ' ready'));
    end
  else
    begin
// outputdebugstring(pchar('Resize: ' + '---------------------------'));
// odvLinkIn1.Visible := False;
// odPanelGameParty1.Visible := False;
// odvLinkIn2.Visible := False;
// odPanelGameParty2.Visible := False;
// odvLinkOutWin.Visible := False;
// odvLinkOutLose.Visible := False;
    end;
end;

Zitat:
-beim erstmaligen Aufbau-
04.863: 11
04.863: 15
04.860: 10
04.838: 14
04.831: 19
04.831: 17
02.439: 1
02.412: 5
02.398: 6
02.391: 3
00.000: 4
00.000: 12
00.000: 13
00.000: 7
00.000: 8
00.000: 16
00.000: 9
00.000: 18
00.000: 2
-beim Resize-
12.922: 10 // !!!
10.607: 15 // !!!
10.600: 19 // !!!
10.592: 14 // !!!
10.585: 11 // !!!
10.570: 17 // !!!
04.863: 1
04.863: 2
04.860: 3
04.838: 4
04.831: 5
04.831: 6
02.439: 7
02.412: 8
02.398: 9
00.001: 16
00.000: 13
00.000: 18
00.000: 12
Angehängte Grafiken
Dateityp: png ko64.png (81,6 KB, 45x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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 by Thomas Breitkreuz