В этом разделе описывается очень несложный компонент, реализующий диалоговое окно выбора папки (каталога).

14.3.1. Идея

Идея этого компонента не нова, так как в Delphi нет диалогового окна выбора папки. Чтобы выбрать папку, обычно используется компонент OpenFileDialog, являющийся оболочкой вызова API-функций GetOpenFileNameX. Эти функции и реализуют нужное диалоговое окно, которое отлично приспособлено для выбора файла, но хуже - для выбора папки: пользователь не может закрыть его щелчком на кнопке Открыть, если поле Имя файла пустое. Кроме того, свойство FileName содержит полный маршрут доступа к файлу, и маршрут доступа к папке приходится извлекать из него с помощью функции ExtractFileDir.

В то же время в Windows API есть целых три функции, реализующие диалоговые окна выбора папок. Рид диалоговых окон показан на рис. 14.3.

14.3. Компонент FarDirDialog

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

Окно, показанное на рисунке слева, создается такой функцией:

function SelectDirectory(const Caption: String;
const InitDir: WideString;
out Dir: String): Boolean;

Окно справа создается одноименной функцией, но с другими параметрами:

TSelectDirOpt = (sdAllowCreate, sdPerformCreate, sdPrompt); TSelectOptions = set of TSelectDirOpt;
function SelectDirectory(var Dir: String;
Options: TSelectOptions;
HelpCtx: Integer): Boolean;

Обе функции объявлены в модуле FileCtrl. В модуле ShlObj объявлена такая функция:

function SHBrowseForFolder(var lpbi: TBrowselnfo): PItemlDList;
stdcall;

Она создает окно, показанное на рис. 14.3 слева. Поскольку это окно идентично окну, создаваемому первой функцией, функция SHBrowseForFolder далее не рассматривается.

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

14.2.3. Тестовая программа FarFileManager || Оглавление || 14.3.2. Реализация FarDirDialog


Искусство создания компонентов Delphi



Новости за месяц

  • Декабрь
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31