AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Icons von spicial verzeichnisen bekommen

Ein Thema von mimi · begonnen am 18. Aug 2006 · letzter Beitrag vom 19. Aug 2006
Antwort Antwort
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Icons von spicial verzeichnisen bekommen

  Alt 18. Aug 2006, 16:56
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 !
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Icons von spicial verzeichnisen bekommen

  Alt 18. Aug 2006, 16:58
such mal im forum nach shell32.dll und icons aus dll laden.

Mfg
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#3

Re: Icons von spicial verzeichnisen bekommen

  Alt 18. Aug 2006, 16:59
http://www.delphipraxis.net/internal...ct.php?t=90215
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: Icons von spicial verzeichnisen bekommen

  Alt 18. Aug 2006, 17:19
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.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Icons von spicial verzeichnisen bekommen

  Alt 19. Aug 2006, 00:21
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 ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: Icons von spicial verzeichnisen bekommen

  Alt 19. Aug 2006, 09:07
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;
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Icons von spicial verzeichnisen bekommen

  Alt 19. Aug 2006, 12:08
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 !
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz