@Chris: Nö.
@Tpercon: Wenn du unter dem Imageindex 48 bleibst, dann kannst du die Icons getrost verwenden. Soweit ich das gesehen habe, sind diese identisch. Insofern dürfte es bei dir (Laufwerks-Icons) keine Probleme geben.
Generell wäre aber sicher sakuras Beitrag interessant, weil diese Variante unabhängig von eigenen Zugriffen auf die "shell32.dll" ist. Ich habe mir mal die Freiheit genommen, den für dich wahrscheinlich wichtigen Teil zu extrahieren. sakura wird hoffentlich nicht schimpfen.
Folgendes (gebasteltes
) Beispiel liest die vorhandenen Laufwerke mit den korrekten Icons in eine ListView ein. Die Routinen "DriveExists" und "DriveType" stehen in der
DP-Library und sind -natürlich!- auch von sakura:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
FileInfo: TSHFileInfo;
ImageListHandle: THandle;
aIcon: TIcon;
begin
for i := 0 to 25 do
if(DriveExists(i)) then
begin
fillchar(FileInfo,sizeof(FileInfo),#0);
ImageListHandle := SHGetFileInfo(pchar(CHR(i+65) + ':\'),
0, FileInfo, sizeof(FileInfo), SHGFI_ICON or SHGFI_LARGEICON);
try
aIcon := TIcon.Create;
try
aIcon.Handle := FileInfo.hIcon;
ListView1.Items.Add;
ListView1.Items[ListView1.Items.Count-1].Caption :=
CHR(i+65) + ':\ (' + DriveType(i) + ')';
ListView1.Items[ListView1.Items.Count-1].ImageIndex :=
ImageList1.AddIcon(aIcon);
finally
FreeAndNil(aIcon);
end;
finally
DestroyIcon(FileInfo.hIcon);
ImageList_Destroy(ImageListHandle);
end;
end;
end;
Codebasis, Copyright by Sakura.
(Das nur, damit er mich nicht auf 10 Mio US-Dollar verklagt.
)
<Edit>
"ShellAPI" und "CommCtrl" (für ImageList_Destroy) nicht vergessen! Außerdem sollte die Imageliste natürlich die Maße 32x32 besitzen. Andernfalls kann man aber auch das Flag SHGFI_SMALLICON benutzen.
Hatte ich doch glatt vergessen zu erwähnen.
</Edit>
Gruß,
Mathias.