![]() |
Icons von spicial verzeichnisen bekommen
Hallo,
ich suche jetzt schon seit stunden nach einer lösung wie ich an das icon von z.b. _ Desktop oder Eigene Dateien bekommen könnte hätte da jemmand ein kleines beispiele bzw. eine idee für mich mit der ich was anfangen kann/könnte ? vielen dank im vorraus ! |
Re: Icons von spicial verzeichnisen bekommen
such mal im forum nach shell32.dll und icons aus dll laden.
Mfg |
Re: Icons von spicial verzeichnisen bekommen
|
Re: Icons von spicial verzeichnisen bekommen
Ich bevorzuge da doch die Lösungen mit SHGetFileInfo oder dem
![]() Die Splitter-Demo aus Luckies Win32-API-Tutorials macht es vor, ansonsten müsste sich mit o.g. Suchbegriffen auch etwas finden lassen. Edit: ![]() |
Re: Icons von spicial verzeichnisen bekommen
vielen dank für die antworten aber so recht komme ich damit nicht klar, gerade wegen die PItemIdList dazu finde ich auch nichts brauchbares...
gibt da nicht noch was einfachers ? |
Re: Icons von spicial verzeichnisen bekommen
Noch einfacher? Die ganzen Shell-Funktionen sind gekapselt, so dass man sie tatsächlich nur noch aufrufen muss. Hier mal ein Beispiel: leere Form erzeugen, ListView drauf (Icon-View), Button drauf. Dann zuerst die notwendigen Wrapper:
Delphi-Quellcode:
Und jetzt wird dafür gesorgt, dass die ListView die Systemsymbole anzeigen kann ("FormCreate"), und dass beim Buttonklick entsprechend Symbole erscheinen:
uses
CommCtrl, ShellAPI, ShlObj, ActiveX; { ... } procedure FreeItemIDList(var pidl: pItemIDList); var ppMalloc : iMalloc; begin if(SHGetMalloc(ppMalloc) = S_OK) then try ppMalloc.Free(pidl); pidl := nil; finally ppMalloc := nil; end; end; function SHGetIDListFromPath(const Path: string; out pidl: PItemIDList): boolean; var ppshf : IShellFolder; wpath : array[0..MAX_PATH]of widechar; pchEaten, dwAttributes : Cardinal; begin // Standardergebnis Result := false; // IShellFolder-Handle holen if(SHGetDesktopFolder(ppshf) = S_OK) then try if(StringToWideChar(Path,wpath,sizeof(wpath)) <> nil) then begin // Pfadname in "PItemIdList" umwandeln ppshf.ParseDisplayName(0,nil,wpath,pchEaten,pidl,dwAttributes); Result := pidl <> nil; end; finally ppshf := nil; end; end; function SHGetIDListFromCSIDL(const wnd: HWND; const Csidl: integer; out pidl: PItemIDList): boolean; begin Result := SHGetSpecialFolderLocation(wnd, Csidl, pidl) = S_OK; end; function GetShellImg(const pidl: PItemIdList; fOpen: boolean): integer; overload; var fi : TSHFileInfo; dwFlags : dword; begin Result := -1; if(pidl <> nil) then begin dwFlags := SHGFI_PIDL or SHGFI_SYSICONINDEX; if(fOpen) then dwFlags := dwFlags or SHGFI_OPENICON; SHGetFileInfo(pchar(pidl),0,fi,sizeof(fi),dwFlags); Result := fi.iIcon; end; end; function GetShellImg(const iDesktop: IShellFolder; pidl: PItemIdList; fOpen: boolean): integer; overload; var isi : IShellIcon; uFlags : uint; begin if(iDesktop.QueryInterface(IID_IShellIcon,isi) = S_OK) then begin if(fOpen) then uFlags := GIL_OPENICON else uFlags := 0; if(isi <> nil) then begin if(isi.GetIconOf(pidl,uFlags,Result) <> NOERROR) then Result := GetShellImg(pidl,fOpen); isi := nil; end; end else Result := GetShellImg(pidl,fOpen); end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var hBigSysImages : HIMAGELIST; fi : TSHFileInfo; begin hBigSysImages := HIMAGELIST(SHGetFileInfo('', 0, fi, sizeof(fi), SHGFI_SYSICONINDEX or SHGFI_ICON)); if hBigSysImages <> 0 then ListView_SetImageList(ListView1.Handle, hBigSysImages, LVSIL_NORMAL); end; procedure TForm1.Button1Click(Sender: TObject); const CsidlArray : array[0..3]of integer = (CSIDL_DESKTOP, CSIDL_FAVORITES, CSIDL_DRIVES, CSIDL_BITBUCKET); var li : TListItem; i : integer; pidl : PItemIDList; begin ListView1.Items.Clear; ListView1.Items.BeginUpdate; // das Beispiel nutzt die CSIDL-Konstanten (s. Array) for i := low(CsidlArray) to high(CsidlArray) do if SHGetIDListFromCSIDL(self.Handle, CsidlArray[i], pidl) then begin li := ListView1.Items.Add; li.Caption := Format('Item %d', [i]); li.ImageIndex := GetShellImg(pidl, false); FreeItemIDList(pidl); end; // das Beispiel nutzt normale Dateipfade und -namen if SHGetIDListFromPath ('H:\Dokumente und Einstellungen\Mathias\Eigene Dateien\Eigene Bilder', // hier hätte ich auch die CSIDL_MYPICTURES-Konstante nehmen können pidl) then begin li := ListView1.Items.Add; li.Caption := 'Eigene Bilder'; li.ImageIndex := GetShellImg(pidl, false); FreeItemIDList(pidl); end; if SHGetIDListFromPath ('E:\CSharp\Help2Utilities\net2\Help2Register\Help2Register.sln', pidl) then begin li := ListView1.Items.Add; li.Caption := 'Solution File'; li.ImageIndex := GetShellImg(pidl, false); FreeItemIDList(pidl); end; ListView1.Items.EndUpdate; end; |
Re: Icons von spicial verzeichnisen bekommen
tut mir leid ich habe gestern leider die frage vollkommen falsch gestellt. die icons bekomme ich auch ohne PitmIDlist weil damit kenne ich mich überhaupt nicht aus(leider) und ich finde auch nichts brauchbars das aussieht wie ein tutorial oder so mit den ich was anfangen könnte.
Zum icon problem: das habe ich mit hilfer diese funktion(die ich aus diesem forum habe) gelöst:
Delphi-Quellcode:
damit hole ich mir den index(wie gesagt der kern stammt aus diesem forum ich habe es nur etwas verändern)
function GetIndex(Datei:String):integer;
var SFI: TSHFileInfo; SysIL, Flags: Cardinal; i,z:integer; ext,ext2:String; begin Result := -1; z:=-1; // Die erweiterung in kleine buchstaben umwandeln ext:=LowerCase (extractFileExt(datei)); // Schauen ob das lezte icon noch passt if (index >-1) and (ext <> '') then ext2:=LowerCase(iconListIndex[index].ext); // Wenn nicht neue suchen if (ext <> ext2) then index:=-1; // in der IconListIndex schauen ob das geuchte icon schon vorhanden ist if index = -1 then begin for i:=0 to high(iconListIndex) do begin ext2:=''; ext2:=iconListIndex[i].ext; // nach schauen ob ein eintrag passt und dabei unterscheiden ob sich um eine datei oder ein verzeichnis handelt if (ext = ext2) and (ext2 <> '') then begin // In Z wird der index zum icon gespeichert ! z:=iconListIndex[i].index; break; end; end; end; // Wurde das icon schonmal verwendet dann wird das hier nicht ausgefürht und ich spare zeit if z = -1 then begin // index ein höhrer zählen(weil der ist ja noch -1) if index +1 > 6 then inc(index) else // ist der index+1 größer als 6 dann wieder auf 0 stellen index:=0; // Die erweiterung in kleine buchstaben umwandeln und in die liste speichern iconListIndex[index].ext:=LowerCase(extractFileExt(datei)); // Windows mitteiln was ich haben möchte, in meinem fall nur den sysiconindex und die Smallicon Flags := SHGFI_SYSICONINDEX or SHGFI_SMALLICON; // Infos anfordern SysIL := SHGetFileInfo(@Datei[1] , 0, SFI, SizeOf(SFI), Flags); // Wenn gefunden den index entsprechend eintragen if SysIL <> 0 then begin iconListIndex[index].index:=SFI.iIcon; z:=SFI.iIcon; end; end; // z zurückgeben Result := z; // Sysil evlt. wieder freigeben DestroyIcon(SysIL); end; damit nicht alle icons gesucht werden müssen führer ich ein liste mit den zulestzt 5 gefunden:
Delphi-Quellcode:
tIconIndex = record
index:Integer; ext:String; test:Cardinal; end;
Delphi-Quellcode:
und bei den imagelist die Shareimages auf true schalten und die namen anpassen.....
procedure TForm2.FormCreate(Sender: TObject);
var hImgSm, hImgBig : HIMAGELIST; fi : TSHFileInfo; begin SetLength(Files,0); ListView1.Items.Count:=20; DG:=0; GG:=ListView1.Height+listview1.Width; // Imageliste mit kleinen Symbolen ermitteln hImgSm := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi), SHGFI_SYSICONINDEX or SHGFI_SMALLICON)); // und an die Imageliste auf der Form übergeben if(hImgSm <> 0) then ilSmall.Handle := hImgSm; // Imageliste mit großen Symbolen ermitteln hImgBig := HIMAGELIST(SHGetFileInfo('',0,fi,sizeof(fi), SHGFI_SYSICONINDEX or SHGFI_ICON)); // und an die Imageliste auf der Form übergeben if(hImgBig <> 0) then ilBig.Handle := hImgBig; SetLength(iconListIndex,6); ich glaube das war jetzt alles ! vielen dank für eure hilfe ! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz