Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как использовать Shell API SHBrowseForFolder 2

Delphi , Файловая система , Директории



Автор: Анатолий

threadvar
  myDir: string;

function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData:
  LPARAM): integer; stdcall;
begin
  Result := 0;
  if uMsg = BFFM_INITIALIZED then
    SendMessage(hwnd, BFFM_SETSELECTION, 1, LongInt(PChar(myDir)))
end;

function SelectDirectory(const Caption: string; const Root: WideString;
  var Directory: string): Boolean;
var
  WindowList: Pointer;
  BrowseInf!
  o: TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
begin
  myDir := Directory;
  Result := False;
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      RootItemIDList := nil;
      if Root <> '' then
      begin
        SHGetDesktopFolder(IDesktopFolder);
        IDesktopFolder.ParseDisplayName(Application.Handle, nil,
          POleStr(Root), Eaten, RootItemIDList, Flags);
      end;
      with BrowseInfo do
      begin
        hwndOwner := Application.Handle;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpfn := @BrowseCallbackProc;
        lParam := Integer(PChar(Directory));
        lpszTitle := PChar(Caption);
        ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or
        BIF_STATUSTEXT;
      end;
      WindowList := DisableTaskWindows(0);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(WindowList);
      end;
      Result := ItemIDList <> nil;
      if Result then
      begin
        ShGetPathFromIDList(ItemIDList!
          , Buffer);
        ShellMalloc.Free(ItemIDList);
        Directory := Buffer;
      end;
    finally
      ShellMalloc.Free(Buffer);
    end;
  end;
end;

Программный код на Delphi, использующий API оболочки для поиска папки!

Вот разбивка кода:

Функция SelectDirectory Эта функция является основным точкой входа для поиска директории. Она принимает три параметра: Caption, Root и Directory. Первые два используются в качестве вводных данных, а третий - это параметр вывода, который будет содержать выбранную директорию пути.

Вот что функция делает:

  1. Устанавливает начальную величину myDir в переданный Directory.
  2. Вызывает ShGetMalloc для получения указателя на аллокатор памяти.
  3. Аллоцирует буфер с помощью аллокатора памяти, который будет использоваться как временное хранилище пути директории.
  4. Если указана корневая папка (т.е., Root не является пустой строкой), она парсит отображаемое имя этой папки с помощью SHGetDesktopFolder и ParseDisplayName.
  5. Инициализирует структуру TBrowseInfo с различными параметрами:
    • hwndOwner: устанавливает handle окна-владельца в Application.Handle.
    • pidlRoot: устанавливает корневой элемент ID-list в парсированной корневой папке.
    • pszDisplayName: устанавливает буфер отображаемого имени в аллокированный буфер.
    • lpfn: устанавливает указатель на функцию обратного вызова в @BrowseCallbackProc.
    • lParam: устанавливает параметр функции обратного вызова в переданный Directory значение как целое число.
    • lpszTitle: устанавливает заголовок диалога поиска в переданное Caption.
    • ulFlags: устанавливает различные флаги для диалога поиска, включая BIF_RETURNONLYFSDIRS, BIF_EDITBOX и BIF_STATUSTEXT.
  6. Отключает задачи окон с помощью DisableTaskWindows и аллоцирует новый список окон.
  7. Вызывает ShBrowseForFolder для отображения диалога поиска с указанными настройками.
  8. Если пользователь выбирает директорию, она извлекает путь из ID-list с помощью ShGetPathFromIDList.
  9. Освобождает аллокированную память и возвращает выбранную директорию пути в параметре вывода Directory.

Функция BrowseCallbackProc Эта функция - это функция обратного вызова, которая будет вызвана диалогом поиска при необходимости обновления состояния или извлечения информации от пользователя.

Вот что функция делает:

  1. Возвращает 0 как значение по умолчанию.
  2. Проверяет, если сообщение - это BFFM_INITIALIZED, которое указывает на то, что диалог поиска был инициализирован.
  3. Если так, отправляет сообщение BFFM_SETSELECTION диалогу поиска с текущим выбором (т.е., переданным myDir) с помощью SendMessage.

Советы и альтернативы

  • Код использует API оболочки для взаимодействия с Windows Shell, которая предоставляет много функциональности для работы с файлами, папками и другими объектами оболочки.
  • Вы можете использовать альтернативные библиотеки, такие как TJvShell или SynEdit, чтобы обеспечить схожую функциональность без использования API оболочки.
  • Если вам нужно поддерживать платформы, не являющиеся Windows, рассмотрите использование кроссплатформенных библиотек или фреймворков, которые предоставляют схожие возможности поиска файловой системы.

Как использовать функцию SHBrowseForFolder для открытия диалогового окна выбора папки в приложении Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Директории ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-19 02:20:07/0.0034809112548828/0