TImage als Lade"animation" halbtransparent über Listview

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

TImage als Lade"animation" halbtransparent über Listview

Beitragvon lazarusjulian » 7. Jan 2019, 16:31 TImage als Lade"animation" halbtransparent über Listview

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
lazarusjulian
 
Beiträge: 36
Registriert: 6. Jan 2016, 21:45

Beitragvon Warf » 7. Jan 2019, 19:27 Re: TImage als Lade"animation" halbtransparent über Listview

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
Warf
 
Beiträge: 1128
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Timm Thaler » 7. Jan 2019, 21:07 Re: TImage als Lade"animation" halbtransparent über Listview

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.
Timm Thaler
 
Beiträge: 938
Registriert: 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
Nach oben

Beitragvon lazarusjulian » 7. Jan 2019, 21:30 Re: TImage als Lade"animation" halbtransparent über Listview

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 :)
lazarusjulian
 
Beiträge: 36
Registriert: 6. Jan 2016, 21:45

Beitragvon Socke » 8. Jan 2019, 10:35 Re: TImage als Lade"animation" halbtransparent über Listview

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
Socke
Lazarusforum e. V.
 
Beiträge: 2607
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

• Themenende •

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried