Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bestimmtes Icon aus Shell32.dll laden (https://www.delphipraxis.net/143328-bestimmtes-icon-aus-shell32-dll-laden.html)

Neutral General 13. Nov 2009 12:16


Bestimmtes Icon aus Shell32.dll laden
 
Hi,

Ich möchte gerne das 16x16 Ordner-Icon aus der Shell32.dll laden. Gibt es da irgendwo Konstanten, bzw ist die ID immer dieselbe (in jeder Windows Version). Weil ansonsten müsste ich ausprobieren...

Gruß
Neutral General

stho 13. Nov 2009 12:20

Re: Bestimmtes Icon aus Shell32.dll laden
 
wie währe es damit, diese dll aus zu quetschen (Gibt passende Tools im netz die Icons aus .dll fischen) und die gewünschten icons dann in
TImageList zu laden? Dann kannst du sie dir von dort aus holen :zwinker:

ansonsten muss sich wohl mal jemans von den "Pro"-Usern an dein Problem machen.
Denn mit dlls habe ich noch gar nicht gearbeitet...

Neutral General 13. Nov 2009 12:23

Re: Bestimmtes Icon aus Shell32.dll laden
 
Hi,

Ja das mit der Imagelist war meine erste Idee. Aber die DLL-Varianten ist schöner, weil dann auch immer schön die zur Windows Version passenden Ordner-Icons angezeigt werden würden ;)

Bernhard Geyer 13. Nov 2009 12:24

Re: Bestimmtes Icon aus Shell32.dll laden
 
Zitat:

Zitat von stho
wie währe es damit, diese dll aus zu quetschen (Gibt passende Tools im netz die Icons aus .dll fischen) und die gewünschten icons dann in
TImageList zu laden? Dann kannst du sie dir von dort aus holen :zwinker:

Das ist ein 1a Rechteverletzung wenn du fremde Icons in die eigene Exe kompilierst.

Mithrandir 13. Nov 2009 12:27

Re: Bestimmtes Icon aus Shell32.dll laden
 
Welches Icon
hätten's denn gerne?

:zwinker:

Neutral General 13. Nov 2009 12:36

Re: Bestimmtes Icon aus Shell32.dll laden
 
Zitat:

Zitat von Daniel G


Naja gut. Und wie schließe ich von dieser Liste auf die ID? Jaa die steht da zwar... aber mal folgendes:

Bei meinem Vista hat das erste Icon die ID 6. Das ist dieses "Datei"-Icon. Dann folgen weitere "Datei"-Icons in verschiedenen größen bis einschließlich ID 11. 12 ist dann dieses RTF Icon. Diesem Bild zufolge müsste also das Ordner Icon bei 4*6 = 24 liegen. Tut es aber nicht! Das Ordner Icon was ich suche beginnt bei 32...


Mhhh.. Vergiss es.. 4 ist das richtige.. Mein ResHacker hat mich irritiert..

wicht 13. Nov 2009 12:40

Re: Bestimmtes Icon aus Shell32.dll laden
 
Wie wärs mit SHGetFileInfo()? Das kann man jedenfalls benutzen, um zu Dateierweiterungen das Icon zu bekommen - müsste doch auch mit Verzeichnissen gehen?
Wenn das Problem bis heute Abend noch besteht, was ich nicht denke, kann ich mal nachschauen, wenn ich zuhause bin. Hab das in meinen Programmen so gemacht glaube ich.

HTH

OregonGhost 13. Nov 2009 12:42

Re: Bestimmtes Icon aus Shell32.dll laden
 
Ich werfe nur mal dies ein:

When programs assume that the system will never change, episode 1

Fazit: Wenn's ein Ordner sein soll, kannst du dir das Icon des Ordners (oder eines beliebigen) mit MSDN-Library durchsuchenSHGetFileInfo besorgen. Aber lieber nicht aus irgendeiner System-DLL klauen.

stho 13. Nov 2009 12:42

Re: Bestimmtes Icon aus Shell32.dll laden
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von stho
wie währe es damit, diese dll aus zu quetschen (Gibt passende Tools im netz die Icons aus .dll fischen) und die gewünschten icons dann in
TImageList zu laden? Dann kannst du sie dir von dort aus holen :zwinker:

Das ist ein 1a Rechteverletzung wenn du fremde Icons in die eigene Exe kompilierst.

hm... nun, es war nur ein Gedanke. Entschuldige bitte. Ich möchte keinen zu irgendwelchen kriminellen Machenschaften verführen :oops:
Gibt ja genug Free-Icons im netz ^^

Bernhard Geyer 13. Nov 2009 12:50

Re: Bestimmtes Icon aus Shell32.dll laden
 
Zitat:

Zitat von stho
Gibt ja genug Free-Icons im netz ^^

Hier muß man aber auch aufpassen ob das Lizenzmodell der Icons auch für die eigene Anwendung passt. Bei Closed-Source lieber ein paar € ber GlyFx und Co. ausgeben und man ist vor unliebsammen überraschungen besser geschützt.

Neutral General 13. Nov 2009 12:53

Re: Bestimmtes Icon aus Shell32.dll laden
 
Zitat:

Zitat von OregonGhost
Ich werfe nur mal dies ein:

When programs assume that the system will never change, episode 1

Fazit: Wenn's ein Ordner sein soll, kannst du dir das Icon des Ordners (oder eines beliebigen) mit MSDN-Library durchsuchenSHGetFileInfo besorgen. Aber lieber nicht aus irgendeiner System-DLL klauen.

Ich assume eigentlich normalerweise nicht, dass das System will never change :mrgreen:
Deswegen habe ich ursprünglich ja nach irgendwelchen Konstanten gefragt ;)

Die Methode mit SHGetFileInfo funktioniert soweit ganz gut :)
Die Icons sehen nur nicht.. so schön aus.. Mein Code:

Delphi-Quellcode:
var ico: TIcon;
    fi: TSHFILEINFO;
    len: Cardinal;
begin
  ico := TIcon.Create;
  try
    len := SizeOf(TSHFILEINFO);
    FillChar(fi,len,0);
    SHGetFileInfo('C:\Windows',0,fi,len,SHGFI_ICON or SHGFI_SMALLICON);
    ico.Handle := fi.hIcon;
    imlTreeView.AddIcon(ico); // TImageList
  finally
    ico.Free;
  end;
end;
Keine Angst - Das 'C:\Windows' ist nur testweise :mrgreen:

OregonGhost 13. Nov 2009 12:55

Re: Bestimmtes Icon aus Shell32.dll laden
 
Was heißt denn das, sie sehen nicht so schön aus? Fehlt die Transparenz? Falsche Farbtiefe? Unscharf? :)

Mithrandir 13. Nov 2009 12:56

Re: Bestimmtes Icon aus Shell32.dll laden
 
Zitat:

Zitat von Neutral General
Deswegen habe ich ursprünglich ja nach irgendwelchen Konstanten gefragt ;)

Konstanten sind och nix anderes als Zahlen, die ins Programm einkompilliert werden. :stupid:

Es gibt sie aber, imho habe ich sie in der MSDN mal gesehen... Erinnere mich nur gerade nicht mehr an die passenden Suchbegriffe... :gruebel:

OregonGhost 13. Nov 2009 12:58

Re: Bestimmtes Icon aus Shell32.dll laden
 
Es gibt Konstanten für die ganzen MessageBox-Icons und so, aber ich glaube nicht für die Shell. Kann mich natürlich irren.

Zum Thema: Mir fiel gerade noch auf, du könntest bei SHGetFileInfo ja mal SHGFI_ICONLOCATION übergeben, mit den Informationen müsstest du das Icon ja selbst laden können. Vielleicht hast du dann mehr Kontrolle über Auflösung, Farbtiefe und so weiter.

Neutral General 13. Nov 2009 12:59

Re: Bestimmtes Icon aus Shell32.dll laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Siehe Anhang.

Edit:

Zitat:

Zitat von OregonGhost
Es gibt Konstanten für die ganzen MessageBox-Icons und so, aber ich glaube nicht für die Shell. Kann mich natürlich irren.

Zum Thema: Mir fiel gerade noch auf, du könntest bei SHGetFileInfo ja mal SHGFI_ICONLOCATION übergeben, mit den Informationen müsstest du das Icon ja selbst laden können. Vielleicht hast du dann mehr Kontrolle über Auflösung, Farbtiefe und so weiter.

Ich habe es ja vorher selbst geladen. Da sah es aber genauso aus.

wicht 13. Nov 2009 13:01

Re: Bestimmtes Icon aus Shell32.dll laden
 
Delphi-Quellcode:
SHGetFileInfo('C:\Windows',0,fi,len,SHGFI_ICON or SHGFI_SMALLICON);
Der Aufruf führt glaube ich nicht immer zum Ziel, weil man ja auch Eigene Ordner-Icons (z.B. mit Hilfe des Explorers in den Ordnereigenschaften) setzen kann. Es gibt da noch ein Flag für, SHGFI_USEFILEATTRIBUTES, ich könnte mir vorstellen, dass das für Abhilfe sorgt. Wollte nur drauf hinweisen...

Neutral General 13. Nov 2009 13:27

Re: Bestimmtes Icon aus Shell32.dll laden
 
Zitat:

Zitat von wicht
Delphi-Quellcode:
SHGetFileInfo('C:\Windows',0,fi,len,SHGFI_ICON or SHGFI_SMALLICON);
Der Aufruf führt glaube ich nicht immer zum Ziel, weil man ja auch Eigene Ordner-Icons (z.B. mit Hilfe des Explorers in den Ordnereigenschaften) setzen kann. Es gibt da noch ein Flag für, SHGFI_USEFILEATTRIBUTES, ich könnte mir vorstellen, dass das für Abhilfe sorgt. Wollte nur drauf hinweisen...

Hi,

Wenn ich dieses Flag setze, bekomme ich ein falsches Icon. Also im Moment hat diese Methode 2 Nachteile:

1. SHGetFileInfo braucht ziemlich lange! :?
2. Das Icon sieht nicht so schön aus..

wenn noch jemand ne Idee hat wäre das super.

wicht 13. Nov 2009 13:34

Re: Bestimmtes Icon aus Shell32.dll laden
 
Mal zuhause eingewählt, das hier habe ich gefunden. Ich benutze ein TListView, um die Icons anzuzeigen, und die sehen eigentlich alle ganz cremig aus. Vielleicht hilft das noch (obwohl es genau so aussieht wie dein Code...), ansonsten bin ich raus...

Delphi-Quellcode:
unit IconManager;

interface

uses
  Windows, SysUtils, Controls, ShellApi, Generics.Collections, Functions;

type
  TIconManager = class
  private
    FDirIndex: Integer;
    FImages: TImageList;
    FData: TDictionary<string, Integer>;
    function FGetIconIndex(Extension: string): Integer;
  public
    constructor Create;
    destructor Destroy; override;
    property DirIndex: Integer read FDirIndex;
    property Images: TImageList read FImages;
    property Icon[Extension: string]: Integer read FGetIconIndex;
  end;

implementation

{ TIconManager }

constructor TIconManager.Create;
var
  SysIL: uint;
  SFI: TSHFileInfoW;
begin
  FData := TDictionary<string, Integer>.Create();
  FImages := TImageList.Create(nil);
  SysIL := SHGetFileInfoW('', 0, SFI, SizeOf(SFI), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX);
  if SysIL <> 0 then
  begin
    FImages.Handle := SysIL;
  end;

  SHGetFileInfoW(PChar(GetSystemDir), 0, SFI, SizeOf(TSHFileInfoW), SHGFI_ICON or SHGFI_SMALLICON);
  FDirIndex := SFI.iIcon;
end;

destructor TIconManager.Destroy;
begin
  FImages.Free;
  FData.Free;
  inherited;
end;

function TIconManager.FGetIconIndex(Extension: string): Integer;
var
  SFI: TSHFileInfoW;
begin
  if not FData.ContainsKey(Extension) then
  begin
    SHGetFileInfoW(PChar(Extension), 0, SFI, SizeOf(TSHFileInfoW), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES);
    FData.Add(Extension, SFI.iIcon);
  end;
  Result := FData[Extension];
end;

end.

Neutral General 13. Nov 2009 13:58

Re: Bestimmtes Icon aus Shell32.dll laden
 
@wicht: Danke, das hat mir geholfen ;)

wicht 13. Nov 2009 13:59

Re: Bestimmtes Icon aus Shell32.dll laden
 
Danke für die Rückmeldung :-D
Dann mal ein schönes Wochenende :P ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:19 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-2025 by Thomas Breitkreuz