Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 08.04.25 21:21 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 09.04.25 14:19 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 09.04.25 17:31 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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 :nixweiss: !

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.04.25 17:00 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 ... :P

_________________
We are, we were and will not be.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 10.04.25 18:55 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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!