Thema: Delphi Foldericon anpassen

Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#1

Foldericon anpassen

  Alt 4. Jul 2003, 11:26
So, damit ich den Code nicht verliere, kommt der gleich mal in die CodeLibrary 8)

Ihr kennt bestimmt alle den Bilder-Ordner, Favoriten-Ordner und andere, welche sich im Explorer gesondert darstellen. Dieser Code zeigt lediglich, wie man das Icon ändern kann und einen Info-Tipp anzeigt. Es ist kein Beispiel für eine andere Dateiansicht, dazu wird die Datei folder.htt gebraucht, und das habe ich noch nicht getan.

Im Verzeichnis, welches sich gesondert darstellen soll, muss ein Datei desktop.ini enthalten sein. Diese sollte die Attribute faHidden und faSysFile haben. Der Aufbau ist denkbar einfach.
Code:
[.ShellClassInfo]
IconFile=folder.ico
IconIndex=0
InfoTip=Mein schöner Folder.
Hier wird die Datei folder.ico fürs Icon genutzt. Da nur der Dateiname angegeben wurde, wird die Datei auch im entsprechenden Verzeichnis erwartet. Auch hier sollten die Attribute analog zu denen der desktop.ini gesetzt sein.

Damit der Windows-Explorer die desktop.ini auch lädt, muss dieses dem System mitgeteilt werden. Dazu gibt es die Funktion PathMakeSystemFolder, welche durch Delphi nicht bereitgestellt wird und daher separat importiert werden muss. Verfügbar ist die ab dem IE 4.0.
Delphi-Quellcode:
function PathMakeSystemFolder(pszPath: LPSTR): BOOL; stdcall; external
    'shlwapi.dllname 'PathMakeSystemFolderA';
Windows bietet für diese Funktion keine Gegenfunktion , deshalb muss man das durch das korrigieren der Verzeichnisattribute von Hand erledigen.

Die folgende Funktion ermöglicht es, diese erweiterte Darstellung an- und auszuschalten. Sie erwartet als ersten das Verzeichnis, dessen Attribute angepasst werden sollen und als zweiten Parameter True für die spezielle Ansincht, ansonsten False.
Delphi-Quellcode:
procedure SetDesktopIni(Path: String; ShowSpecialSettings: Boolean);
var
  pPath: array[0..MAX_PATH] of Char;
begin
  if AnsiLastChar(Path)^ = '\then
    SetLength(Path, Pred(Length(Path)));
  StrPCopy(pPath, Path);
  if ShowSpecialSettings then
  begin
    PathMakeSystemFolder(pPath);
  end else begin
    SetFileAttributes(pPath, GetFileAttributes(pPath) and (
        not (faSysFile or faReadOnly)));
  end;
end;
......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat