Вывод диалога выбора папки на 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 (Дельфи) - SelectDirectory:
const
SELDIRHELP = 1000;
var
sDir: String;
...
sDir:= 'C:windows';
if SelectDirectory(sDir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then
Label1.Caption:= sDir;
При вызове этой функции SelectDirectory появляется окно вида:
Был разработан пример для демонстрации кода, приведённого в этой статье. Само окно программы для вывода пользователю диалога выбора папки или директории выглядит таким образом:
Скачать можно отсюда: select-directory-sample.zip