Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichnen (https://www.delphipraxis.net/206324-virtualstringtree-shgetfileinfo-haengt-programm-auf-canvas-erlaubt-kein-zeichnen.html)

DieDolly 11. Dez 2020 12:05

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Auch wenn ich DestroyIcon(Info.hIcon); verwende, dasselbe Problem. Komische Fehlermeldungen und ein Zusammenbruch des Programms.

Aviator 11. Dez 2020 12:10

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Zitat:

Zitat von venice2 (Beitrag 1478937)
Zitat:

Wie man da mit der ImageList arbeiten soll, ist für mich immer noch ein großes Geheimnis.
Kann man nicht weil du den Index vom ImageList mit nichts vergleichen kannst.

Das wäre sowieso das größte NoGo. Daten und Oberfläche miteinander verbinden ... :roll:

In dem Fall wäre ein
Delphi-Quellcode:
TDictionary<string, Integer>
eine Möglichkeit. Die Dateiendung wird als Key verwendet und als Value kommt der ImageIndex der ImageList heraus. Da braucht man keinen Node Index oder sonst etwas.

EDIT: Hat den Vorteil, dass man auf ein Image prinzipiell mehrfach verweisen könnte. Dann müsste man eben nur beim Erstellen des Dictionarys wissen, welche Icons identisch sind.

DieDolly 11. Dez 2020 12:20

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Gibt es dazu irgendwo Beispiele? Ich kann mir darunter überhaupt nichts vorstellen leider.
Ich hab das immer mit SHGetFileInfo gemacht weil ich dachte das sei richtig.

Und das hier im FormCreate scheint ja mal für absolut gar nichts sinnvoll zu sein
Delphi-Quellcode:
 SmallImages := TImageList.Create(Self);
 SmallImages.Handle := SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
 SmallImages.ShareImages := True;
 VST.Images := SmallImages;

venice2 11. Dez 2020 12:27

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Zitat:

Das wäre sowieso das größte NoGo. Daten und Oberfläche miteinander verbinden ..
Dir ist aber schon klar das ein ImageList keine Oberfläche hat. Oder?
Und wo ist das Problem wenn ich den Index einer Imagelist mit einer Node vergleichen will?

Selbst den Tag auch wenn man ihn belegen würde kann man fast mit nichts vergleichen.
Welcher Sinn steckt dahinter?

Zitat:

Und das hier im FormCreate scheint ja mal für absolut gar nichts sinnvoll zu sein
Richtig erkannt.

DieDolly 11. Dez 2020 12:34

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Ich gebe auf mein VST wird niemals Bilder für die Dateien anzeigen können ohne Fehler zu werfen.

Aviator 11. Dez 2020 13:05

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Zitat:

Zitat von venice2 (Beitrag 1478944)
Zitat:

Das wäre sowieso das größte NoGo. Daten und Oberfläche miteinander verbinden ..
Dir ist aber schon klar das ein ImageList keine Oberfläche hat. Oder?
Und wo ist das Problem wenn ich den Index einer Imagelist mit einer Node vergleichen will?

Die ImageList nicht, aber der VST. Sortiere doch mal die Nodes im VST. Dann bekommst du plötzlich ganz andere Icons für die unterschiedlichen Dateitypen angezeigt. Würdest du ein Interface dazwischenbauen (in dem Fall evtl. in Form eines TDictionary<string, Integer>) und die zur Node gehörigen Daten damit vergleichen, dann wäre das Problem damit behoben.

Zitat:

Zitat von DieDolly (Beitrag 1478943)
Gibt es dazu irgendwo Beispiele? Ich kann mir darunter überhaupt nichts vorstellen leider.
Ich hab das immer mit SHGetFileInfo gemacht weil ich dachte das sei richtig.

SHGetFileInfo muss an der Stelle ja nicht falsch bzw. wird evtl. sogar die einzig sinnvolle Lösung sein. Nur müsstest du das ggf. in einen Thread auslagern oder zumindest das Abrufen der Icons nicht beim Zeichnen jeder Node des Trees ausführen. Die Zeichen Events sollten maximal auf Daten zugreifen, die die Anwendung ohne große Berechnung zur Verfügung stellt. Jeder weitere Schritt verlangsamt das Zeichnen jeder einzelnen Node (und Column) u.U. enorm.

Die Daten werden auf dem Laufwerk abgerufen und in einer internen Struktur gespeichert. Erst wenn das alles geschehen ist, wird der VST mit RootNodeCount gefüllt.

Zitat:

Zitat von DieDolly (Beitrag 1478945)
Ich gebe auf mein VST wird niemals Bilder für die Dateien anzeigen können ohne Fehler zu werfen.

Bitte nicht. Mach dir daraus lieber mehrere kleine Teilprojekte wie z.B. das effiziente Abrufen von Icons je nach Dateityp und das Füllen des Trees anhand von Verzeichnisinformationen. Wenn das alles gut, sauber und effizient läuft, dann kannst du das kombinieren.

Eventuell kannst du dir ja mal die ShellTreeView Komponente anschauen und dir daran ein Beispiel nehmen wie dort die Bilddaten abgerufen werden.

DieDolly 11. Dez 2020 13:17

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Zitat:

SHGetFileInfo muss an der Stelle ja nicht falsch bzw. wird evtl. sogar die einzig sinnvolle Lösung sein. Nur müsstest du das ggf. in einen Thread auslagern oder zumindest das Abrufen der Icons nicht beim Zeichnen jeder Node des Trees ausführen. Die Zeichen Events sollten maximal auf Daten zugreifen, die die Anwendung ohne große Berechnung zur Verfügung stellt. Jeder weitere Schritt verlangsamt das Zeichnen jeder einzelnen Node (und Column) u.U. enorm.
Das SHGetFileInfo habe ich jetzt im InitNode. Selbst mit einem TThread Queue drumherum bringt das nichts. Canvas erlaubt kein Zeichnen kommt trotzdem irgendwann.

Jumpy 11. Dez 2020 16:29

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Lass uns das doch mal Schritt für Schritt planen:

Du hast eine ImageList, im Create erzeugt, erst mal leer
Du hast ein Dictionary wie oben beschrieben von aviator(#42), erst mal leer, im Create erzeugt

Dann im InitNode:
Prüfe für die Dateiendung, ob es schon einen Eintrag im Dictionary gibt:
-falls ja weise die dazu im Dictionary gespeicherte Zahl dem ImageIndex des Treenodes zu
-falls nein lade das Icon per SHGetFileInfo und pack es in die ImageList, packe den so entstehenden neuen ItemIndex (Zahl) des Icons in der ImageList zusammen mit der Dateiendung in das Dictionary und natürlich in dem ItemIndex des Treenodes

Jetzt musst du nur noch beim Zeichnen des Nodes im tree, das du ja selber machst (laut anderem Thread hier in der DP) gucken, dass das Icon aus der ImageList, von dem du ja den Index hast, gezeichnet wird.

Leider hab ich vom VST keine Ahnung, sondern das scheint mir anhand der 5 Seiten hier im thread, das zu sein was nötig ist. Wenn das quatsch ist veresst es einfach.

DieDolly 11. Dez 2020 17:08

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Ich versuche das heute Abend mal umzusetzen. Ich kann noch nicht sagen wann, aber ich melde mich dann hier wieder.

Aviator 11. Dez 2020 17:34

AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
 
Zitat:

Zitat von Jumpy (Beitrag 1478971)
Leider hab ich vom VST keine Ahnung, sondern das scheint mir anhand der 5 Seiten hier im thread, das zu sein was nötig ist. Wenn das quatsch ist veresst es einfach.

Die Zusammenfassung klingt eigentlich ziemlich genau nach dem, was ich vorgeschlagen habe.

Also alles in Ordnung. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 Uhr.
Seite 5 von 6   « Erste     345 6      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz