Диалог выбора файла Delphi

Обновлено: 21.11.2024

Хотя современные программисты обычно в восторге от новых технологий на основе браузеров, старая школа компонентной объектной модели (COM) в Windows по-прежнему используется в значительной части программного обеспечения для бизнеса. За прошедшие годы Microsoft разработала очень большую и расширяемую среду для разработчиков Windows, и Delphi, являясь одной из ее основных функций, значительно упрощает использование технологии COM. На самом деле, использовать COM в Delphi, вероятно, проще, чем любой другой инструмент разработки на рынке, включая все, что доступно от Microsoft.

В этой статье мы кратко рассмотрим один из этих опубликованных интерфейсов на основе COM: IFIleDialogCustomize. Согласно документам от Microsoft, этот интерфейс:

Элементы управления добавляются в диалоговое окно до его отображения. Их расположение подразумевается порядком, в котором они добавляются. После отображения диалогового окна элементы управления не могут быть добавлены или удалены, но существующие элементы управления можно скрыть или отключить в любое время. Их ярлыки также можно изменить в любое время.

При использовании Delphi можно легко использовать этот интерфейс для добавления настраиваемых элементов управления в стандартные системные диалоговые окна. Я добавил новый пример проекта на GitHub, чтобы продемонстрировать это. Проект был создан с помощью Delphi 10.3.3, но пользовательский код должен быть обратно совместим с большинством более старых версий.

Этот снимок экрана получен после запуска этого примера проекта и нажатия кнопки "Проверить OpenFile":

Типичный шаблон использования TFileOpenDialog заключается в том, чтобы поместить его в форму, установить желаемые типы файлов и ответить на какое-либо событие кнопки OnClick простым кодом, реагирующим на If MyDialog.Execute()

Чтобы настроить диалоговое окно, продолжайте выполнять те же шаги, но вам также необходимо ввести несколько новых действий, как описано ниже.

Событие OnExecute:

Вам нужно создать событие OnExecute, чтобы добавить любые настраиваемые элементы управления в диалоговое окно "Файл" перед его отображением. В этом примере я добавил один ComboBox, заполненный тремя вариантами. Обратите внимание, что большинство настраиваемых элементов управления являются «контейнерами» и имеют описание при создании. Это описание становится меткой рядом с контейнером.

Событие OnFileOkClick:

Это событие выполняется, когда пользователь нажимает кнопку "ОК" в диалоговом окне "Файл". Существует логический параметр CanClose, который можно настроить для отмены действия, если это необходимо.

Вам нужно захватить выбранный элемент пользовательского элемента управления и отменить событие или сохранить это значение где-нибудь. Поскольку в этом примере есть только один настраиваемый элемент управления, и он имеет простой числовой результат, я решил использовать свойство .Tag диалогового окна для сохранения выбора пользователя:

Измененный ответ на выполнение

С двумя дополнительными событиями выше мы добавили настраиваемое поле со списком и установили выбор пользователя для свойства .Tag. Теперь вам просто нужно настроить свой стандартный код .Execute, чтобы использовать это выбранное значение. В этом демонстрационном проекте мы просто отображаем выделение:

Дополнительные примечания из документации Microsoft:

Контейнерные элементы управления — это элементы управления, к которым можно добавлять элементы. Контейнерные элементы управления включают в себя поля со списком, меню, раскрывающийся список, прикрепленный к кнопке «Открыть», и любые группы переключателей. Порядок, в котором элементы отображаются в контейнере, соответствует порядку их добавления. Нет возможности их переупорядочить. Идентификаторы привязаны к родительскому элементу управления. Элементы управления контейнера, за исключением меню, имеют выбранный элемент.

Элементы с элементом управления-контейнером не могут быть изменены после их создания, за исключением их включенного и видимого состояния. Однако их можно добавлять и удалять в любое время. Например, если вам нужно изменить текст меню, вам придется удалить текущее меню и добавить другое с правильным текстом.

IFileDialogCustomize доступен для операционных систем Windows Vista и более поздних версий. Более точные разработчики захотят проверить каждый вызов метода IFileDialogCustomize на предмет возвращаемого значения HRESULT (обычно с помощью OleCheck). Я не учел этого, чтобы код было легче читать.

Сводка

Используя Delphi, вы можете легко добавлять настраиваемые элементы управления в системные диалоговые окна файлов через COM-интерфейс IFileDialogCustomize. Одним из примеров использования может быть запрос выбора кодировки у пользователя при открытии текстовых файлов. На самом деле Delphi предоставляет специальный компонент для этой задачи в TOpenTextFileDialog, но он может использовать старый файловый диалог до Vista. (См. это обсуждение StackOverflow о различиях между старым TOpenDialog и новым TFileOpenDialog.)

Для дальнейшего чтения

Delphi COM Programming — это книга Эрика Хармона, фактически являющаяся справочным руководством по COM и Delphi.

