SelectDirectory — Функция Delphi


Клуб программистов

Delphi programming

Подписаться на рассылку:

SelectDirectory

Выводит диалоговое окно,
с помощью которого пользователь может выбрать директорию

Описание:

Функция выводит диалоговое окно, чтобы позволить пользователю выбрать директорию ChosenDirectory (диск + путь).

Показывает диалог обзора (просмотра) Windows, инициализированный заданной переменной StartDir. Текст Caption показывается в верхней части диалога.

Если пользователь нажимает ОК, выбранная директория возвращается в переменной ChosenDir, а возвращаемое значение равно True.

Если пользователь нажмет кнопку Cancel, то ничего не будет выведено, а возвращаемое значение равно False.

Выводит разные типа диалога, которые отображают файлы в текущей выбранной директории.

Значение CurrDir используется для перемещения показа в заданную директорию, и оно заменяется выбранным значение, если пользователь нажмет ОК.

Параметры DialogOptions и HelpContext выходят за рамки этого описания.

Они могут быть без опасений установлены в значения по умолчанию, как в данном примере.

SelectDirectory — Функция Delphi

This displays a Windows browser dialog, initialised to the specified StartDir. The Caption text is shown at the top of the dialog.

If the user presses OK, then the selected directory is returned in the ChosenDir variable, and the return value is True.

If the user presses Cancel, then no output is given, and the return value is False.

This displays a very different type of dialog, that incidently shows the files in the currently selected directory.

The CurrDir value is used to position the display to the given directory, and is updated with the selected value if the user presses OK.

Диалог выбора каталога

Если во время разработки программы, Вы столкнулись с проблемой выбора каталога – этот материал то, что Вам нужно.

Среди многочисленных модулей, разработанных для Delphi, есть модуль FileCtrl. Именно в нем хранится интересующая нас функция – SelectDirectory. Функция имеет два варианта исполнения, но нас интересует только один. Его нам будет достаточно, чтобы удовлетворить наши потребности.

Параметры функции SelectDirectory:

  1. Caption– заголовок окна
  2. Root– корневой каталог
  3. Directory– выходной параметр в котором будет сохранен полный путь к выбранному каталогу. Сама же функция возвращает булево значение – удачно ли все прошло.

Окно выбора папки.

Диалоговое окно, вызываемое в результате выполнения функции SelectDirectory, выглядит следующим образом.

Пример использования SelectDirectory.

Давайте попробуем вызвать такое же окно как на рисунке выше. Делать это традиционно будем по клику на кнопке.

Как видно из примера мы передали заголовок ‘Выбор папки’, корневой каталог ‘C:\’, результат работы будет сохранен в переменной s. Для того, чтобы посмотреть на содержимое переменной s– выведем её.

Вот в принципе все знания, необходимые для вызова диалогового окна выбора папки в Delphi.

SelectDirectory — Функция Delphi

Создание программ на языках Pascal, Delphi и Lazarus.

[администратор рассылки: Зенченко Константин Николаевич (Старший модератор)]

Лучшие эксперты в этом разделе

zdwork
Статус: 6-й класс
Рейтинг: 786
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 451
puporev
Статус: Профессионал
Рейтинг: 293
Перейти к консультации №:

У меня Delfi 7. Есть диалоговая функция SelectDirectory (см. пример ниже), однако вызов функции позволяет выбрать только существующую папку, если нужной папки нет, ее нельзя создать прямо в диалоговом окне. В тоже время в других программах я видел такой-же диалог, но с возможностью создания новой папки. Кроме того, мне кажется этот диалог можно вызвать, используя WinApi. Может кто подскажет, как мне вызвать именно такой диалог, но с возможностью создания папок прямо в диалоге.

Илон Маск рекомендует:  Анимация с jQuery

uses
SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
QDialogs, QStdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.Button1Click(Sender: TObject);
var WorkDir: WideString;
begin
SelectDirectory(‘Укажите рабочую папку’,’C:\’,WorkDir);
end;

Состояние: Консультация закрыта

Почитайте здесь, по-моему это то, что Вам нужно.

Консультировал: Устинов Сергей Евгеньевич
Дата отправки: 24.06.2006, 19:15

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Здравствуйте, KEOs!
Функция SelectDirectory существует в двух видах. Вы использовали первый вид, где каталог можно только выбирать. Второй вид, где есть опция для создания каталога, выглядит так:
function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;
Здесь TSelectDirOpts предлагает Вам следующие опции:
sdAllowCreate — позволяет вводить несуществующее имя каталога, но его должно создавать Ваше приложение.
sdPerformCreate — в комбинации с первым. Если каталога не существует, то диалог его создает.
sdPrompt — в комбинации с первым. Если каталог не существует, то выдается предупреждение и запрос, нужно ли его создавать. Если нажать ОК, то каталог создается.
Советую Вам хоть изредка в хелп заглядывать, там много чего интересного пишут. :)

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Здравствуйте, KEOs!
Как вариант, могу предложить функцию выбора директории:

function ChooseFolder(SelfHandle: THandle): string;
var
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 := SelfHandle;
BrowseInfo.pszDisplayName := @DisplayName;
BrowseInfo.lpszTitle := ‘Выберите директорию’;
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS+BIF_NEWDIALOGSTYLE ;
lpItem > if lpItemId <> nil then
begin
SHGetPathFromIDList(lpItemID, TempPath);
result := TempPath;
GlobalFreePtr(lpItemID);
end;
end;

Вызов осуществляется следущим образом:
var
vDir: string;
begin
vDir := ChooseFolder(Form1.Handle);
.
end;

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Вызов диалога “Обзор папок”

Как вызвать точно такое же окно выбора папки?

Использовал эту функцию:

Как сюда добавить кнопку создания папки?

3 ответа 3

Для Delphi 7 находится вот такое (не очень красивое) решение:

не уверен на счет Delphi-7, но в более поздних версиях можно было использовать класс StdActns.TBrowseForFolder :

Как минимум, начиная с Delphi 2007 (про Delphi 7 не уверен), в юните FileCtrl есть функция SelectDirectory , которая имеет вот такое описание:

Соответственно, передав опцию sdNewFolder в параметре Options можно добиться того, что вам нужно:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками delphi delphi-7 или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.11.11.35402

Не работает SelectDirectory() в delphi

Люди подскажите плз где ошибка
procedure TForm1.bOpenIshKatalogClick(Sender: TObject);
Var Dir : string;
Var Root : string;//корневой каталог
const CapDial = ‘Укажите каталог’;

Root := ‘c:\’+#0;
if SelectDirectory(‘CapDial’, root ,dir) then
IshKatalog.Text := Dir;
end;
end;

