![]() |
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. |
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
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. |
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. |
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:
|
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... |
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 ? |
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. |
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