Его можно определить, перетащив значок открытого диалогового окна с вкладки "Диалоги" в Delphi или определив переменную TOpenDialog.

Топендиалог можно настроить в соответствии с вашими потребностями. При его использовании вы должны выполнить следующие шаги:

Создание диалогового объекта

Вы определяете переменную TOpenDialog, а затем назначаете ей новый объект TOpenDialog:

var
openDialog : TOpenDialog;
начать
openDialog := TOpenDialog.Create(self);

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

Параметры настройки

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

Свойство Title
Используется для установки заголовка диалогового окна.

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

Свойство фильтра
Это позволяет отображать и выбирать только определенные типы файлов. Текст фильтра отображается в раскрывающемся списке под полем имени файла. В следующем примере выбираются только текстовые файлы:

openDialog.Filter := 'Только текстовые файлы|*.txt';

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

openDialog.Filter := 'Только файлы Text и Word|*.txt;*.doc';

Выше мы разрешили два разных типа файлов, разделенных ;.

openDialog.Filter := 'Текстовые файлы|*.txt|Файлы Word|*.doc';

Выше мы разрешили текстовые файлы и файлы Word в качестве двух вариантов в раскрывающемся списке.

Свойство FilterIndex
Определяет, какой из выпадающих фильтров (начиная с 1) будет отображаться первым.

Свойство InitialDir
Устанавливает начальный каталог в диалоговом окне.

ofReadOnly Открывает файл только для чтения
ofFileMustExist Можно открыть только существующий файл
ofAllowMultiSelect Пользователь может выбрать 2 или более файлов

Отображение диалогового окна

Теперь мы вызываем метод TOpenDialog:

если openDialog.Execute
то .

Execute возвращает true, если пользователь выбрал файл и нажал OK. Затем вы можете использовать выбранный файл:

Завершение работы с диалоговым окном

Выбранный файл или файлы получаются с использованием следующих свойств:

Свойство FileName
Содержит полный путь и имя выбранного файла

Свойство Files
Содержит полный путь и имя файла для выбора нескольких файлов. Имена файлов хранятся в возвращаемом значении TStrings (дополнительную информацию о списках строк см. в TStringList).

Наконец, мы должны освободить объект диалога:

Файлы проекта Delphi
Файлы Delphi pascal — это отображается в начале

Диалог располагается в текущем каталоге (который будет
каталогом проекта Delphi при запуске кода из
Delphi).

Если вы выберете файл, например 'Unit1.pas', он будет отображаться
в диалоговом окне ShowMessage следующим образом:

Зарко Гайич имеет опыт работы с SQL и практические знания систем баз данных, таких как MS SQL Server, Firebird, Interbase и Oracle. Он также владеет XML, DHTML и JavaScript.

Работая с различными приложениями Windows и Delphi, мы привыкли работать с одним из стандартных диалоговых окон для открытия и сохранения файла, поиска и замены текста, печати, выбора шрифтов или установка цветов.

В этой статье мы рассмотрим некоторые наиболее важные свойства и методы этих диалогов, уделив особое внимание диалоговым окнам Открыть и Сохранить.

Обычные диалоговые окна находятся на вкладке "Диалоги" палитры компонентов. Эти компоненты используют стандартные диалоговые окна Windows (расположенные в DLL в вашем каталоге \Windows\System). Для использования общего диалогового окна нам необходимо разместить на форме соответствующий компонент (компоненты). Общие компоненты диалогового окна не являются визуальными (не имеют визуального интерфейса во время разработки) и поэтому невидимы для пользователя во время выполнения.

TOpenDialog и TSaveDialog

  • Свойства параметров очень важны для определения окончательного внешнего вида коробки.Например, такая строка кода, как:, сохранит уже установленные параметры и позволит пользователям выбрать более одного файла в диалоговом окне, а также создаст сообщение об ошибке, если пользователь попытается выбрать несуществующий файл.
  • Свойство InitialDir используется для указания каталога, который будет использоваться в качестве начального каталога при отображении диалогового окна файла. Следующий код гарантирует, что начальный каталог диалогового окна «Открыть» является каталогом запуска приложений.
  • Свойство Filter содержит список типов файлов, из которых пользователь может выбирать. Когда пользователь выбирает тип файла из списка, в диалоговом окне отображаются только файлы выбранного типа. Фильтр можно легко настроить во время разработки в диалоговом окне "Редактор фильтров".
  • Чтобы создать маски файлов в программном коде, присвойте свойству Filter значение, состоящее из описания и маски, разделенных вертикальной чертой (вертикальной чертой). Вот так:
  • Свойство FileName. После того как пользователь нажмет кнопку "ОК" в диалоговом окне, это свойство будет содержать полный путь и имя выбранного файла.

Выполнить

Для фактического создания и отображения общего диалогового окна нам необходимо обработать метод Execute определенного диалогового окна во время выполнения. За исключением TFindDialog и TReplaceDialog, все диалоговые окна отображаются в модальном режиме.

