Windows System Icons in TreeView [erstmal gelöst]

Antworten
CoolT
Beiträge: 5
Registriert: Fr 31. Aug 2012, 21:10

Windows System Icons in TreeView [erstmal gelöst]

Beitrag von CoolT »

Hallo,

ich bin mit meiner Programmierung mittlerweile auch auf das schon hier diskutierte Problem der Windows System Icons in ein TreeView zubringen gestoßen (http://www.lazarusforum.de/viewtopic.php?f=15&t=2587). Da dieser Beitrag schon ein bisschen älter ist und für mich kein zufrieden stellendes Ergebnis geliefert hat mein erneutes Nachfragen. Da ja nun Lazarus Erwachsen georden ist (Version 1.0) hoffe ich das dieses Problem irgend eine Lösung bekommen hat.

Mein bisheriger Weg:
Ich habe mir durch die Windows-Funktion 'SHGetFileInfo' den Handle zur System-ImageList geholt. Doch leider kann ich jetzt diesen Handle nicht der ImageList zuweisen, da der Handle nur Lesen-Eigenschaft hat :? . Auch die Windows-Funktion 'TreeView_SetImageList' funktioniert nicht mit dem SystemImageList-Handle.
Nun aber ein wenig Code, der sagt mehr als 1000 Worte.

Code: Alles auswählen

function GetShellImageList(Large: boolean): HImageList;
var
  fi: TSHFileInfo;
  AFlags: integer;
begin
  AFlags:=SHGFI_SYSICONINDEX;
  if Large then
    AFlags:=AFlags OR SHGFI_LARGEICON
  else
    AFlags:=AFlags OR SHGFI_SMALLICON;
 
  result:=SHGetFileInfo('', 0, fi, sizeof(fi), AFlags);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  sih: HIMAGELIST;
begin
  sihandle:=GetShellImageList(false);
 
  //1. Versuch
  TreeView1.Images.Handle:=sihandle; //direkter Zugriff fkt. nicht, nur Lesen
 
  //2.Versuch
  TreeView_SetImageList(TreeView1.Handle, sihandle, TVSIL_NORMAL); //wird ausgeführt, doch bringt kein Ergebnis - Keine Icons vor den Items
end;


:?: Gibt es einen Weg den Handle der ImageList bzw. dem TreeView zu übergeben?
:?: Warum ist der Handle nur noch lesend?

Nur so nebenbei: Gibt es eine Möglichkeit System-Icons die größer als 32x32 sind auszulesen?

Danke. CoolT

P.S. Da ich neu bin und zum ersten mal hier poste, erst einmal ein Lob an dieses Forum und den fleisigen Helfern. Es hat mir schon bei so manchen Problem geholfen.
Zuletzt geändert von CoolT am Sa 1. Sep 2012, 16:04, insgesamt 1-mal geändert.

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Windows System Icons in TreeView

Beitrag von MmVisual »

Ich vermute mal dass die Lazarus TImageList / TTreeView von einer ganz anderen Datenstruktur sind als die TreeView/ImageList von Windows und daher kann man nicht einfach ein wildfremdes Handle zuweisen.
Du musst das Image auslesen und selbst deiner Lazarus-ImageList zuweisen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Windows System Icons in TreeView

Beitrag von theo »

Kommst du denn damit nicht weiter?
viewtopic.php?p=43502#p43502

CoolT
Beiträge: 5
Registriert: Fr 31. Aug 2012, 21:10

Re: Windows System Icons in TreeView

Beitrag von CoolT »

@MmVisual:
Deine Aussage kann ich nicht nachvollziehen, da es mit einer ListView und 'ListView_SetImageList' funktioniert (Beispiel: http://www.lazarus.freepascal.org/index.php/topic,12300.0.html).

@theo:
Eigentlich keine schlechte Idee (hätte ich auch darauf kommen können :oops: ), aber noch keine für mich zufrienden stellende Lösung.
Wird mir wohl nix anderes übrig bleiben als erstmal diese Variante zu nutzen.

Danke euch für die Antworten.

CoolT
Beiträge: 5
Registriert: Fr 31. Aug 2012, 21:10

Re: Windows System Icons in TreeView [erstmal gelöst]

Beitrag von CoolT »

So, auf Grundlage von theo's Beitrag habe ich mir eine funktionierende Lösung gebastelt.

Die TImageList-Klasse habe ich abgeleitet und um neue Funktionen/Properties erweitert, die das entsprechende ShellIcon der Dateien von Windows holen und in die ImageList nur einmal einfügen. Bei der Prüfung, ob das Icon schon in der Liste ist werden zusätzlich die graphischen Inhalte der Icons zu Hilfe genommen.

ShellTreeView mit Windows Icons
ShellTreeView mit Windows Icons
ShellTreeView.JPG (27.2 KiB) 1807 mal betrachtet

CoolT

CoolT
Beiträge: 5
Registriert: Fr 31. Aug 2012, 21:10

Re: Windows System Icons in TreeView [erstmal gelöst]

Beitrag von CoolT »

Und natürlich noch die Unit mit der TShellImageList-Klasse. Viel Spass damit.
Dateianhänge
ShellImageList.pas
(4.34 KiB) 163-mal heruntergeladen

MemberOfClub
Beiträge: 2
Registriert: Di 16. Feb 2016, 09:54

Re: Windows System Icons in TreeView [erstmal gelöst]

Beitrag von MemberOfClub »

So, ich hab jetzt mal das lazfm3-Paket und Deine Lösung zusammengeknüppelt,
es passiert aber noch nichts sinnvolles mit Deiner Image-List im Treeview.

Zumindest - gemäß Screenshot - ist der Reihenabstand gewachsen,
(siehe Treeview links oben ..) Icons würden jetzt dahin passen .. :)

Was muß ich machen damit die ImageList-Icons sichtbar werden im Treeview ?

MfG,
Peter

lazfm3 screenshot 01.png

lazfm3 01.zip
(220.87 KiB) 113-mal heruntergeladen

Antworten