Вопрос, с которым сталкиваются разработчики, работающие с языками программирования Pascal, в частности с Delphi, заключается в необходимости получения иконки для каталога, например, Рабочего стола (Desktop). В процессе разработки может возникнуть ситуация, когда вместо ожидаемой иконки каталога, вместо этого получают иконку по умолчанию для файлов. Давайте разберемся, как решить эту проблему.
Ошибка в коде
Пример кода, который приводит к получению иконки по умолчанию, выглядит следующим образом:
function GetSystemFileIcon(FolderID: Integer): TIcon;
var
AInfo: TSHFileInfo;
AIcon: TIcon;
Path: String;
begin
Path := GetSpecialFolderPath(FolderID);
// ...
if SHGetFileInfo(PChar(Path), FILE_ATTRIBUTE_NORMAL, AInfo, SizeOf(AInfo),
SHGFI_ICON or SHGFI_LARGEICON or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES or SHGFI_OPENICON) <> 0 then
begin
// ...
end
else
Result := nil;
end;
Проблема заключается в использовании флага SHGFI_USEFILEATTRIBUTES, который не предназначен для получения иконок каталогов, а используется для файлов.
Решение проблемы
Чтобы исправить данную ошибку, необходимо убрать из списка флагов SHGFI_USEFILEATTRIBUTES. Исправленный код будет выглядеть так:
function GetSystemFileIcon(FolderID: Integer): TIcon;
var
AInfo: TSHFileInfo;
AIcon: TIcon;
Path: String;
begin
Path := GetSpecialFolderPath(FolderID);
// ...
if SHGetFileInfo(PChar(Path), 0, AInfo, SizeOf(AInfo),
SHGFI_ICON or SHGFI_LARGEICON or SHGFI_SYSICONINDEX or SHGFI_OPENICON) <> 0 then
begin
// ...
end
else
Result := nil;
end;
Теперь, вызвав функцию GetSystemFileIcon с параметром CSIDL_DESKTOPDIRECTORY, мы получим иконку для каталога Рабочего стола.
Пример использования
var Ico: TIcon;
begin
Ico := GetSystemFileIcon(CSIDL_DESKTOPDIRECTORY);
// Используйте Ico для отображения иконки каталога на Рабочем столе
end;
Заключение
Таким образом, исправление кода заключается в удалении неверного флага SHGFI_USEFILEATTRIBUTES, что позволит корректно получать иконки каталогов в Delphi. Это простой, но важный момент, который необходимо учитывать при работе с функциями получения иконок.
Указания по решению проблемы с получением иконки для каталога на Рабочем столе в среде программирования Delphi, связанной с неправильным использованием флагов в функции `SHGetFileInfo`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS