Подключаем в uses модуль ShlObj
Затем добавляем в кнопку вот это:
Обратите внимание - я выделил красным несколько важных вещей:
TitleName = 'Здесь указываем текст, который будет написан в верхней части диалога'
BrowseInfo.ulFlags := Флаги, отвечающие за то, как будет отображаться диалог (см. ниже)
TempPath - Переменная, в которую записывается путь к выбранной папке
Теперь перейдем к флагам:
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_EDITBOX; lpItemID := SHBrowseForFolder(BrowseInfo); if lpItemId <> nil then begin SHGetPathFromIDList(lpItemID, TempPath); ShowMessage(TempPath); GlobalFreePtr(lpItemID); end; end;
Обратите внимание - я выделил красным несколько важных вещей:
TitleName = 'Здесь указываем текст, который будет написан в верхней части диалога'
BrowseInfo.ulFlags := Флаги, отвечающие за то, как будет отображаться диалог (см. ниже)
TempPath - Переменная, в которую записывается путь к выбранной папке
Теперь перейдем к флагам:
Флаг BIF_EDITBOX
Диалог с полем ввода в верхней части окна, куда можно вставить полный путь к папке
Флаг BIF_RETURNONLYFSDIRS
Диалог с блокировкой кнопки OK, если выбранная папка не является частью файловой системы (например "Этот компьютер")
Флаг BIF_USENEWUI
Здесь поле ввода уже располагается внизу. Есть возможность создать новую папку (отключается, если выбран "Этот компьютер" или аналогичный раздел не из файловой системы). Можно менять размер окна. Но у данного диалога есть и недостаток (имхо): если нажать на папку, она автоматически раскрывает подкаталоги, что может вызвать подвисание, если подкаталогов слишком много. В случае с флагом BIF_EDITBOX папка выделяется, но не раскрывается. Поэтому, если мы заранее знаем содержимое выбранной папки, данного флага будет достаточно, чтобы получить путь к папке в переменную.
Еще команды вы найдете здесь:
Ну, и еще немного:
Если Вас устраивает такой диалог, как у флага BIF_RETURNONLYFSDIRS,
то есть более короткое решение:
procedure TForm1.Button1Click(Sender: TObject); var s: string; begin if SelectDirectory('Please specify a directory', 'rfdesktop', s) then begin ShowMessage(s); //выводим сообщение с содержимым переменной s end; end;
Здесь, как вы видите, путь записывается в переменную s, а rfDesktop позволяет показывать весь список, начиная от раздела "Рабочий стол", а не какого-то конкретного диска или папки.
Ну, а для олдскульщиков есть решение, чтобы показать диалог в стиле Win 3.1:
procedure TForm1.Button1Click(Sender: TObject); var options : TSelectDirOpts; DirPath: string; begin DirPath := 'C:\'; if SelectDirectory(DirPath, options, 0) then ShowMessage(DirPath); end;
Комментарии
Отправить комментарий