Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

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 Panel mit vielen Buttons baut sich langsam auf (https://www.delphipraxis.net/188444-panel-mit-vielen-buttons-baut-sich-langsam-auf.html)

jaenicke 19. Mär 2016 12:08

AW: Panel mit vielen Buttons baut sich langsam auf
 
Ich frage mich gerade, ob es vielleicht bringt Gruppen von Komponenten in Frames auszulagern...
Das wäre vermutlich keine so furchtbar große Umstellung, könnte aber das Problem umgehen, dass bei jedem Hinzufügen einer Komponente alle anderen benachrichtigt werden. Ob ein Frame das verhindert, bin ich mir gerade nicht sicher, vermute es aber.

FarAndBeyond 19. Mär 2016 16:31

AW: Panel mit vielen Buttons baut sich langsam auf
 
Zitat:

Danke, das stellt mein Problem super dar. Ich habe die Größe der Buttons angepasst, um meinen PC sichtbar zu beschäftigen, etwa 10000 Stück. Nicht, dass das irgendeinen Sinn hätte, aber man sieht deutlich, wie zunächst nichts passiert, während die Buttons erzeugt werden. Sobald das Label verschwindet, fangen die Buttons an, von unten nach oben zu erscheinen, anstatt alle gleichzeitig angezeigt zu werden.
Echt? Das ist ja schräg...
Kannst du mal das hier ausprobieren: das Sleep(50) kannst du ja auf 5 oder 10 stellen, falls überhaupt notwendig...
(Wenn ich den Code hier fahre, dann werden die einzelnen Buttons sichtbar und relativ langsam von links nach rechts bzw. oben nach unten aufgebaut ohne das Panel1.Show irgend eine Wirkung hätte... ist schließlich von Anfang an sichtbar).

Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
  Var
   I: Integer;
   B: TButton;
   myTop, myLeft, countLeft, countTop,
   btnWidth, btnHeight, maxLeft, panMaxH,
   panMaxW: Integer;
 Begin
  btnWidth := 100;
  btnHeight := 100;
  countLeft :=  0;
  countTop :=  1;
  myTop    :=  0;
  myLeft   :=-100;

  Label1.Show;
  Panel1.Show;
  Form1.Update;
   panMaxH:= (Panel1.ClientHeight Div btnHeight);
   panMaxW:= (Panel1.ClientWidth Div btnWidth);

   For I:= 1 To (panMaxH*panMaxW)
   Do
    Begin
     myLeft:= myLeft +btnWidth;

      If (Panel1.ClientWidth-(countLeft*btnWidth)) < btnWidth
      Then
       Begin
        myLeft  := 0;
        myTop   := myTop +btnHeight;
        maxLeft := countLeft;
        countLeft:= 0;
        //countTop := countTop +1;
       End;

     B:= TButton.Create(Self);
     B.SetBounds(myLeft, myTop, btnWidth, btnHeight);
     B.Parent:= Panel1;

     countLeft:= countLeft +1;

     Sleep(50);
     Form1.Update;
    End;
  Label1.Hide;
 End;

End.

NielsB 25. Mär 2016 15:59

AW: Panel mit vielen Buttons baut sich langsam auf
 
Sorry, dass die Antwort etwas verspätet kommt: Mit dem eingebauten Update bauen sich die Buttons von oben nach unten auf, wie die Schleife es erwarten lässt, ohne Update war es von unten nach oben.
Ich habe mich einmal durch den unterliegenden Code debuggt und habe den Grund für meine Probleme entdeckt, jeder Button scheint eine Message zu erzeugen, die nach dem Erzeugen aller Buttons in einer Schleife abgearbeitet werden. Dabei wird für jeden Button die TWinControl.WMPaint Prozedur aufgerufen, die diesen dann auf das Panel zeichnet. Dabei wird jeder Button einzeln gezeichnet, das DoubleBuffered bezieht sich auf den Aufbau eines Buttons und bringt dementsprechend gar nichts.
Man müsste also die WMPaint Aufrufe kombinieren, sodass alle Veränderungen zwischengespeichert werden, bis schließlich der Buffer auf das Display gezeichnet wird.

jaenicke 26. Mär 2016 08:01

AW: Panel mit vielen Buttons baut sich langsam auf
 
Hast du denn einmal ausprobiert wie schnell dieses Programm dort läuft? Bei meinen Tests lief das auch auf langsamen Rechnern gut.
Zitat:

Zitat von jaenicke (Beitrag 1332168)
Hier habe ich mal so etwas selbst gezeichnet:
http://www.delphipraxis.net/132375-p...-beta-6-a.html
Das funktionierte auch auf einem alten Rechner problemlos.


NielsB 27. Mär 2016 11:13

AW: Panel mit vielen Buttons baut sich langsam auf
 
Ich habe die Suchfunktion einmal ausprobiert, dabei werden ja viele Komponenten aus/eingeblendet. Man erkennt dabei auch, dass die Buttons nicht gemeinsam, sondern in mehreren Gruppen gezeichnet werden, was aber keinem erkennbaren Muster folgt. Windows scheint die Aufrufe selbst zu "optimieren".

Ich bin mittlerweile aber auch so weit, dass ich die VCL Styles aufgeben werde, das führt zu nichts. Ohne Styles reicht die Hardware gerade so, dass alles scheinbar ohne Verzögerung erscheint. Wenn sich mit den Windowsthemes noch was machen lassen sollte, werde ich es damit machen und wenn nicht, dann nicht...

Red-Flash 31. Jan 2019 09:43

AW: Panel mit vielen Buttons baut sich langsam auf
 
Ich habe auch das Problem (zwar nicht nur Bottons, sondern viele Andere Komponenten) unter Delphi XE10...

Wenn man allerdings alle Komponenten auf einen TIWRegion einfügt, der auf der TForm ist, geht der Aufbau sehr schnell.

Weiß jemand warum ?

Und der TIWRegion verursacht beim Beenden ein Speicherloch.
Wenn man im Projekt ReportMemoryLeaksOnShutdown auf True setzt kommt die Meldung mit dem Speicherloch.
Erst wenn man den TIWRegion aus dem Formular gelöscht UND aus der Usesklausel das ganze IW Gedöns entfernt hat kommt die Meldung nicht mehr...

Weiß da jemand warum ?

hoika 31. Jan 2019 13:35

AW: Panel mit vielen Buttons baut sich langsam auf
 
Hallo,
schau mal in der entsprechenden Unit ganz unten (initialize oder letztes begin/end).
Da wird bestimmt irgendein Cache erzeugt und zum Schluss nicht wieder freigegeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr.
Seite 5 von 5   « Erste     345   

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