пятница, 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 комментария:

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

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

    ОтветитьУдалить
  3. Вот пример не мой:

    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]);

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

    ОтветитьУдалить