К основному контенту

Delphi. Диалог выбора каталога с полем ввода и кнопкой "Создать"

Нужен именно такой диалог, как на рисунке выше? Тогда делаем следующее:

Подключаем в uses модуль ShlObj

Затем добавляем в кнопку вот это:
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;


Комментарии

Самое просматриваемое

Где Vegas Pro хранит автосохраненные проекты?

12 -ая версия, например, хранит их здесь: %USERPROFILE%\AppData\Local\Sony\Vegas Pro\12.0 16 -ая хранит проекты по тому же пути, только немного в другой папке: %USERPROFILE%\AppData\Local\VEGAS Pro\16.0 

Как удалить виртуальный дисковод, созданный UltraISO из "Проводника"?

Не смотря на то, что в Windows 10 уже давно есть поддержка открытия образов дисков ( Открыть с помощью > Проводник ), некоторые типы образов она не открывает (например, образы с играми для  PS1 ). Поэтому приходится прибегать к использованию сторонних программ, популярной из которых считается UltraISO (благодаря простому интерфейсу, малому размеру и нетребовательности к ресурсам ПК). Но даже у таких простых простых программ порой случаются глюки. И проблема чаще всего связана с виртуальным приводом. Проблема В моем же случае, у меня на компьютере "застрял" виртуальный дисковод, который занял букву временно отключенного внешнего HDD . Все бы ничего, но на нем ( HDD ) располагались видеофайлы материала, который я в данный момент монтирую, и на которые (с учетом исходной буквы диска) прописаны ссылки в файле проекта монтажки. Поэтому, самым простым вариантом на мой взгляд было вернуть внешнему диску исходную букву (которую занял виртуальный привод), а виртуальному просто на...

Значок сети с красным крестиком, хотя Интернет работает. Диагностика неполадок не выявляет проблему

Мне помогло следующее ( Windows 7 ): Win + R > regedit Идем в HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify Удаляем вот эти параметры: IconStreams, LastAdvertisement, PastIconsStream, PromotedIconCache, UserStartTime Открываем Диспетчер задач и переходим на вкладку Процессы Завершаем все процессы " explorer.exe " Переходим на вкладку Приложения Нажимаем кнопку " Новая задача ", пишем " explorer.exe " и нажимаем OK Теперь значок должен отображаться нормально. Windows 10 (ответ от пользователя Cox ): проблема в одном ключе реестра: Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet Значение DWORD EnableActiveProbing = 0 и вызывало такое поведение. Оно отключило соответствующий тест Windows на ручной установке DNS адресов. Когда значение реестра было установлено на EnableActiveProbing = 1 , после перезагрузки можно было вручную вводить адрес...

Не запускается установка из-за iKernel.exe (installshield engine could not be launched)

Нажать Win+R В окне " Выполнить " ввести: services.msc и нажать Enter Включить службу " Windows Installer " ( Запустить ее и поставить на " Авто ") Все. P.S. Еще (как вариант): Зайти в  C:\Program Files\Common Files\InstallShield\engine\6\Intel 32 Взять оттуда  IKernel.exe и поместить его в папку с инсталлятором. Запустить инсталлятор. Либо кликнуть сначала на  IKernel.exe , а потом запустить инсталлятор.

Какой размер лейбака у виниловой пластинки?

Сейчас замерил: размер лейбака/яблока - примерно 100x100 мм . Размер конверта  (пластинка 12 дюймов - самая большая) обычно должен быть  310x310 мм , но конкретно у этой пластинки (Голландское издание) -  313x312 мм . Размер внутреннего конверта  (в котором лежит пластинка) -  308x305 мм .