Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Icons von spicial verzeichnisen bekommen (https://www.delphipraxis.net/75383-icons-von-spicial-verzeichnisen-bekommen.html)

mimi 18. Aug 2006 16:56


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 !

EDatabaseError 18. Aug 2006 16:58

Re: Icons von spicial verzeichnisen bekommen
 
such mal im forum nach shell32.dll und icons aus dll laden.

Mfg

Balu der Bär 18. Aug 2006 16:59

Re: Icons von spicial verzeichnisen bekommen
 
http://www.delphipraxis.net/internal...ct.php?t=90215

MathiasSimmack 18. Aug 2006 17:19

Re: Icons von spicial verzeichnisen bekommen
 
Ich bevorzuge da doch die Lösungen mit SHGetFileInfo oder dem Hier im Forum suchenIShellFolder-Interface. Da muss man nicht mit Iconressourcen und Nummern (Index) hantieren, sondern man bekommt tatsächlich unter jedem Windows das korrekte Symbol.

Die Splitter-Demo aus Luckies Win32-API-Tutorials macht es vor, ansonsten müsste sich mit o.g. Suchbegriffen auch etwas finden lassen.


Edit: Hier ist ein TreeView-Sample, das Gebrauch davon macht.

mimi 19. Aug 2006 00:21

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 ?

MathiasSimmack 19. Aug 2006 09:07

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:
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;
Und jetzt wird dafür gesorgt, dass die ListView die Systemsymbole anzeigen kann ("FormCreate"), und dass beim Buttonklick entsprechend Symbole erscheinen:
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;

mimi 19. Aug 2006 12:08

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:
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 hole ich mir den index(wie gesagt der kern stammt aus diesem forum ich habe es nur etwas verändern)
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:
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);
und bei den imagelist die Shareimages auf true schalten und die namen anpassen.....
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