Вывод диалога выбора папки на Delphi (Дельфи) пользователю

Рассмотрим, как можно воспользоваться стандартным диалогом, где пользователь может выбрать папку (директорию).
Это можно сделать двумя способами: использовать функцию SHBrowseForFolder или SelectDirectory.

Приведённый ниже пример кода на Delphi (Дельфи) демонстрирует, как показать и выбрать папку пользователю, используя функцию SHBrowseForFolder и как указать исходную папку (директорию). Исходная папка при выборе может быть локальным путём, присоединённой сетевой папкой, или любым UNC-соответствующим ресурсом. В последних версиях Delphi Вы можете найти две константы BIF_NEWDIALOGSTYLE и BIF_NONEWFOLDERBUTTON, определённых в юните ShlObj, однако их нет в Delphi 7.

Для вывода диалога выбора папки пользователю используем следующую функцию:


uses SysUtils, ShlObj;

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

function GetFolderDialog(Handle: Integer; Caption: string; var strFolder: string): Boolean;
const
  BIF_STATUSTEXT           = $0004;
  BIF_NEWDIALOGSTYLE       = $0040;
  BIF_RETURNONLYFSDIRS     = $0080;
  BIF_SHAREABLE            = $0100;
  BIF_USENEWUI             = BIF_EDITBOX or BIF_NEWDIALOGSTYLE;

var
  BrowseInfo: TBrowseInfo;
  ItemIDList: PItemIDList;
  JtemIDList: PItemIDList;
  Path: PAnsiChar;
begin
  Result:= False;
  Path:= StrAlloc(MAX_PATH);
  SHGetSpecialFolderLocation(Handle, CSIDL_DRIVES, JtemIDList);
  with BrowseInfo do
  begin
    hwndOwner:= GetActiveWindow;
    pidlRoot:= JtemIDList;
    SHGetSpecialFolderLocation(hwndOwner, CSIDL_DRIVES, JtemIDList);

    { Возврат названия выбранного элемента }
    pszDisplayName:= StrAlloc(MAX_PATH);

    { Установка названия диалога выбора папки }
    lpszTitle:= PChar(Caption); // 'Выбрать папку на Delphi (Дельфи)';
    { Флаги, контролирующие возврат }
    lpfn:= @BrowseCallbackProc;
    { Дополнительная информация, которая отдаётся обратно в обратный вызов (callback) }
    lParam:= LongInt(PChar(strFolder));
  end;

  ItemIDList:= SHBrowseForFolder(BrowseInfo);

  if (ItemIDList <> nil) then
    if SHGetPathFromIDList(ItemIDList, Path) then
    begin
      strFolder:= Path;
      Result:= True;
    end;
end;

Рассмотрим пример использования функции выбора папки на Delphi (Дельфи):


var sFolder: String;
sFolder:= 'd:\Projects';
if GetFolderDialog(Application.Handle, 'Выбрать папку на Delphi (Дельфи)', sFolder) then
  ShowMessage('Пользователь выбрал папку: ' + sFolder);

При вызове этой функции появляется окно вида:
Функция Delphi SHBrowseForFolder. Вывод диалога выбора папки

Имеется другая функция для вывода диалога пользователю выбора папки на Delphi (Дельфи) - SelectDirectory:


const
  SELDIRHELP = 1000;
var
  sDir: String;
...
  sDir:= 'C:windows';
  if SelectDirectory(sDir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then
    Label1.Caption:= sDir;

При вызове этой функции SelectDirectory появляется окно вида:
Функция Delphi SelectDirectory. Вывод диалога выбора папки

Был разработан пример для демонстрации кода, приведённого в этой статье. Само окно программы для вывода пользователю диалога выбора папки или директории выглядит таким образом:
Пример программы на Delphi (Дельфи). Вывод диалога выбора папки

Скачать можно отсюда: select-directory-sample.zip


Google