Для вывода диалога "Обзор папок" существует функция SHBrowseForFolder. Для выбора того, какие папки будут выведены в диалоге, используется функция SHGetSpecialFolderLocation. В этой программе выводится рабочий стол со всеми подпапками (папки рабочего стола, Мой компьютер, Корзина). Для выбора папки в меню пуск используется CSIDL_STARTMENU вместо CSIDL_DESKTOP.
function TfmOptions.Selectdir(const str: string): string;
function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData:LPARAM): integer; stdcall;
begin
Result := 0;
if uMsg = BFFM_INITIALIZED then begin
SendMessage(hwnd, BFFM_SETSELECTION, 1, LongInt(PChar(fmOptions.sx)))
end;
end;
var
TitleName : string;
lpItemID : PItemIDList;
BrowseInfo : TBrowseInfo;
DisplayName : array[0..MAX_PATH] of char;
TempPath : array[0..MAX_PATH] of char;
begin
Result:='';
sx:=str;
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
BrowseInfo.hwndOwner := Application.Handle;
BrowseInfo.pszDisplayName := @DisplayName;
TitleName := 'Выберите папку...';
BrowseInfo.lpszTitle := PChar(TitleName);
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or BIF_STATUSTEXT;
BrowseInfo.lpfn := @BrowseCallbackProc;
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then begin
SHGetPathFromIDList(lpItemID, TempPath);
Result:=StrPas(TempPath);
GlobalFreePtr(lpItemID);
end;
{
//////////////////////////////////////////////////////////////////////
--- bi.ulFlags флаги, которые задают режим отображения диалога:-----
/////////////////////////////////////////////////////////////////////
BIF_BROWSEFORCOMPUTER - Возвратить только компьютеры.
Если пользователь выбрал что-то отличное от компьютеров, то кнопка OK останется серой.
BIF_BROWSEFORPRINTER - Возвратить только принтеры. Если пользователь выбрал что-
то отличное от принтеров, то кнопка OK останется серой.
BIF_RETURNONLYFSDIRS - Возвратить только папки файловой системы.
Если пользователь выберет папки, которые не являются частью файловой системы,
то кнопка OK останется серой. Это необходимо для того если ваша программа не
работает с виртуальными папками вроде "Панель управления".
BIF_BROWSEINCLUDEFILES - Диалог просмотра будет отображать файлы вместе с директориями.
BIF_DONTGOBELOWDOMAIN - Не включать сетевые папки Доменного уровня ниже,
чем в TreeView контроле.
BIF_RETURNFSANCESTORS - В качестве выбора допустимы только объекты,
представленные в файловой системе.
BIF_STATUSTEXT - Включает область статуса в блок диалога. Функция может
установить текст посылая сообщения блоку диалога.
BIF_EDITBOX - В диалоговом окне будет присутствовать строка редактирования,
таким образом пользователь может набрать имя элемента.
BIF_VALIDATE - Если пользователь введёт неверное имя в строке редактирования,
то диалоговое окно вызовет функцию обратного вызова приложения по сообщению BFFM_VALIDATEFAILED.
Статья Как вывести диалог "Обзор папок" раздела Программа и Интерфейс Диалоги и Фреймы может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.