Autor Beitrag
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 11.02.06 09:40 
Hi @all,

ich brauche die Icons von den Dateiendung, also die die auch der Explorer für einen Typ stamndardmäßig nimmt, also nicht die speziellen Icons wie bei EXEn. Mein Problem ist, dass ich nur "virtuelle" Dateien habe (liegen auf einem Server ) und damit SHGetFileInfo nicht funktioniert (kann ja nix auf der Festplatte finden ;) ). Wie kann ich also ohne SHGetFileInfo die Icons auslesen?

mfg
Heiko
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Sa 11.02.06 14:57 
Hallo,

die Dateien müssen nicht auf der Platte vorhanden sein :wink:
ein kleines Beispiel mit einer ListView:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure InitialisiereIcons;
  var SysIL       : uint;
      SFI         : TSHFileInfo;
      SmallImages : TImageList;
begin
  SmallImages := TImageList.Create(Form1);
  SysIL := SHGetFileInfo(''0, SFI, SizeOf(SFI),
           SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  if SysIL <> 0 then
    begin
    SmallImages.Handle := SysIL;
    SmallImages.ShareImages := TRUE;
    end;
  Form1.ListView1.SmallImages := SmallImages;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  InitialisiereIcons;
end;

procedure TForm1.Button1Click(Sender: TObject);
var aItem : TListItem;
    Info: TSHFileInfo;
    aFile : String;
begin
  aFile := 'dammy.txt';
  aItem := ListView1.Items.Add;
  aItem.Caption := aFile;
  SHGetFileInfo(PChar(aFile), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo),
            SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES);
  aItem.ImageIndex := Info.IIcon;
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Heiko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 17.02.06 16:11 
Thx, funktioniert wie ich es brauche :flehan: . (Das ausprobieren hat eine Weile gedauert da ich in der zwischenzeit wo anders eine Baustelle angefangen hatte und erst einmal beenden wieder wollte bevor ich irgendwo noch ein Loch grabe ;) ).
Handycommander
ontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1054

Windows XP Pro, Vista
Visual Studio 2008
BeitragVerfasst: Di 28.02.06 13:56 
hab den source auch hergenommen...
nur geht der bei mir nicht ganz...
wobei das img ein ordner ist! und keine datei...

siehe bild...

was mache ich falsch?
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Di 28.02.06 15:41 
Hallo,
user profile iconHandycommander hat folgendes geschrieben:
...wobei das img ein ordner ist! und keine datei...
genau :wink: , das sieht man auch auf Deinem Bild, da steht hinter img in der zweiten Spalte der ListView ja auch Datei. Du übergibst den Ordnernamen als Dateinamen, und deshalb zeigt er Dir das Icon an, das auch im Explorer für Dateien ohne Extension angezeigt wird.

Ein Ordner-Icon und auch Laufwerks-Icons kannst man so ermitteln und einem Listview-Eintrag zuweisen:
:!: in uses ShlObj einbinden :!:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button2Click(Sender: TObject);
var aItem : TListItem;
    Info: TSHFileInfo;
    aOrdner : String;
    aDW : DWORD;
    IShFolder : IShellFolder;
    aItemIdList : PItemIdList;
    wsOrdner : WideString;
begin
  aOrdner := 'c:\temp';
  aItem := ListView1.Items.Add;
  aItem.Caption := aOrdner;
  SHGetDesktopFolder(IShFolder);//Interface holen
  wsOrdner := aOrdner;
  IShFolder.ParseDisplayName(0,nil,PWideChar(wsOrdner),aDW,aItemIdList,aDW);
  SHGetFileInfo(PChar(aItemIdList), 0, Info, SizeOf(TSHFileInfo),
            SHGFI_PIDL or SHGFI_ICON or SHGFI_SMALLICON);
  aItem.ImageIndex := Info.IIcon;
end;


//Edit: Hinweis auf ShlObj in uses hinzugefügt

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )