2009. május 17., vasárnap

Retrieve icons from the system image list


Problem/Question/Abstract:

Having the system image list in a TImageList, how can I get the index for special icons like floppy disk, hard drive, removable drive, etc., which do not represent file types? I can see that these icons are actually present (for example, 11 = CD-ROM, 8 = Hard-Drive on my machine ...). But I would prefer not to use hard-coded constants.

Answer:

uses
  ShellAPI;
var
  sfi: TSHFileInfo;
begin
  SHGetFileInfo("DUMMY.ABC", FILE_ATTRIBUTE_NORMAL, sfi, sizeof(sfi),
    SHGFI_ICON or SHGFI_USEFILEATTRIBUTES);
  Index := sfi.iIcon;
end;

By using the second parameter you can get icons for file system items that do not physically exist in the first parameter, which is not completely obvious in the help for SHGetFileInfo. For example.

SHGetFileInfo(" * .DOC", FILE_ATTRIBUTE_NORMAL, sfi, sizeof(sfi),
  SHGFI_ICON or SHGFI_USEFILEATTRIBUTES);

gets the icon associated with DOC files. To get drives use

SHGetFileInfo("A: \", FILE_ATTRIBUTE_NORMAL, sfi, sizeof(sfi),
  SHGFI_ICON or SHGFI_USEFILEATTRIBUTES);

etc.

Note that this retrieves the LARGE icon.  See the help on getting small icon with other flags.

Nincsenek megjegyzések:

Megjegyzés küldése