Autor |
Beitrag |
galagher
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 08.04.25 16:42
Hallo!
Ich habe ein Programm geschrieben, das beliebige Grafiken (Fotos im jpg-Format, etc.) einliest und diese als Thumbnails darstellt. Beim Scrollen per Scrollbox schmieren die Grafiken jedoch, wenn zB. mehrere hundert davon eingelesen wurden.
Wie kann ich das beheben?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 08.04.25 19:37
Wenn es wirklich gut aussehen soll, würde ich zu Firemonkey raten, zumal dort auch die Funktionalität für Thumbnails usw. schon quasi fertig ist (also resizen in guter Qualität, ...). Und durch die Hardwarebeschleunigung hast du eine schöne flüssige Darstellung.
Die VirtualTrees wären noch eine Variante, damit nur die Bilder gezeichnet werden, die auch angezeigt werden.
Hast du DoubleBuffered aktiv?
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 08.04.25 21:21
jaenicke hat folgendes geschrieben : | Hast du DoubleBuffered aktiv? |
Ja, ist aktiv.
Vorläufige und vielleicht auch endgültige Lösung: Mit ScrollBox1.Invalidate, ScrollBox1.Refresh etc. verhindere ich das Schmieren, nun wird beim Scrollen zwar langsam, dafür aber "sauber" die jeweils nächste "Zeile" Thumbnails dargestellt. Das Ganze ist also ein Performance-Problem, aber immerhin sieht es jetzt wesentlich besser aus.
Ich möchte nicht auf eine andere Komponente umsteigen, da das gesamte Projekt auf meinen TLabeledImages aufgebaut ist.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 09.04.25 14:19
jaenicke hat folgendes geschrieben : | Die VirtualTrees wären noch eine Variante, damit nur die Bilder gezeichnet werden, die auch angezeigt werden. |
Das habe ich mal umgesetzt, und das funktioniert ganz wunderbar, auch mit sehr vielen Bildern. Bei mir ist das eine Liste von Musik-Alben.
Wobei ich auch noch eine Bilder-Cache-Klasse drumherum gebaut habe, damit im OnPaint nicht jedesmal die Datei von der Platte gelesen werden muss. Der Cache hat eine bestimmte Größe (iirc ~150 Thumbnails), und jedes Element darin bekommt einen Zähler, wann es zuletzt benutzt wurde. Wenn der Cache voll ist, wird das am längsten nicht benutzte Bild gelöscht.
Aber wenn eine andere Komponente keine Option ist, dann bringt das natürlich alles nichts. 
_________________ We are, we were and will not be.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 09.04.25 17:31
Gausi hat folgendes geschrieben : | Aber wenn eine andere Komponente keine Option ist, dann bringt das natürlich alles nichts.  |
Ich lese die Original-Grafikdateien ein, skaliere sie (das dauert ein bisschen, ist aber egal), und dann werden sie als Grafiken in je einem zur Laufzeit erzeugten TLabeledImage dargestellt. Sie werden also nur jeweils 1x skaliert, trotzdem ist die TScrollBox unangenehm träge. TJvScrollBox von den JEDI's ist noch langsamer.
Es sind immer alle skalierten Grafiken in der ScrollBox, auch die, die gerade nicht sichtbar sind. Ich denke, das ist es.
Bin etwas ratlos  !
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 09.04.25 19:34
Jetzt ist es besser:
ScrollBox1.VertScrollBar.Increment war falsch gesetzt, und mit ScrollBox1.DoubleBuffered := False werden die Grafiken jetzt "laufend" einzeln angezeigt anstatt ganzer "Zeilen" (je 9 nebeneinander) während des Scrollens.
Mal sehen, was sonst noch geht...
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 10.04.25 08:31
Das Grundproblem wird sein, dass du sehr viele Komponenten mit entsprechendem Overhead hast - dafür ist die VCL wohl nicht ausgelegt.
Vielleicht lässt es sich mit vertretbarem Aufwand wo umbauen, dass du statt einer Scrollbox mit "mehreren hundert" Images nur ein Panel mit einer Scrollbar nutzt? Beim Scrollen bildest du dann das Verhalten der ScrollBox nach, in dem du die "paar Dutzend" Images, die sichtbar sind, mit entsprechend anderen Werten füllst und die Position innerhalb von +/- Height eines Images anpasst?
Natürlich muss man dann auch noch Dinge wie "durchtabben" anpassen - vielleicht wäre ja eine eigene Komponente TLabeledImageContainer auf Basis von TPanel und TScrollbar ein Ansatz?
_________________ We are, we were and will not be.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.04.25 17:00
Gausi hat folgendes geschrieben : | Vielleicht lässt es sich mit vertretbarem Aufwand wo umbauen, dass du statt einer Scrollbox mit "mehreren hundert" Images nur ein Panel mit einer Scrollbar nutzt? |
Das würde ich sicher hinkriegen, dabei würde allerdings der Scroll-Effekt der Grafiken verloren gehen.
Da man ein oder mehrere Grafiken per Maus an eine andere Stelle ziehen und dort einfügen kann, müsste ich das so nachbauen, dass dabei die Grafiken nach oben oder unten scrollen, je nachdem, wie man die Maus bewegt. Will ich eher nicht machen. 
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 10.04.25 17:20
Ah, du hast da noch eine Drag&Drop-Funktionalität, mit der du die Images sortieren kannst?
Joah, dann wäre mein Vorschlag noch etwas mehr Aufwand ... 
_________________ We are, we were and will not be.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.04.25 18:55
Gausi hat folgendes geschrieben : | Ah, du hast da noch eine Drag&Drop-Funktionalität, mit der du die Images sortieren kannst? |
Ja, und man kann sie aus der Ansicht entfernen, mehrere auf einmal an den Anfang, ans Ende oder an eine beliebige Position umreihen, 2 Bilder vertauschen usw.
Auch kann man Grafiken zB. vom Explorer in die ScrollBox ziehen.
Ich benutze das Programm zum Sortieren, Benennen und Speichern von Fotos.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|