AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Panel mit vielen Buttons baut sich langsam auf
Thema durchsuchen
Ansicht
Themen-Optionen

Panel mit vielen Buttons baut sich langsam auf

Ein Thema von NielsB · begonnen am 4. Mär 2016 · letzter Beitrag vom 31. Jan 2019
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.930 Beiträge
 
Delphi 12 Athens
 
#1

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 4. Mär 2016, 15:50
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 4. Mär 2016, 15:53
Ich stelle mir das gerade so ähnlich wie das hier vor:

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

  Mit Zitat antworten Zitat
NielsB

Registriert seit: 4. Mär 2016
17 Beiträge
 
#3

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 4. Mär 2016, 17:05
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 4. Mär 2016, 17:24
Also wenn du schon schreibst: "Liste" Da kommt einem doch sofort eine Listbox oder Combobox in den Sinn.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#5

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 17. Mär 2016, 01:29
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...
Angehängte Dateien
Dateityp: 7z FullScreenButton.7z (148,7 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 17. Mär 2016, 02:37
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NielsB

Registriert seit: 4. Mär 2016
17 Beiträge
 
#7

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 18. Mär 2016, 21:32
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.

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.

Geändert von NielsB (18. Mär 2016 um 21:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.930 Beiträge
 
Delphi 12 Athens
 
#8

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 19. Mär 2016, 12:08
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
FarAndBeyond
(Gast)

n/a Beiträge
 
#9

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 19. Mär 2016, 16:31
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.
  Mit Zitat antworten Zitat
NielsB

Registriert seit: 4. Mär 2016
17 Beiträge
 
#10

AW: Panel mit vielen Buttons baut sich langsam auf

  Alt 25. Mär 2016, 15:59
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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