пятница, 18 февраля 2011 г.

Delphi Диалоговое окно "выбор директории"

   Возникла задача, в которой нужно вызвать диалоговое окно выбора папки. Если нужно сделать выбор файла можно просто разместить на форме не визуальный компонент OpenDialog написать код взаимодействия и все готово. Для диалогового окна выбора папки структура немного другая.
Сперва нужно добавить модуль FileCtrl, если конечно его еще нет в списке подключенных модулей. В данном модуле есть две функции SelectDirectory: 
function SelectDirectory ( const Caption : string; const StartDir : WideString; out ChosenDir : string ) : Boolean;
где:  Caption     - Текст заголовка окна;
        StartDir    - Рабочая директория, в которую мы переместимся при открытии диалогового окна выбора папки.
       ChosenDir - Выбранный каталог
Если пользователь, в диалоговом окне выбора  папки, нажал "ОК" - результат вернется True и выбранный каталог будет записан в переменную ChosenDir.
function SelectDirectory ( var CurrDir : string; DialogOptions : TSelectDirOpts ; HelpContext : Longint ) : Boolean;
где: CurrDir - Базовая рабочая директория, в которую мы переместимся при открытии диалогового окна выбора папки.
       DialogOptions - настройка диалогового окна выбора папки. Может принимать следующие параметры: sdAllowCreate, sdPerformCreate, sdPrompt. 

              sdAllowCreate - Диалоговое окно выбора папки будет содержать поле редактирования имени каталога, в которое можно вводить имя несуществующего каталога.Указанное имя будет записано в переменную Directory, но при этом сам каталог создан не будет.
              sdPerformCreate  - Параметр используется только совместно с величиной sdAllowCreate. Когда пользователь вводит несуществующий каталог, функция создает его.
              sdPrompt - Параметр используется только совместно с величиной sdAllowCreate. Если пользователь введет имя не существующего каталога, то будет выведено окно на подтверждение создания каталога. Если параметр Options содержит значение sdPerformCreate и пользователь нажимает кнопку OK в диалоговом окне выбора каталога, то указанный каталог создается. В противном случае, каталог создан не будет.
       HelpContext - указывает контекст системы помощи, который будет активирован при нажатии кнопки F1

Примеры использователя:
var SelectedDirName:string;
begin
...
   SelectDirectory('Выберите каталог','V:\',SelectedDirName);
....
end;
   Результат представлен на Рис.1. (В системе Windows Vista диалоговое окно выбора каталога будет выглядит следующим образом)
 Рис.1. 

4 комментария:

Александр. А комментирует...

Для того чтобы дерево папок развернулась до указанной папки нужно передать в SelectedDirName тот путь который нужно открыть

Анонимный комментирует...

Не получается получить каталог на FTP сервере. Это можно как то реализовать (если можно, опишите с примером)?

androschuk комментирует...

Вот пример не мой:

Lst:= TStringList.Create;//Список файлов и папок.
Tmp:= TStringList.Create;//Временный список

idFtp1.List(Tmp, '', false);//Получаем список папок в корневом каталоге...
Lst.AddStrings(Tmp);//переписываем из временного списка в наш список...

count:= 0;//Начальная позиция сканирования
LstCount:= Lst.Count;//конечная позиция сканирования

For n:= 0 to 1 do //Глубина сканирования...
begin
For i:= count to LstCount-1 do//Сканируем часть списка...
begin
try
idFtp1.List(Tmp, Lst.Strings+'/', FALSE);//пытаемся получить список вложенных файлов.
application.ProcessMessages;

except continue//Не пустили - идем дальше...
end;

Lst.AddStrings(Tmp);//Приписали в список файлов все найденные файлы...
end;

count:= LstCount;//Запомнили новую начальную..
LstCount:= Lst.Count;//...и конечную позиции...
end;//После чего сканим следующий кусок...

for nn:=0 to lst.Count-1 do listbox1.Items.add(lst.Strings[nn]);

Unknown комментирует...

procedure TForm1.Button1Click(Sender: TObject);
var
SelDirectory : string;
begin
if SelectDirectory('Выберите каталог', '', SelDirectory)
then ShowMessage('Выбранный каталог = '+SelDirectory)
else ShowMessage('Выбор каталога прервался');
end;