Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

NielsB 4. Mär 2016 09:40

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:
Panel1.Left:=0;
Panel1.Top:=0;
Panel1.Visible:=True;
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.
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

Sherlock 4. Mär 2016 12:15

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

Bernhard Geyer 4. Mär 2016 12:52

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.

NielsB 4. Mär 2016 13:21

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.

Bernhard Geyer 4. Mär 2016 13:24

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)

uligerhardt 4. Mär 2016 13:26

AW: Panel mit vielen Buttons baut sich langsam auf
 
Vielleicht hilft auch MSDN-Library durchsuchenDeferWindowPos.
Edit: Oder WM_SETREDRAW+RedrawWindow.

NielsB 4. Mär 2016 13:41

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

Zitat von Bernhard Geyer (Beitrag 1332074)
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)

Ich werde morgen nachschauen, habe ich gerade keine Möglichkeit zu. Auf meinem Entwicklungspc erscheinen die Buttons in eine Art 'Welle' von rechts nach links, wenn auch sehr schnell.

zagota 4. Mär 2016 13:45

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

Zitat von NielsB (Beitrag 1332045)
Code:
Panel1.Left:=0;
Panel1.Top:=0;
Panel1.Visible:=True;

Schon versucht?
Code:
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;
oder
Code:
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;
oder ein Kombination aus beiden.

cu

haentschman 4. Mär 2016 14:43

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:

Sir Rufo 4. Mär 2016 15:10

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 ;)

jaenicke 4. Mär 2016 15:50

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.

bra 4. Mär 2016 15:53

AW: Panel mit vielen Buttons baut sich langsam auf
 
Ich stelle mir das gerade so ähnlich wie das hier vor:

http://www.bulkrenameutility.co.uk/Screenshots.php

:lol:

NielsB 4. Mär 2016 17:05

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 ;)

Luckie 4. Mär 2016 17:24

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.

NielsB 4. Mär 2016 18:15

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.

ibp 4. Mär 2016 18:20

AW: Panel mit vielen Buttons baut sich langsam auf
 
TTreeView ist dein Freund

NielsB 5. Mär 2016 10:52

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: Video

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

Sir Rufo 5. Mär 2016 11:38

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).

jaenicke 5. Mär 2016 14:32

AW: Panel mit vielen Buttons baut sich langsam auf
 
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.

Der schöne Günther 5. Mär 2016 16:01

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?

NielsB 5. Mär 2016 17:20

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

Zitat von Der schöne Günther (Beitrag 1332171)
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?

Ändert leider nichts, aber der komplette Aufbau innerhalb eines Frames scheint aufgrund von Software oder Hardwarelimitierungen nicht möglich zu sein, zumindest habe ich bisher noch nichts gefunden, das irgendeinen Effekt auf den Bildaufbau hatte.
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...

Bernhard Geyer 5. Mär 2016 17:26

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.

NielsB 5. Mär 2016 17:47

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...

NielsB 13. Mär 2016 00:16

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?

Luckie 13. Mär 2016 06:17

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.

NielsB 13. Mär 2016 11:54

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.

Sir Rufo 13. Mär 2016 12:10

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:

NielsB 13. Mär 2016 12:16

AW: Panel mit vielen Buttons baut sich langsam auf
 
Eine Delphi Einstellung, die ich per Checkbox anschalten kann und die alle Probleme löst ;)

uligerhardt 13. Mär 2016 12:41

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

Zitat von NielsB (Beitrag 1332801)
Eine Delphi Einstellung, die ich per Checkbox anschalten kann und die alle Probleme löst ;)

Die ist etwas versteckt, rechts vom "Schreib-mein-Programm"-Button. :mrgreen:

NielsB 13. Mär 2016 12:59

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

Zitat von uligerhardt (Beitrag 1332805)
Zitat:

Zitat von NielsB (Beitrag 1332801)
Eine Delphi Einstellung, die ich per Checkbox anschalten kann und die alle Probleme löst ;)

Die ist etwas versteckt, rechts vom "Schreib-mein-Programm"-Button. :mrgreen:

Naja, besteht denn die Möglichkeit, die nötige Funktionalität selbst zu schreiben? Ich habe bisher nicht herausfinden können, was im Hintergrund passiert, wenn man Visible := True setzt und wie die einzelnen Komponenten gezeichnet werden, bzw. in welcher Reihenfolge. In meinem Beispiel läuft der Bildaufbau von Rechts nach Links relativ wellenartig ab, was man notfalls noch als 'Animation' verkaufen könnte, aber im richtigen Programm erscheinen die Buttons wild über den Bildschirm verteilt.

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:

jaenicke 13. Mär 2016 17:21

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

Zitat von NielsB (Beitrag 1332777)
mit Windows Themes vom Win 98 Style wegzukommen

Wo ich das lese:
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.

NielsB 13. Mär 2016 18:43

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

Zitat von jaenicke (Beitrag 1332841)
Zitat:

Zitat von NielsB (Beitrag 1332777)
mit Windows Themes vom Win 98 Style wegzukommen

Wo ich das lese:
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.

Du meinst damit aber nicht die VCL Styles, oder? Die scheinen nämlich der Ursprung allen Übels zu sein :-D
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.

jaenicke 13. Mär 2016 19:37

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.

Sherlock 16. Mär 2016 12:04

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

Zitat von NielsB (Beitrag 1332843)
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.

Diese Art des "Styling" geht aber auch nur bis zu einer bestimmten Windows Version gut. Spätestens Version 8 dürfte leider dagegen "immun" sein. Ich hatte auch früher mein XP mit einem Apple Skin versehen...aber irgendwann muss man auch mal einsehen, daß das Betriebssystem alles richtig macht. Vor allem, wenn der Anwender sich selbst Farben und eventuell auch Skins konfiguriert hat. Daran sollte man sich anpassen, und nicht andersherum. Freilich ist das in einem Kiosk-System anders. Aber wenn man da mit Performance zu kämpfen hat, dann sollte man eventuell beim Wesentlichen bleiben, und das wäre ein solides Programm mit einer durchdachten GUI. Im Moment will mir ehrlich kein Anwendungsfall ins Hirn, bei dem man 60 Buttons auf einmal brauchen sollte - den man nicht auch eleganter und für den Anwender verständlicher/übersichtlicher lösen kann.

Sherlock

FarAndBeyond 16. Mär 2016 17:18

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

Ich stelle mir das gerade so ähnlich wie das hier vor:
http://www.bulkrenameutility.co.uk/Screenshots.php
Ich glaub' du hast da was falsch verstanden... Das ist eine sehr schöne GUI, die darüberhinaus noch übersichtlich und selbsterklärend ist!
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...

FarAndBeyond 17. Mär 2016 01:29

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:
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.
Vielleicht bringt der Vergleich ja was, vielleicht auch nicht.... probieren geht über studieren...
Bis dann...

Luckie 17. Mär 2016 02:37

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.

himitsu 17. Mär 2016 09:15

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

Zitat von jaenicke (Beitrag 1332847)
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.

Nicht nur das, vor allem via RDP, am Liebsten in einem schwachen Server/Netzwerk.

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.

NielsB 18. Mär 2016 20:43

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

Zitat von FarAndBeyond (Beitrag 1333080)
@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...

Das ist in der Tat schon eine Überlegung gewesen, denn das Programm stammt noch aus Win98 Zeit und wurde bis vor ein paar Jahren von einer einzigen Person entwickelt - dementsprechend sieht auch der Code aus... Über die Jahre hat sich einiges an Funktionalität angesammelt, die in einer Neuentwicklung vorhanden sein müsste. Tendenziell wird der Großteil der Ressourcen aber für das Instandhalten gebraucht, sodass eine Neuentwicklung in nächster Zeit unrealistisch ist.

NielsB 18. Mär 2016 21:32

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

Zitat von FarAndBeyond (Beitrag 1333093)
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....

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. :|

Zitat:

Zitat von Luckie (Beitrag 1333095)
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.


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.
Seite 1 von 2  1 2      

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