TImage als Lade"animation" halbtransparent über Listview

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
lazarusjulian
Beiträge: 39
Registriert: Mi 6. Jan 2016, 21:45

TImage als Lade"animation" halbtransparent über Listview

Beitrag von lazarusjulian »

Hallo ihr Lieben,
wenn das Laden der Inhalte meiner Listview einen kurzem Moment dauert, möchte ich die Komponente "ausgrauen" siehe angehängtes Bild.
Wie kann ich das erreichen? Ich suche seit Stunden eine Möglichkeit, scheinbar ist es gar nicht möglich das TImage über der Listview einzublenden.
Ich bin für Alternativvorschläge dankbar. Ich dachte, ich spar mir eine richtige Animation und mach es einfach, nun ist es weit komplizierter als ich dachte.

Bild

Gruß Julian

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TImage als Lade"animation" halbtransparent über Listview

Beitrag von Warf »

Mit boardmitteln geht das grundsätzlich erst mal nicht, denn Windows forms (womit lazarus ja kompatibel sein muss) unterstützten afaik nur volle transparenz, oder gar keine (also sowas wie 30% durchsichtig kannst du da vergessen). Was es aber gibt ist opacity for Forms.
Damit hast du verschiedene Möglichkeiten:
1. Selbst zeichnen: Mach einen Screenshot deiner form (sollte recht einfach sein, Form1.Canvas.CopyRect oder so), lege selbst einen dunkel filter drüber und benutz das als bild für das Image
2. Halbtransparente form drüberlegen: Erstelle eine zweite Form, setze dabei die Opacity auf den gewünschten wert, und sorge in den Events der ursprungsform dazu das immer wenn diese bewegt wird, etc. die overlay form angepast wird

1 ist einfacher zu programmieren, 2 ist einfacher effizient zu machen (die naiven ansätze für dunkelfilter sind recht lahm)
Zu guter letzt noch schau dir mal andere Komponenten an, mir kommt da direkt BGRA in den sinn, eventuell können die was du suchst, und falls nicht sollten die echt schnelle algorithmen für bildbearbeitung haben, was den filter zum verdunkeln effizienter gestalten könnte

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: TImage als Lade"animation" halbtransparent über Listview

Beitrag von Timm Thaler »

Erstmal ist die Frage: Was dauert am Laden so lange? Da gibt es verschiedene Möglichkeiten, die man entsprechend behandeln muss.

1. Warten auf das OS. Anscheinend werden da Laufwerke eingelesen, das kann schonmal dauern. Damit hängt es von der Programmgestaltung ab, ob das Programm in dieser Zeit steht, bis das Ergebnis vom OS geliefert wird, oder ob das Programm weiterhin ausgeführt wird. Nur im zweiteren Fall kann es überhaupt Änderungen an der GUI vornehmen.

Abhilfe: Die Anfrage ans OS in eine Art Warteschlange stellen und das Programm weitermachen lassen. Kommt eine Rückmeldung, das Ergebnis anzeigen.

2. Das Ermitteln der darzustellenden Inhalte, sprich Einlesen der Verzeichnisse. Ist das Programm damit beschäftigt, kann es zwischenzeitlich keine anderen Aktionen wie Auffrischen der Arbeitsfläche durchführen. Änderungen an der GUI werden also auch nicht ausgeführt.

Abhilfe: Das Ermitteln der Inhalte in einen eigenen Thread auslagern oder das Ermitteln der Inhalte selbst immer wieder unterbrechen, um die GUI aufzufrischen.

3. Das Füllen des Listview mit den bereits ermittelten Inhalten. Dabei erzeugt jeder Eintrag eine Aufforderung, das Listview neu zu zeichnen.

Abhilfe: Das kann man deutlich beschleunigen, wenn man das Listview vor dem Füllen auf unsichtbar (Visible := false) stellt und danach wieder auf sichtbar. Währenddessen kannst Du an dieser Stelle ein Image oder eine Paintbox mit Deinem Ladebild einblenden.

lazarusjulian
Beiträge: 39
Registriert: Mi 6. Jan 2016, 21:45

Re: TImage als Lade"animation" halbtransparent über Listview

Beitrag von lazarusjulian »

Ich danke euch beiden sehr!

@Timm Thaler, tatsächlich bestand mein Problem als erstes darin, das TImage überhaupt an der Stelle des Listviews einzublenden. Witzigerweise kam ich nun auch auf die Idee, das Listview zu verstecken um mein TImage "einzublenden".
Das ist zwar nicht meine gewünschte Lösung, aber eine akzeptable.

@Warf: Vielen Dank für deine Ideen! Besonders die zweite Variante mit der halbtransparenten Form finde ich sehr interessant. Wenn mich das nicht locker lässt, werde ich es implementieren.

cheers, Julian :)

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TImage als Lade"animation" halbtransparent über Listview

Beitrag von Socke »

Timm Thaler hat geschrieben:3. Das Füllen des Listview mit den bereits ermittelten Inhalten. Dabei erzeugt jeder Eintrag eine Aufforderung, das Listview neu zu zeichnen.

Abhilfe: Das kann man deutlich beschleunigen, wenn man das Listview vor dem Füllen auf unsichtbar (Visible := false) stellt und danach wieder auf sichtbar. Währenddessen kannst Du an dieser Stelle ein Image oder eine Paintbox mit Deinem Ladebild einblenden.

Weniger rechenintensiv als das Ein- und Ausblenden (und damit ggf. neue Groößenberechnungen etc.) sollten die Funktionen Listview.Items.BeginUpdate und ListView.Items.EndUpdate sein. Siehe auch https://www.askingbox.com/question/delp ... -endupdate
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten