![]() |
Re: Systemicons und Listview
Moin Mathias,
Zitat:
Ich hatte erst vor kurzem dazu ein Beispiel gepostet ( ![]() |
Re: Systemicons und Listview
Ich habe gestern den ganzen Tag Codeschnipsel und Beiträge hier zu diesem Thema gelesen, weil ich in meinem FTP-Client gern Windows-Icons für die FTP-Liste nehmen möchte. Aber das Höchste, was ich bis jetzt als Index aus GetFileInfo gekriegt habe, ist 2. Das heißt, bis jetzt habe ich nur OverlayIcons zu sehen bekommen. Bitte sag mir einer, was hier falsch ist. Es ist übrigens ein MDI-Programm. Die Imagelist für die Systemicons ist im Hauptformular, die Listenansicht befindet sich auf dem jeweiligen MDIchild.
OnCreate des Hauptformulars:
Delphi-Quellcode:
Die Prozedur, die den ListView füllt:
var hIl:HIMAGELIST;
fi:TSHFileInfo; begin hIl:=HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi), SHGFI_SYSICONINDEX or SHGFI_SMALLICON)); if(hIl<>0) then ilShellIcons.Handle:=hIl; // ShareImages ist schon zur Entwurfszeit auf true gesetzt // [...] end;
Delphi-Quellcode:
procedure RefreshList;
var fi:TSHFileInfo; Item:tListItem; begin // [...] // Programmeinstellung: Windows-Icons verwenden? if fm.Settings.FTPicons=2 then begin ZeroMemory(@fi,sizeof(TSHFileInfo)); // brauche ich das überhaupt jedes mal? // l ist vom Typ TidListItems, also das Listing des akt. Verzeichnisses. SHGetFileInfo(PChar('c:\'+l[i].FileName),0,fi,SizeOf(fi), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); Item.ImageIndex:=fi.iIcon; end end; |
Re: Systemicons und Listview
Zitat:
@Thunderchild: Was war jetzt dein Problem? Du hast Dateien vom FTP-Server, die´s auf deinem Rechner u.U. nicht gibt. Und darum passen die Symbole nicht. Dann folgende Änderung (wie Christian das bereits angedeutet hat):
Delphi-Quellcode:
In der "iIcon"-Membervariablen hast du jetzt den Index des HxS-Symbols. Du kannst auch einen Dateinamen angeben. Durch das o.g. Flag und das Dateiattribut spielt´s keine Rolle ob die Datei wirklich existiert oder nicht. Es ist als würde sie existieren.
ZeroMemory(@fi,sizeof(fi));
SHGetFileInfo('.HxS', FILE_ATTRIBUTE_NORMAL, <-- Dateiattribut fi,sizeof(fi), SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES); <-- Flag PS: Ach nee, Lamy wollte das ja wissen. |
Re: Systemicons und Listview
Supi, danke. Das isses.
Da würd ich gern noch ne Frage dran hängen: Wie ich das Icon eines Ordners bekomme, habe ich schnell raus gefunden. Was hat das aber mit dem SHGFI_OPENICON auf sich? Ich hatte gehofft, das ist der aufgeklappte Ordner. Aber irgendwie geht das wieder nicht. Zurück zu meiner eigentlichen Frage: mit welchen Parametern bekomme ich nun noch das Icon des Arbeitsplatzes? Damit möchte ich die Wurzel des FTP-Directories schmücken. mfG |
Re: Systemicons und Listview
Zitat:
Zitat:
|
Re: Systemicons und Listview
Moin Thunderchild,
war eine interessante Frage mit dem Arbeitsplatzicon. Ich hab's jetzt mal so gelöst:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var fiWork : TSHFileInfo; icWork : TIcon; pidlDSK : PItemIdList; imWork : IMalloc; begin SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,pidlDSK); icWork := TIcon.Create; try SHGetFileInfo(PChar(pidlDSK),0,fiWork,SizeOf(fiWork),SHGFI_PIDL or SHGFI_ICON or SHGFI_SMALLICON); icWork.Handle := fiWork.hIcon; Canvas.Draw(10,10,icWork); finally FreeAndNil(icWork); SHGetMalloc(imWork); imWork.Free(pidlDSK); end; end; |
Re: Systemicons und Listview
Danke für die Antwortarbeit. Welcher Unit kann ich denn die PItemIdList entnehmen? Ferner brauche ich nur den IconIndex. Den möchte ich beim Programmstart ermitteln und dann in einer Vari speichern. Brauche ich dann dieses imWork überhaupt noch?
Gruß |
Re: Systemicons und Listview
Du brauchst zwei Units:
Delphi-Quellcode:
Und Ja: mit dem Index geht es auch. Basierend auf Christians Code:
uses
ShlObj, // für PItemIdList ActiveX; // für IMalloc
Delphi-Quellcode:
wobei ich aber CSIDL_DESKTOP durch CSIDL_DRIVES ersetzt habe, denn im PSDK steht:
li := lv.Items.Add;
li.Caption := 'Arbeitsplatz'; if(SHGetSpecialFolderLocation(0,CSIDL_DRIVES,pidlDSK) = S_OK) then try SHGetFileInfo(pchar(pidlDSK),0,fi,sizeof(fi), SHGFI_PIDL or SHGFI_ICON or SHGFI_SYSICONINDEX); li.ImageIndex := fi.iIcon; finally SHGetMalloc(imWork); end; Zitat:
|
Re: Systemicons und Listview
Danke, es geht.
Aber nochmal nachgehakt: wozu das SHGETMALLOC? Nach meiner Doku hier übergibt das einen Zeiger an das imWork (also damit damit gearbeitet werden kann). Aber weder wird es in der Indexermittlung verwendet, noch dahinter. |
Re: Systemicons und Listview
Zitat:
Mit SHGetMalloc der Zeiger auf IMalloc geholt wird. Und IMalloc wird dazu benutzt, den im fremden Prozessraum reservierten Speicher für die PItemIdList wieder freigeben zu lassen (da der Speicher dafür ja nicht von uns reserviert wurde, sondern von Windows)... mfG mirage228 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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