Все стандартные диалоговые окна позволяют определить, нажимает ли пользователь кнопку "Отмена" (или нажимает клавишу ESC). Поскольку метод Execute возвращает значение True, если пользователь нажал кнопку OK, мы должны перехватить нажатие кнопки Cancel, чтобы гарантировать, что данный код не будет выполнен.

Этот код отображает диалоговое окно "Открытие файла" и отображает выбранное имя файла после "успешного" вызова метода execute (когда пользователь нажимает кнопку "Открыть").

Примечание: Execute возвращает True, если пользователь нажал кнопку OK, дважды щелкнул имя файла (в случае диалоговых окон файлов) или нажал Enter на клавиатуре. Execute возвращает значение False, если пользователь нажал кнопку "Отмена", нажал клавишу Esc, закрыл диалоговое окно с помощью кнопки закрытия системы или комбинации клавиш Alt-F4.

Из кода

Чтобы работать с диалоговым окном Открыть (или любым другим) во время выполнения без размещения компонента OpenDialog на форме, мы можем использовать следующий код:

Примечание. Перед вызовом Execute мы можем (должны) установить любые свойства компонента OpenDialog.

Мой Блокнот

Наконец-то пришло время заняться настоящим программированием. Вся идея этой статьи (и некоторых других, которые будут опубликованы) состоит в том, чтобы создать простое приложение MyNotepad — отдельное приложение для Windows, похожее на приложение «Блокнот».
В этой статье нам представлены диалоговые окна «Открыть» и «Сохранить», так что давайте посмотрим на них в действии.

Этапы создания пользовательского интерфейса MyNotepad:
. Запустите Delphi и выберите Файл-Новое приложение.
. Поместите на форму один Memo, OpenDialog, SaveDialog и две кнопки Button.
. Переименуйте Button1 в btnOpen, Button2 в btnSave.

Кодирование

<р>1. С помощью инспектора объектов назначьте событию FormCreate следующий код:

Этот код устанавливает некоторые свойства диалогового окна "Открыть", как обсуждалось в начале статьи.

<р>2. Добавьте этот код для события Onclick кнопок btnOpen и btnSave:

Запустите свой проект. Вы не можете в это поверить; файлы открываются и сохраняются так же, как в «настоящем» блокноте.

Его можно определить, перетащив значок открытого диалогового окна с вкладки "Диалоги" в Delphi или определив переменную TOpenDialog.

TOpenDialog можно настроить в соответствии с вашими потребностями. При его использовании вы должны выполнить следующие шаги:

Создание диалогового объекта

Вы определяете переменную TOpenDialog, а затем назначаете ей новый объект TOpenDialog:

var
openDialog : TOpenDialog;
начать
openDialog := TOpenDialog.Create(self);

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

Параметры настройки

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

Свойство Title
Используется для установки заголовка диалогового окна.

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

Свойство фильтра
Это позволяет отображать и выбирать только определенные типы файлов. Текст фильтра отображается в раскрывающемся списке под полем имени файла. В следующем примере выбираются только текстовые файлы:

openDialog.Filter := 'Только текстовые файлы|*.txt';

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

openDialog.Filter := 'Только файлы Text и Word|*.txt;*.doc';

Выше мы разрешили два разных типа файлов, разделенных ;.

openDialog.Filter := 'Текстовые файлы|*.txt|Файлы Word|*.doc';

Выше мы разрешили текстовые файлы и файлы Word в качестве двух вариантов в раскрывающемся списке.

Свойство FilterIndex
Определяет, какой из выпадающих фильтров (начиная с 1) будет отображаться первым.

Свойство InitialDir
Устанавливает начальный каталог в диалоговом окне.

ofReadOnly Открывает файл только для чтения
ofFileMustExist Можно открыть только существующий файл
ofAllowMultiSelect Пользователь может выбрать 2 или более файлов

Отображение диалогового окна

Теперь мы вызываем метод TOpenDialog:

если openDialog.Execute
то .

Execute возвращает true, если пользователь выбрал файл и нажал OK. Затем вы можете использовать выбранный файл:

Завершение работы с диалоговым окном

Выбранный файл или файлы получаются с использованием следующих свойств:

Свойство FileName
Содержит полный путь и имя выбранного файла

Свойство Files
Содержит полный путь и имя файла для выбора нескольких файлов. Имена файлов хранятся в возвращаемом значении TStrings (дополнительную информацию о списках строк см. в TStringList).

Наконец, мы должны освободить объект диалога:

Файлы проекта Delphi
Файлы Delphi pascal — это отображается в начале

Диалог располагается в текущем каталоге (который будет
каталогом проекта Delphi при запуске кода из
Delphi).

Если вы выберете файл, например 'Unit1.pas', он будет отображаться
в диалоговом окне ShowMessage следующим образом:

Читайте также: