![]() |
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.
|
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
In dem Fall wäre ein
Delphi-Quellcode:
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.
TDictionary<string, Integer>
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. |
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; |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
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:
|
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.
|
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
Zitat:
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:
Eventuell kannst du dir ja mal die ShellTreeView Komponente anschauen und dir daran ein Beispiel nehmen wie dort die Bilddaten abgerufen werden. |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
|
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. |
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.
|
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
Also alles in Ordnung. :thumb: |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Ungefähr so?
FormCreate (Deklration und FormDestroy spare ich mir hier)
Delphi-Quellcode:
VSTInitNode
IconDictionary := TDictionary<string, Integer>.Create;
Delphi-Quellcode:
VSTGetImageIndex
var
Info: TSHFileInfo; FileExtension: string; begin Node.SetData<TTreeData>(TreeDataKlassen[Node.Index]); FileExtension := ExtractFileExt(TreeDataKlassen[Node^.Index].PfadSpalte1); if IconDictionary.ContainsKey(FileExtension) then begin TreeDataKlassen[Node^.Index].IconIndexSpalte1 := IconDictionary.Items[FileExtension]; end else begin SHGetFileInfo(PChar(TreeDataKlassen[Node^.Index].PfadSpalte1), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON); ImageList_AddIcon(SmallImages.Handle, Info.hIcon); TreeDataKlassen[Node^.Index].IconIndexSpalte1 := SmallImages.Count - 1; IconDictionary.Add(FileExtension, SmallImages.Count - 1); end; end;
Delphi-Quellcode:
if Kind in [ikNormal, ikSelected] then
begin ImageIndex := TreeDataKlassen[Node^.Index].IconIndexSpalte1; end; |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Das sieht soweit ich das überblicken kann recht gut aus. Aber wieso führst du immer noch das SHGetFileInfo im InitNode aus? Mach das doch auch an der Stelle, an der du deine TreeDataKlassen Liste füllst.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz