uses shellapi;
function IconAnzahl(Datei: string): integer;
var idx: integer;
begin
idx := $FFFFFFFF;
result := ExtractIcon(hinstance, pchar(datei), idx);
end;
function HolIcon(Datei: string; Stelle: integer): HIcon;
begin
// Zählung beginnt bei 0, deshalb Stelle-1
result := ExtractIcon(hinstance, pchar(datei), Stelle - 1);
end;
// Beispielaufruf, um ein einzelnes Icon anzusehen
procedure TForm1.Button3Click(Sender: TObject);
var
H: HIcon;
welches, wieviel: integer;
fl: string;
begin
fl := 'c:\windows\system32\moricons.dll';
welches := 20; // das 20. Icon in der Datei
if fileexists(fl) then begin
wieviel := IconAnzahl(fl);
if (wieviel > 0) then begin
if (wieviel >= welches) then begin
H := HolIcon(fl, welches);
drawicon(canvas.handle, 10, 10, H);
destroyicon(H);
end else
showmessage('Anforderung ist höher als Anzahl');
end else
showmessage('Datei enthält keine Icons');
end else
showmessage('Datei nicht gefunden');
end;
// simpler Iconbetrachter
procedure TForm1.Button2Click(Sender: TObject);
const
fl = 'c:\windows\system32\shell32.dll';
links = 10;
oben = 10;
dazwischenfrei = 5;
var
x, y, anzahl, nebeneinander, untereinander, breite, hoehe: integer;
begin
breite := GetSystemMetrics(SM_CXICON) + dazwischenfrei;
hoehe := GetSystemMetrics(SM_CYICON) + dazwischenfrei;
nebeneinander := 20;
anzahl := IconAnzahl(fl);
if anzahl > 0 then begin
if anzahl < nebeneinander then nebeneinander := anzahl;
untereinander := (anzahl div nebeneinander) +
ord(anzahl mod nebeneinander > 0);
for y := 0 to untereinander - 1 do
for x := 0 to nebeneinander - 1 do
drawicon(canvas.handle, links + x * breite, oben + y * hoehe,
holicon(fl, y * nebeneinander + x + 1));
end else showmessage('Anzeige nicht möglich');
end;