![]() |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
Ich sagte aber schon woran es liegt das Hicon wird nicht freigegeben. Und einiges fehlt noch. Ich kann hier 10000 Einträge laden ohne das irgendein Problem beim zeichnen hier auftritt. |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
|
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
preview.. 40566 Dateien scrolle ich ohne Probleme.
Kein Abstürze oder dergleichen. Mit einer ImageList ![]() |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Kannst du mir zeigen, wie du das umgesetzt hast?
Hat jede Datei ein festes Icon oder das was zur Datei dazugehört und dynamisch bestimmt? |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
Delphi-Quellcode:
SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
Und zwar das des Laufwerks. Das liegt dran weil du keine Datei zum auswerten vorgibst. Dann verwendest du die falsche Funktion Du muss dafür jedoch noch Vcl.ImgList in den uses hinzufügen. Nicht VSTGetImageIndex sondern VSTGetImageIndexEx
Delphi-Quellcode:
in create
procedure TForm1.VSTGetImageIndexEx(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex; var ImageList: TCustomImageList); var Info: TSHFileInfo; begin if (not(Column in [0, 1])) or (not Assigned(TreeDataKlassen)) then Exit; if Kind in [ikNormal, ikSelected] then begin ImageIndex := TreeDataKlassen[Node^.Index].IconIndexSpalte1; // Den aktuellen Index der Node end; end;
Delphi-Quellcode:
Du kannst das Hicon noch freigeben nach FreeAndNil(Icon)SmallImages := TImageList.Create(Self); SmallImages.ShareImages := True; VST.Images := SmallImages; VST.Images.ColorDepth := cd32Bit; // Unbedingt wichtig damit du keinen schwarzen Hintergrund bei den Icons hast VST.Images.DrawingStyle := dsTransparent; // Transparenz einschalten // ********* TreeDataKlassen.Add(TreeData); ZeroMemory(@Info, SizeOf(TSHFileInfo)); // Speicher bereinigen SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON); //Icon Holen if Info.hIcon <> 0 then begin Icon := TIcon.Create; Icon.Handle := Info.hIcon; VST.Images.AddIcon(Icon); // VST.Images = SmallImages FreeAndNil(Icon); end;
Delphi-Quellcode:
DestroyIcon(Info.hIcon);
glaube aber nicht das dass nötig ist weil TIcon ja nach der Übergabe der Eigentümer des handle ist und es auch frei gibt bei Free. Ich hoffe du kommst klar. teste es mit deinem minimalen Sample. Dein Projekt zurück.. wenn es hilft gut wenn nicht ab in die Tonne. Siehe meine Kommentare im code Habe genug mit dem Kram rum gespielt. Canvas erlaubt das zeichnen nun wieder sogar mit Icons Meine Meinung VirtualStringTree ist einfach nur müll es ist nicht möglich an den Index der Node zu kommen. So wie du das gerne möchtest ist es nicht möglich. |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
Ich weiß noch immer nicht, wie ich SHGetFileInfo richtig anwende, sodass ich jeweils das Icon habe, was zur Datei gehört. Kommt das einfach in VSTGetImageIndexEx? Dann hab ich ja wieder die Ruckler und Aussetzer. |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
@Dolly: Evtl. hilft dir das, wenn nicht war es ein Versuch :)
So mache ich es in Lazarus (ohne ):
Delphi-Quellcode:
So habe ich es vorher in Delphi gemacht:
LargeIco, SmallIco : hIcon;
... ExtractIconEx(PChar(Pfad\Datei.exe), 0, LargeIco, SmallIco, 1); Icon.Handle := LargeIco; Icon.Transparent := True; ToolI.Picture.Icon := Icon;
Delphi-Quellcode:
icon : TIcon;
Filter : word; ... Icon := TIcon.Create; try Icon.Handle:=ExtractAssociatedIcon(hInstance, PChar(ToolE.Text), Filter); ToolI.Picture.Icon := icon; finally icon.Free; end; |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Zitat:
![]() Ich würde in dem Fall evtl. einen IconCache anlegen und dem beim Erstellen der Dateiliste füllen. Beim Zeichnen in OnGetImageIndex musst du dann nur noch den ImageIndex angeben. Kommt ein Dateityp hinzu der noch nicht in deinem IconCache enthalten ist, dann wird der hinzugefügt. Beim Zeichnen im Tree kannst du evtl. noch ein Fallback einbauen, dass ein Standardicon angezeigt wird, wenn der Thread Aufruf von SHGetFileInfo noch nicht abgeschlossen ist. Das ist jetzt alles nur Theorie. Ich habe keinen SourceCode hierfür. Aber so sollte es funktionieren. |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Damit habe ich dasselbe Problem wie mit SHGetFileInfo. Alles ruckelt und ist langsam gefolgt von seltsamen Canvas-Fehlern.
IconCache? Klingt irgendwie kompliziert und für mich nicht umsetzbar. Obwohl es interessant klingt. Würde man da einfach alle Dateiendungen die es gibt durchgehen, SHGetFileInfo aufrufen und sich das Info.iIcon holen? Ich habe das jetzt so und es ruckelt ohne Ende.
Delphi-Quellcode:
Wie man da mit der ImageList arbeiten soll, ist für mich immer noch ein großes Geheimnis.
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var Info: TSHFileInfo; begin Node.SetData<TTreeData>(TreeDataKlassen[Node.Index]); if TreeDataKlassen[Node^.Index].IconIndexSpalte1 = -1 then begin SHGetFileInfo(PChar(TreeDataKlassen[Node^.Index].PfadSpalte1), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON); TreeDataKlassen[Node^.Index].IconIndexSpalte1 := Info.iIcon; end; end; procedure TForm1.VSTGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex); begin if (not(Column in [0, 1])) or (not Assigned(TreeDataKlassen)) then Exit; if Kind in [ikNormal, ikSelected] then begin ImageIndex := TreeDataKlassen[Node^.Index].IconIndexSpalte1; end; end; |
AW: VirtualStringTree - SHGetFileInfo hängt Programm auf / Canvas erlaubt kein Zeichn
Delphi-Quellcode:
Es wird immer ruckeln und du wirst immer die Ressourcen Probleme haben, von wegen kann nicht auf das Canvas zeichnen.
SHGetFileInfo(PChar(TreeDataKlassen[Node^.Index].PfadSpalte1), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON);
TreeDataKlassen[Node^.Index].IconIndexSpalte1 := Info.iIcon; Es hat ganz einfach damit zu tun das du sehr viele Handles in den Speicher lädst und sie nicht freigibst. Sorry aber du kannst das auf diese weise niemals in den griff bekommen weil Windows das nicht zulässt. Und bedenke irgendwann ist das Limit an Handles erreicht und dann geht bei dir gar nichts mehr. Und ja es gibt eine Beschränkung wie viele Handles ein Anwendung verwenden darf. Genau wie dein vorheriges SystemImageList := SHGetFileInfo was zur folge hatte das überhaupt keine Icons geladen wurden. Wie dem auch sei.. Tut mir leid für dich aber das ist der falsche weg. Das VirtualStringTree macht es einen aber auch besonders schwer weil man nicht auf den Index jeder Node hin prüfen kann. Deshalb macht eine ImageList auch keinen sinn wenn man sie mit nichts vergleichen kann. Nun ist halt so. Zitat:
Wenn das gehen würde..
Delphi-Quellcode:
If ImageList.ImageIndex = NOde^.Index then
aber selbst das funktioniert nicht! Eine andere Lösung habe ich auch nicht gefunden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 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