![]() |
Panel mit vielen Buttons baut sich langsam auf
Hallo zusammen,
folgende Situation: Ich arbeite an einer VCL-Anwendung mit XE7, die auf Systemen mit Intel Atom N2600 CPU laufen muss. Die Anwendung soll mittels VCL Styles optisch etwas aufgehübscht werden, allerdings treten dabei sichtbare Performanceprobleme auf. Am meisten fällt es auf, wenn auf einem Formular ein Panel mit etwa 60 Buttons eingeblendet werden soll:
Code:
Das Panel inklusive Buttons erscheint nicht auf einmal, sondern wird stückweise aufgebaut. Ich habe bereits versucht, DoubleBuffered bei allen Komponenten zu aktivieren, das Panel mit Invalidate/Update/Repaint auf einmal zu zeichnen, ParentBackground und FullRepaint zu deaktivieren, DisableAlignment vor dem Anzeigen auszuführen, sowie einige andere Tipps - alles ohne irgendeine Veränderung.
Panel1.Left:=0;
Panel1.Top:=0; Panel1.Visible:=True; Auf meinem Entwicklungsrechner ist das Problem nur schwierig zu erkennen, da dieser anscheinend zu schnell ist. Allerdings besteht das Problem auch ohne Verwendung von VCL Styles, es ist aber nur per Zeitlupe zu erkennen. Ich habe keine weiteren Ideen, wie man das Problem lösen könnte und wäre über jede Hilfe dankbar. Schöne Grüße NielsB |
AW: Panel mit vielen Buttons baut sich langsam auf
Verstehe ich das korrekt, daß auch ohne Styles auf dem Zielsystem der Aufbau zu langsam ist? Ansonsten liegt das eben in der Natur der Sache: Betriebssystemkomponenten werden beim "stylen" nachträglich übertüncht. Ich würde darauf verzichten. Früher galt mal die Maxime, daß der Anwender seinem System mit Absicht das aktuelle Aussehen gegeben hat, da muß eine Anwendung nicht wie ein Fremdkörper hervorstechen. Zumal dadurch nicht immer die Bedienbarkeit erhöht wird.
Sherlock |
AW: Panel mit vielen Buttons baut sich langsam auf
Die Atoms haben eine sehr inperformante GPU. Wenn Du dann auch noch ein sehr alte Treiberversion hast ist eher zufall das man überhaupt was auf den Bildschirm sieht (um es überspitzt auszudrücken).
Versuch mal auf jeden Fall einen aktuellen Treiber zu bekommen. |
AW: Panel mit vielen Buttons baut sich langsam auf
Das ist richtig. Vielleicht verstehe ich hier etwas generell falsch, aber Übergänge zwischen Formularen passieren auch nicht "in einem Frame", sondern sind immer partielle Änderungen am Bild. Je weniger Objekte auf dem Bildschirm sind, desto weniger merklich ist der Übergang. Ich würde allerdings gerne einen sauberen Übergang haben, sodass alle Veränderungen erst zwischengespeichert werden und das Resultat dann fertig angezeigt wird.
Die Styles machen das Problem nur deutlicher sichtbar, aber es besteht auch, wenn ich ein neues Projekt aus nur einem Frame, einem Panel und einigen Buttons besteht, ohne Einbindung von Styles. |
AW: Panel mit vielen Buttons baut sich langsam auf
Hast du schon mal die Treiber kontrolliert?
Mit fehlerhaften Treibern habe ich schon die tollsten Dinge erlegt (z.B. wurde außerhalb des Formulars gezeichnet an eine Stelle die überhaupt nicht mehr zum Programm gehört) |
AW: Panel mit vielen Buttons baut sich langsam auf
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Code:
oder
Panel1.Left:= Screen.Width + 1; // Sollte natürlich das Formular sein auf dem das Panel liegt.
Panel1.Top:=0; Panel1.Visible:=True; Panel1.Left:= 0;
Code:
oder ein Kombination aus beiden.
SendMessage(Panel1.Handle, WM_SETREDRAW, 0, 0);
try Panel1.Left:= 0; Panel1.Top:=0; Panel1.Visible:=True; 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; cu |
AW: Panel mit vielen Buttons baut sich langsam auf
Hallo...:P
Kannst du mal das Formular zeigen? Mich würde mal interessieren warum ein Formular 60 Buttons benötigt. :wink: |
AW: Panel mit vielen Buttons baut sich langsam auf
60 Buttons (die aufgehübscht werden sollen) auf einem "schwachem" Rechner - es riecht nach POS oder ählichem ;)
|
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?
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Die einzige Möglichkeit, das Problem so unauffällig wie möglich zu gestalten, sind wohl die genannten Möglichkeiten, die Anzahl an Komponenten zu reduzieren. Keine optimale Lösung, weil die Anwendung auch an anderen Stellen hakt, aber die Hardware steht leider schon fest... |
AW: Panel mit vielen Buttons baut sich langsam auf
Kannst du eine Dummy-Anwendung mit dem zentralen Problem erstellung und Exe + Quellcode bereitstellen.
So können wir das selbst compilieren bzw. auf ebenfalls "hyperschnellen" Atomrechnern ausprobieren. |
AW: Panel mit vielen Buttons baut sich langsam auf
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, hier mein Testprojekt. In Unit1 habe ich mit der ListBox experimentiert, das kann ignoriert werden. Ich habe einen Style eingestellt, um den Bildaufbau wirklich sichtbar zu verlangsamen. Der Aufbau findet von Rechts nach Links statt, als ob eine Schleife über jede Komponente laufen würde...
|
AW: Panel mit vielen Buttons baut sich langsam auf
Ein paar Mutige scheinen sich ja dran versucht zu haben, hat sich dabei das Problem nicht bestätigt oder gab es keine Lösung?
Ich habe also die Wahl, das neue Design zu streichen und ggf. zu versuchen, mit Windows Themes vom Win 98 Style wegzukommen oder überall, wo die Hardware nicht reicht, die Funktionalität mit möglichst wenig Komponenten nachzubauen, sehe ich das richtig? |
AW: Panel mit vielen Buttons baut sich langsam auf
Keine Probleme hier. Aber ich verstehe immer noch nicht, warum du die Schaltflächen nicht durch Listboxen oder Checklistboxen ersetzen kannst.
|
AW: Panel mit vielen Buttons baut sich langsam auf
Natürlich kann ich das, aber wie gesagt, das ist nicht das einzige Formular, das Probleme macht. Da wäre mir eine Checkbox, die den Bildaufbau verzögert, bis er vollständig 'durchgerechnet' wurde lieber, aber anscheinend ist das leider nicht möglich.
|
AW: Panel mit vielen Buttons baut sich langsam auf
Eine CheckBox nimmt eine Benutzer-Auswahl (Ja,Nein) entgegen - mehr nicht.
Wie sollte eine CheckBox jetzt den Aufbau des Bildschirms beeinflussen? :gruebel: |
AW: Panel mit vielen Buttons baut sich langsam auf
Eine Delphi Einstellung, die ich per Checkbox anschalten kann und die alle Probleme löst ;)
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Beim Starten der IDE wurde ich auf jeden Fall vom gleichen "Hacked by AnonCoders" Text wie auf embarcadero.com begrüßt, im besten Fall waren auch gleich ein paar nette Skripte dabei... :roll: |
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Wirklich wichtig ist gerade auf den langsamen Atom Rechnern, dass man unter keinen Umständen die Themes deaktiviert. Sofern die Hardware diese unterstützt, wird dabei die Grafikkarte für vieles benutzt, das ohne Themes die CPU machen muss. Deshalb wird so Leistung frei, die dann dem Programm zur Verfügung stehen. Wir hatten dabei schon extreme Unterschiede in der Richtung. |
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Ich habe mir die Optionen der Windows Themes angeschaut und offenbar kann man dort (mit entsprechend gepatchten Windowsdateien) ähnlich viel erreichen wie bei Delphi, allerdings ohne den Performanceverlust. Außerdem kann man die Optik direkt in Delphi sehen, was ich bei VCL Styles bisher nur zur Laufzeit konnte, man benötigt aber ein zusätzliches Tool, um die msstyles Dateien komfortabel bearbeiten zu können. |
AW: Panel mit vielen Buttons baut sich langsam auf
Nein, ich meine die Windows Themes. Ich habe aber schon oft gesehen, dass die auf solchen schwachen Systemen im Businessumfeld deaktiviert waren, was dann extra noch langsamer ist.
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Sherlock |
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Alter Schwede, ist das'n cooles Formular. Ganz offensichtlich darf man dafür auch etwas bezahlen wenn man möchte!!! @NielsB: Hast du mal darüber nachgedacht mit allen Verantwortlichen zusammen zu überlegen, ob es nicht besser ist das Schrottprogramm in die Tonne zu hauen und lieber ein neues Programm zu schreiben? Jeder schreibt genau auf was er von dem Programm erwartet und was es können muß und dann baut man ein sauberes, intelligentes Programm, daß für alle zukünftigen Dinge auch ausgerüstet und vorbereitet ist. Ich würde keine Sekunde in so ein Programm stecken... Also die Beschreibung und die vielen durchnumerierten Buttons sprechen eine deutliche Sprache... Davon mal abgesehen: Ich hab' z. B. Windows 7 (32bit Sp1) schon auf Rechnern installiert die weniger als 500 MB RAM hatten. Nach der Installation war Null MB RAM übrig. Dann hab' ich die klassische Oberfläche eingestellt und die Aufgabenplanung und die Dienste komplett entrümpelt und danach hatte der Rechner wieder 200 MB freien RAM. Das Ding lief danach total stabil. Entscheidend ist, dass man den kleinen Rechner für einfache Aufgaben problemlos einsetzen konnte und das war keine HighEnd-Installation. 2/3 der Dienste sind für normale Aufgaben und Benutzer völlig wertlos und nur für Systemadministratoren interessant. Systemadmins werden allerdings wohl kaum einen Server mit 'ner normalen Windows-Version bestücken, falls sie überhaupt Windows einsetzen würden... Weiterhin viel Spass und gute Nerven... |
AW: Panel mit vielen Buttons baut sich langsam auf
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
wenn du keine Angst vor fremden Echsen hast, dann kannst du ja mal diese hier ausprobieren.. Die hab' ich mit D7 gebaut und sie erzeugt bei mir 171 Buttons bis der Bildschirm voll ist. Das sind bei mir (W7 Sp1 x64) nur 1 MB im RAM und auf dem ältesten Rechner (P4 FirstVersion) mit XP x86 ungefähr 2,3 MB im RAM (96 Buttons).... (bei einem Klick auf den Button...) Das ist ja fast nichts... drollig... hatte bis jetzt noch nie viele Buttons in Gebrauch... Alles baut sich sauber auf so wie es in der For-Schleife angedacht ist....
Delphi-Quellcode:
Vielleicht bringt der Vergleich ja was, vielleicht auch nicht.... probieren geht über studieren...
Unit uFullScreenButton;
Interface Uses Windows, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls; Type TForm1 = class(TForm) Panel1 : TPanel; Label1 : TLabel; Button1: TButton; Procedure FormCreate (Sender: TObject); Procedure Button1Click (Sender: TObject); End; VAR Form1: TForm1; Implementation {$R *.dfm} Procedure TForm1.FormCreate(Sender: TObject); Begin Self.DoubleBuffered := True; Panel1.DoubleBuffered:= True; Self.SetBounds(0, 0, Screen.WorkAreaWidth, Screen.WorkAreaHeight); Panel1.SetBounds(0, 85, (Self.ClientWidth), (Self.ClientHeight-85)); Label1.Caption:= 'LOADING...'; End; 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 := 0; myTop := 0; myLeft :=-100; Label1.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; End; Label1.Hide; Panel1.Show; End; End. Bis dann... |
AW: Panel mit vielen Buttons baut sich langsam auf
Ich bin ja immer noch der Meinung, dass eine CheckListbox oder ein CheckListview das Kontrol der Wahl wäre, wenn mehrere Buttons ausgewählt werden können für eine Operation. Eventuell sollte sich der Threaderstelle sich diese Controls mal angucken. Obwohl ein Klick auf eine Schaltfläche löst eine Aktion aus, da würde sich eher eine normale Listbox anbieten. Leider habe ich immer noch nicht verstanden, warum das nicht möglich ist. Auch eine Listbox kann man dynamisch befüllen.
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Wenn im System (Server 2008/2012) das Theming abgeschaltet ist, dann sind auch die neuen CommonControls v6.0 deaktiviert. (zumindestens im Delphi) Sowas wie den TTaskDialog kann man dann vergessen (die gehen einfach nicht auf und es gibt auch keine Fehlermeldung) und auch die "neuen" FileOpenDialoge fallen auf die alte API zurück. |
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
|
AW: Panel mit vielen Buttons baut sich langsam auf
Zitat:
Zitat:
Das ist vollkommen richtig und führt vermutlich auch zum Ziel. Allerdings gibt es die Probleme, die in diesem Beispiel durch die große Anzahl an Komponenten besonders sichtbar ist, auch in den anderen Formularen und wie oben gezeigt, auch auf moderner Hardware. Ich habe bisher noch keine definitive Antwort gefunden, ob das aufgrund von Delphi/Windows/Hardware-Limitierungen nicht möglich ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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