Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi VirtualStringTree zeigt keine Icons aus System ImageList an (https://www.delphipraxis.net/152062-virtualstringtree-zeigt-keine-icons-aus-system-imagelist.html)

Zacherl 9. Jun 2010 20:04


VirtualStringTree zeigt keine Icons aus System ImageList an
 
Hey,

ich versuche grade verzweifelt Icons aus der System ImageList in meinem VirtualTreeView anzuzeigen. Doch leider bleiben die Symbole hartnäckig leer. :-? Aus meinem Testprojekt:

Delphi-Quellcode:
procedure InitialisiereIcons;
  var SysIL      : HImageList;
      Info       : TSHFileInfo;
      SmallImages : TImageList;
begin
  SmallImages := TImageList.Create(Form1);
  SysIL := SHGetFileInfo('', 0, Info, SizeOf(TSHFileInfo),
           SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  if SysIL <> 0 then
    begin
    SmallImages.Handle := SysIL;
    SmallImages.ShareImages := TRUE;
    virtualstringtree1.Images := SmallImages;
    end;
end;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Newitem : pvirtualnode;
  nodedata: pnodedata;
    Info    : TSHFileInfo;
  I: Integer;
begin
  NewItem := virtualstringtree1.AddChild(nil);
  nodedata := virtualstringtree1.GetNodeData(newitem);
  nodedata^.Caption := 'test.pdf';
  SHGetFileInfo(PChar(nodedata^.Caption)
               ,FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TShFileInfo),
                SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
  nodedata^.ImageIndex := Info.IIcon;
end;
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  NodeData: PNodeData;
begin
  NodeData := VirtualStringTree1.GetNodeData(Node);
  if assigned(nodedata) then
  begin
    imageindex := nodedata^.imageindex;
  end;
end;

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
var
  NodeData: PNodeData;
begin
  NodeData := VirtualStringTree1.GetNodeData(Node);
  if assigned(nodedata) then
  begin
    celltext := nodedata^.Caption;
  end;
end;
Selber Code in einem TListView funktioniert wunderbar :wall:

Viele Grüße
Zacherl

Zacherl 10. Jun 2010 00:37

AW: VirtualStringTree zeigt keine Icons aus System ImageList an
 
Edit: Es klappt auch bei anderen Komponenten, nur nicht beim VST wie es scheint.
Mist jetzt hab ich auch noch ausversehen auf "neuer Beitrag" geklickt -.-

s.h.a.r.k 10. Jun 2010 00:41

AW: VirtualStringTree zeigt keine Icons aus System ImageList an
 
Gibt es bei Icons vielleicht ein spezielles Format? Unter Windows 7 gibts ja irgendwie so "neue" Icons, weiß hier aber leider nicht genau bescheid.

Zacherl 10. Jun 2010 01:39

AW: VirtualStringTree zeigt keine Icons aus System ImageList an
 
Habs grade selbst gelöst :eek: Im GetImageIndex Event gibt es eine Eigenschaft "Kind: TVTImageKind" die kann teilweise den Wert ikOverlay haben. Ist dies der Fall, wird einfach ein weiteres Icon, über das Standardicon drübergemalt.
Meine Routine hat zwar das Icon gesetzt, aber dieses wurde vom Overlay einfach komplett übermalt :wall: Jetzt prüfe ich am Anfang auf "Kind <> ikOverlay", was nun zum gewünschten Ergebnis führt :)

s.h.a.r.k 10. Jun 2010 01:41

AW: VirtualStringTree zeigt keine Icons aus System ImageList an
 
Interessant wäre dann noch zu wissen, was für ein Icon dann als Overlay gezeichnet werden sollte? Du selbst hast ja scheinbar keines angegeben und als Overlay verstehe ich es so, dass das "Grundicon" bestehen bleibt und zusätzlich noch eines darüber gezeichnet wird. Daher wird ein Clear der Zeichenfläche wohl nicht implementiert sein.

Zacherl 10. Jun 2010 01:47

AW: VirtualStringTree zeigt keine Icons aus System ImageList an
 
Also der VST ruft die GetImageIndex Funktion jeweils 2x für jede Node auf. Das erste mal mit ikNormal und das zweite Mal mit ikOverlay. So funktioniert es nun:
Delphi-Quellcode:
procedure TfrmFileManager.vtFileListGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  NodeData: PFileNodeData;
begin
  if (Kind = ikOverlay) or (Column <> 0) then Exit;
  NodeData := vtFileList.GetNodeData(Node);
  if Assigned(NodeData) then
  begin
    ImageIndex := NodeData^.ImageIndex;
  end;
end;
Vorher hatte ich nur die erste Zeile weggelassen. Das Komische ist, dass auch im Overlay Call der ImageIndex korrekt gesetzt wird. Das normale Icon wird dann allerdings komplett mit clWindow übermalt. Mir als Benutzer des VST erscheint dieses Verhalten auch eher ungewollt. Zumindest erkenne ich keine Logik dahinter.

Dezipaitor 10. Jun 2010 20:57

AW: VirtualStringTree zeigt keine Icons aus System ImageList an
 
Wenn du eine Demoanwendung bauen würdest, könnten wir mitknobeln :)
Vielleicht ist es ja ein Bug, dann kannst du es im Forum von VST melden (ist glaub googledocs?)

Zacherl 10. Jun 2010 21:47

AW: VirtualStringTree zeigt keine Icons aus System ImageList an
 
Zitat:

Zitat von Dezipaitor (Beitrag 1027972)
Wenn du eine Demoanwendung bauen würdest, könnten wir mitknobeln :)

Kommt gleich :P Vielleicht ist aber auch einfach nur was falsch eingestellt gewesen bei mir. Hatte schonmal probiert gezielt mit dem Overlay rumzuspielen, aber auch da kamen nur unbrauchbare Ergebnisse raus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.

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