Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#35

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

  Alt 10. Dez 2020, 22:42
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?
Nun bei dem hier.. bekommst du ja nur ein festes Icon oder?
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:
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;
in create

Delphi-Quellcode:
   

   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;
Du kannst das Hicon noch freigeben nach FreeAndNil(Icon)
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.

Geändert von venice2 (14. Dez 2020 um 15:46 Uhr)
  Mit Zitat antworten Zitat