Как использовать функцию Shell API SHBrowseForFolder чтобы позволить пользователю выбрать каталог?
uses ShellAPI, ShlObj;
procedure TForm1.Button1Click(Sender: TObject);
var
TitleName: string;
lpItemID: PItemIDList;
BrowseInfo: TBrowseInfo;
DisplayName: array[0..MAX_PATH] of char;
TempPath: array[0..MAX_PATH] of char;
begin
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
BrowseInfo.hwndOwner := Form1.Handle;
BrowseInfo.pszDisplayName := @DisplayName;
TitleName := 'Please specify a directory';
BrowseInfo.lpszTitle := PChar(TitleName);
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nilthenbegin
SHGetPathFromIDList(lpItemID, TempPath);
ShowMessage(TempPath);
GlobalFreePtr(lpItemID);
end;
end;
Перевод контента на русский язык:
Функция SHBrowseForFolder является частью API оболочки и позволяет пользователям просматривать папки. Вот пример использования ее в вашем приложении Delphi:
usesShellAPI,ShlObj;procedureTForm1.Button1Click(Sender:TObject);varlpItemID:PItemIDList;BrowseInfo:TBrowseInfo;DisplayName:array[0..MAX_PATH]ofchar;TempPath:array[0..MAX_PATH]ofchar;beginFillChar(BrowseInfo,sizeof(TBrowseInfo),#0);BrowseInfo.hwndOwner:=Form1.Handle;BrowseInfo.pszDisplayName:=@DisplayName;TitleName:='Пожалуйста, выберите папку';BrowseInfo.lpszTitle:=PChar(TitleName);BrowseInfo.ulFlags:=BIF_RETURNONLYFSDIRSorBIF_EDITBOX;lpItemID:=SHBrowseForFolder(BrowseInfo);iflpItemID<>nilthenbeginSHGetPathFromIDList(lpItemID,TempPath);ShowMessage(TempPath);GlobalFree(lpItemID);// примечание: не используйте GlobalFreePtrend;end;
Вот что делает каждый участок кода:
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0): Инициализирует все байты в структуре BrowseInfo нулями.
BrowseInfo.hwndOwner := Form1.Handle;: Определяет родительское окно для диалогового окна просмотра.
BrowseInfo.pszDisplayName := @DisplayName;: Устанавливает начальную отображаемую имя элемента, который будет просматриваться.
TitleName := 'Пожалуйста, выберите папку';: Определяет заголовок, который будет отображаться вверху диалогового окна просмотра.
BrowseInfo.lpszTitle := PChar(TitleName);: Преобразует строку TitleName в null-terminated строку и присваивает ее полю lpszTitle.
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;: Определяет, как поведет диалоговое окно просмотра.
lpItemID := SHBrowseForFolder(BrowseInfo);: Отображает диалоговое окно просмотра и возвращает его результат - указатель на структуру ITEMIDLIST, которая представляет собой выбранный элемент.
if lpItemID <> nil then: Проверяет, был ли выбран каталог пользователем.
SHGetPathFromIDList(lpItemID, TempPath);: Преобразует структуру ITEMIDLIST в строку пути.
ShowMessage(TempPath);: Отображает выбранный путь как сообщение.
GlobalFree(lpItemID);: Освобождает выделенную память для структуры ITEMIDLIST.
Обратите внимание, что вам не нужно использовать GlobalFreePtr, потому что это алиас для GlobalFree, и нет необходимости вызывать GlobalFreePtr. Также убедитесь, что замените Form1.Handle на реальный.handle вашей формы.
В статье описывается использование функции Shell API SHBrowseForFolder для позволения пользователю выбрать каталог и получение пути выбранного каталога.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.