Уже по всякому пробовал, пол инета перерыл не получается :(

[Error] Unit1.pas(189): Undeclared identifier: ‘SelectDirectory’

Неописанная переменная ‘SelectDirectory’
Ты такую переменную описал?
Если не хочешь описывать, то подключи соотв. модуль.

SelectDirectory — Функция Delphi

uses
Windows , Messages , SysUtils , Variants , Classes , Graphics , Controls , Forms ,
Dialogs , StdCtrls ;

type
TForm1 = class( TForm )
procedure Button1Click ( Sender : TObject );
function SelectDirectory ( const Caption : string ; const StartDir : WideString ; out ChosenDir : string ) : Boolean ;
private
< Private declarations >
public
< Public declarations >
end ;

var
Form1 : TForm1 ;

procedure TForm1 . Button1Click ( Sender : TObject );
begin
TForm1 . SelectDirectory ;
end ;

function TForm1 . SelectDirectory (const Caption : string ;
const StartDir : WideString ; out ChosenDir : string ): Boolean ;
var
chosenDirectory : string ;
begin
// Просим пользователя выбрать требуемый каталог, стартовый каталог C:
if SelectDirectory ( ‘Выберите каталог’ , ‘C:\’, chosenDirectory)
then ShowMessage(‘ Выбранный каталог = ‘+chosenDirectory)
else ShowMessage(‘ Выбор каталога прервался ‘);
end;

Fixing the SelectDirectory function

The Delphi VCL comes with several overloaded SelectDirectory functions declared in FileCtrl, one of which uses the ShBrowseForFolder Windows API function. It passes a callback function which tries to do the following:

  1. Position the dialog on the monitor on which the application’s main form is shown.
  2. Center the dialog on that monitor
  3. Select the given directory in the tree view.

Unfortunately in Delphi 2007 it fails for 2.5 of these points and even in Delphi 10.1 Berlin only one bug has been fixed:

  1. Since it fails to take into account that a monitor left or on top of the primary monitor has negative coordinates, the dialog will appear on the primary monitor if the application’s main form is located on such a monitor. This has been fixed in Delphi 10.1 (possibly earlier, I didn’t check)
  2. Centering the dialog on the monitor fails, at least on both of my computers running Windows 8.1, but I seem to remember that the same problem occurs on several other computers running Windows 7 and XP. This is still the case with Delphi 10.1.
  3. Selecting the given directory works, kind of, but if the tree view contains many entries, the selected entry will not be visible. You’ll have to scroll down to see it. This is still the case with Delphi 10.1

So, why is that? The main problem is that Delphi tries to change the dialog before it is fully visible. Setting the position fails because of this as well as making the selected directory visible.

My bugfix isn’t pretty, I must admit. It just defers these changes until the dialog is fully visible. This has the disadvantage the the user will see it popping up at the wrong place first before its position is corrected and the selected directory becomes visible.

But here it comes anyway:

First, you need to copy the code of SelectDirectory from FileCtrl, the one with the following signature:

In addition you need the function SelectDirCB which is declared immediately above SelectDirectory.

Copy it to a separate unit (or, if you are brave, directly modify FileCtrl).

Above these functions, add the following code (which is based on the existing TSelectDirCallback class declared an implemented in FileCtrl but heavily modified):

Then modify SelectDirectory to pass the additional parameter Parent to the constructor:

The TRectLTWH record as well as the TMonitor_MakeFullyVisible procedure is declared in u_dzVclUtils.

Ok, so, what does this do?

First of all, it does not try to position the dialog when receiving the BFFM_INITIALIZED message. In that state, the dialog isn’t yet visible and apparently cannot be positioned correctly. But it’s still necessary to set the selected directory at this time. My code also sets the FInitialized flag so it knows which of the multiple BFFM_SELCHANGED message to use to do the rest. And that’s actually all there is to it: When handling the first BFFM_SELCHANGED message after FInitialized was set, it sets the dialog position and selects the directory again.

Fixing the first bug (not taking the Monitor.Left / .Top coordinates into account is done here:

Note that RefLtwh is initialized with the Monitor’s Left, Top, Width and Height properties.

Fixing the second bug is also part of that code and it works because the dialog is already visible.

Fixing the third bug involves using

rather than SendMessage and posting this messages twice. Once for selecting the directory and once again to let the dialog scroll so it becomes visible.

In addition to fixing these bugs, this code adds a feature: It tries to centre the dialog on the form passed as parent. No idea why Borland/Codegear/Embarcadero didn’t do that.

You can find this bugfix in my dzlib svn repository on SourceForge

Поиск в корневом каталоге при использовании SelectDirectory в delphi

Я использую функцию SelectDirectory в delphi, чтобы выбрать папку. Я устанавливаю корень в каталог по умолчанию, где должны искать элементы, которые пользователь ищет. Однако, если я хочу, чтобы я мог перемещаться «выше», где я тогда, я не могу.

Допустим, папка по умолчанию — папка C:\Program files\Default и когда я там, я могу просмотреть все папки и выбрать тот, который я хочу. Однако, если я хочу вернуться в файл программы, чтобы искать другую папку, я не знаю, как это сделать.

Также я рассмотрел использование TOpenDialog, но я обнаружил, что не смог выбрать папку и посмотреть файлы, которые присутствуют в папке (параметр, который важен в SelectDirectory ).

Есть ли способ перемещаться над корневой папкой или, возможно, открыть окно, каскадное к папке, так как в нем будет отображаться, как будто кто-то уже перешел с компьютера на корневую папку?

Где RootSearchLocation — это C:\Program files\Default folder, а ChosenDirectory — это каталог, который пользователь выбирает.

Мне нужна дополнительная информация.

Невозможно перемещаться вверх из указанной папки «root» в диалоговом окне «Просмотр папки». Но вы можете указать пустой «корень» и заполнить параметр «каталог» каталогом, который вы хотите, чтобы диалог первоначально перемещался.

SelectDirectory — Функция Delphi

The Delphi function SelectDirectory brings up a dialog box where the user can select or enter a folder name («directory»). You have the choice between two syntaxes:

1. SelectDirectory( Title, RootDir, DirSelected ) displays the standard Windows «Browse for Folder» dialog with a directory tree. The parameters are:

  • Title: the title that should appear above the directory tree.
  • RootDir: the directory to be used as the root of the directory tree that is shown.
  • DirSelected: receives the directory that was selected by the user.

2. SelectDirectory( Dir, Options, HelpCtx ) shows an additional edit-box above the directory tree. The parameters: