![]() |
AW: Panel mit vielen Buttons baut sich langsam auf
Das hört sich so an als ob alle Komponenten gleichzeitig vorhanden sind. Viel sinnvoller ist aber diese nur dynamisch zu erstellen wenn sie benötigt werden. Je mehr Komponenten auf dem Formular sind desto langsamer wird das. Und das nicht proportional sondern exponentiell, weil die einzelnen Komponenten sich gegenseitig benachrichtigen.
In unserer Kassenanwendung ist diese Anzahl von Knöpfen jedenfalls auch auf einem solchen Atom Prozessor kein Problem. |
AW: Panel mit vielen Buttons baut sich langsam auf
Ich stelle mir das gerade so ähnlich wie das hier vor:
![]() :lol: |
AW: Panel mit vielen Buttons baut sich langsam auf
Das Formular dient der Selektion von Items aus einer sehr langen Liste, das Panel mit den Buttons ist eine Sprungfunktion zu den jeweiligen Oberkategorien. Wenn sich das besser lösen lässt, bin ich für Vorschläge offen. Die bisherigen Tipps werde ich bei Gelegenheit ausprobieren, in der Bahn ist das nämlich schwierig ;)
|
AW: Panel mit vielen Buttons baut sich langsam auf
Also wenn du schon schreibst: "Liste" Da kommt einem doch sofort eine Listbox oder Combobox in den Sinn.
|
AW: Panel mit vielen Buttons baut sich langsam auf
Die Liste ist nicht das Problem, sie kann allerdings nur Eintragweise navigiert werden. Von 0 zu 30 hieße also 30x den Button hämmern, deshalb gibt es das Panel (legt sich komplett über die Anwendung), das alle Einträge anzeigt und es ermöglicht, direkt zu jedem Eintrag zu springen. Dieser kann dann geöffnet und die Subeinträge in der Liste weiter durchgegangen werden, bis man zu dem Eintrag kommt, der selektiert werden soll.
Das Öffnen des Panels ist durch das ungleichmäßige Anzeigen sehr unansehnlich, prinzipiell würde es auch reichen, wenn das Panel 1 sek später erscheint, dafür aber der Ladevorgang eben nicht sichtbar ist. |
AW: Panel mit vielen Buttons baut sich langsam auf
TTreeView ist dein Freund
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zunächst vielen Dank für die vielen Vorschläge, ich habe versucht, alles auszuprobieren (mit aktuellen Treibern) - leider ohne Erfolg. Zunächst nochmal das Problem in Videoform, vielleicht wird es dann deutlicher:
![]() Die Aufnahmen sind stark verlangsamt, um den Aufbau deutlich erkennen zu können. In Echtzeit ist es in dieser Testunit nur zu erkennen, wenn man drauf achtet, aber mit der eigentlichen Applikationslogik im Hintergrund und zusätzlichen Styles wird das Problem sehr deutlich sichtbar. Die Methoden scheinen sich nicht signifikant zu unterscheiden und der eigentliche Bildaufbau ist immer ein Vorgang, der sich sichtbar über den Bildschirm bewegt. Ist es überhaupt möglich, dies zu verhindern? Der Code(habe leider keine Spoilertags gefunden):
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls; type TForm1 = class(TForm) BitBtn42: TBitBtn; Panel1: TPanel; BitBtn1: TBitBtn; BitBtn2: TBitBtn; BitBtn3: TBitBtn; BitBtn4: TBitBtn; BitBtn5: TBitBtn; BitBtn6: TBitBtn; BitBtn7: TBitBtn; BitBtn8: TBitBtn; BitBtn9: TBitBtn; BitBtn10: TBitBtn; BitBtn11: TBitBtn; BitBtn12: TBitBtn; BitBtn13: TBitBtn; BitBtn14: TBitBtn; BitBtn15: TBitBtn; BitBtn16: TBitBtn; BitBtn17: TBitBtn; BitBtn18: TBitBtn; BitBtn19: TBitBtn; BitBtn20: TBitBtn; BitBtn21: TBitBtn; BitBtn22: TBitBtn; BitBtn23: TBitBtn; BitBtn24: TBitBtn; BitBtn25: TBitBtn; BitBtn26: TBitBtn; BitBtn27: TBitBtn; BitBtn28: TBitBtn; BitBtn29: TBitBtn; BitBtn30: TBitBtn; BitBtn31: TBitBtn; BitBtn32: TBitBtn; BitBtn33: TBitBtn; BitBtn34: TBitBtn; BitBtn35: TBitBtn; BitBtn36: TBitBtn; BitBtn37: TBitBtn; BitBtn38: TBitBtn; BitBtn39: TBitBtn; BitBtn40: TBitBtn; BitBtn41: TBitBtn; BitBtn43: TBitBtn; BitBtn44: TBitBtn; BitBtn45: TBitBtn; BitBtn46: TBitBtn; procedure BitBtn42Click(Sender: TObject); procedure BitBtn44Click(Sender: TObject); procedure BitBtn45Click(Sender: TObject); procedure BitBtn46Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.BitBtn42Click(Sender: TObject); var I : Integer; handle : HWND; begin handle := BeginDeferWindowPos(1); DeferWindowPos(handle,Panel1.Handle,HWND_TOP,0,0,640,480,$0001); EndDeferWindowPos(handle); end; procedure TForm1.BitBtn44Click(Sender: TObject); begin Panel1.Left := 640; end; procedure TForm1.BitBtn45Click(Sender: TObject); begin Panel1.Left := 0; end; procedure TForm1.BitBtn46Click(Sender: TObject); begin SendMessage(Panel1.Handle, WM_SETREDRAW, 0, 0); try Panel1.Left:= Form1.Width + 1; // Sollte natürlich das Formular sein auf dem das Panel liegt. Panel1.Top:=0; Panel1.Visible:=True; Panel1.Left:= 0; finally SendMessage(Panel1.Handle, WM_SETREDRAW, 1, 0); RedrawWindow(Panel1.Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN); end; end; end.
Delphi-Quellcode:
object Form1: TForm1
Left = 0 Top = 0 BorderStyle = bsNone Caption = 'Form1' ClientHeight = 480 ClientWidth = 640 Color = clBtnFace DoubleBuffered = True Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False Scaled = False PixelsPerInch = 96 TextHeight = 13 object BitBtn42: TBitBtn Left = 8 Top = 228 Width = 97 Height = 25 Caption = 'DeferWindowsPos' TabOrder = 0 OnClick = BitBtn42Click end object Panel1: TPanel Left = 640 Top = 0 Width = 640 Height = 480 Caption = 'Panel1' FullRepaint = False TabOrder = 1 object BitBtn1: TBitBtn Left = 16 Top = 16 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 0 end object BitBtn2: TBitBtn Left = 16 Top = 47 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 1 end object BitBtn3: TBitBtn Left = 16 Top = 78 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 2 end object BitBtn4: TBitBtn Left = 16 Top = 109 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 3 end object BitBtn5: TBitBtn Left = 16 Top = 140 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 4 end object BitBtn6: TBitBtn Left = 16 Top = 171 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 5 end object BitBtn7: TBitBtn Left = 16 Top = 202 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 6 end object BitBtn8: TBitBtn Left = 16 Top = 233 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 7 end object BitBtn9: TBitBtn Left = 16 Top = 264 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 8 end object BitBtn10: TBitBtn Left = 16 Top = 295 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 9 end object BitBtn11: TBitBtn Left = 16 Top = 326 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 10 end object BitBtn12: TBitBtn Left = 16 Top = 357 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 11 end object BitBtn13: TBitBtn Left = 16 Top = 388 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 12 end object BitBtn14: TBitBtn Left = 16 Top = 419 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 13 end object BitBtn15: TBitBtn Left = 224 Top = 16 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 14 end object BitBtn16: TBitBtn Left = 224 Top = 295 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 15 end object BitBtn17: TBitBtn Left = 224 Top = 326 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 16 end object BitBtn18: TBitBtn Left = 224 Top = 357 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 17 end object BitBtn19: TBitBtn Left = 224 Top = 388 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 18 end object BitBtn20: TBitBtn Left = 224 Top = 419 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 19 end object BitBtn21: TBitBtn Left = 224 Top = 47 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 20 end object BitBtn22: TBitBtn Left = 224 Top = 78 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 21 end object BitBtn23: TBitBtn Left = 224 Top = 109 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 22 end object BitBtn24: TBitBtn Left = 224 Top = 140 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 23 end object BitBtn25: TBitBtn Left = 224 Top = 171 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 24 end object BitBtn26: TBitBtn Left = 224 Top = 202 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 25 end object BitBtn27: TBitBtn Left = 224 Top = 233 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 26 end object BitBtn28: TBitBtn Left = 224 Top = 264 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 27 end object BitBtn29: TBitBtn Left = 440 Top = 16 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 28 end object BitBtn30: TBitBtn Left = 440 Top = 295 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 29 end object BitBtn31: TBitBtn Left = 440 Top = 326 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 30 end object BitBtn32: TBitBtn Left = 440 Top = 357 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 31 end object BitBtn33: TBitBtn Left = 440 Top = 388 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 32 end object BitBtn34: TBitBtn Left = 440 Top = 419 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 33 end object BitBtn35: TBitBtn Left = 440 Top = 47 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 34 end object BitBtn36: TBitBtn Left = 440 Top = 78 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 35 end object BitBtn37: TBitBtn Left = 440 Top = 109 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 36 end object BitBtn38: TBitBtn Left = 440 Top = 140 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 37 end object BitBtn39: TBitBtn Left = 440 Top = 171 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 38 end object BitBtn40: TBitBtn Left = 440 Top = 202 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 39 end object BitBtn41: TBitBtn Left = 440 Top = 233 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 40 end object BitBtn43: TBitBtn Left = 440 Top = 264 Width = 177 Height = 25 Caption = 'BitBtn1' TabOrder = 41 end object BitBtn44: TBitBtn Left = 224 Top = 450 Width = 177 Height = 25 Caption = 'Panel ausblenden' TabOrder = 42 OnClick = BitBtn44Click end end object BitBtn45: TBitBtn Left = 128 Top = 228 Width = 75 Height = 25 Caption = 'Left:=0' TabOrder = 2 OnClick = BitBtn45Click end object BitBtn46: TBitBtn Left = 232 Top = 228 Width = 75 Height = 25 Caption = 'SendMessage' TabOrder = 3 OnClick = BitBtn46Click end end |
AW: Panel mit vielen Buttons baut sich langsam auf
Du solltest dir eine Alternative zu dieser Button-Orgie überlegen.
z.B. Eine ListBox, die einfach die Bilder von einem Button malt. Die Auflistung kann man auch wesentlich einfacher erweitern (mehr "Buttons" darstellen). |
AW: Panel mit vielen Buttons baut sich langsam auf
Hier habe ich mal so etwas selbst gezeichnet:
![]() Das funktionierte auch auf einem alten Rechner problemlos. |
AW: Panel mit vielen Buttons baut sich langsam auf
Dumme Frage: Der TBitBtn ist doch so etwas von der VCL selbst gezeichnetes, oder? Was ist wenn man einmal mit Notepad durch die .pas und .dfm geht und alle Vorkommen von TBitBtn gegen TButton ersetzt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 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