Кроме сообщений, в прикладных программах широко используются диалоговые окна открытия и сохранения файлов, печати, выбора параметров шрифта и т.п. Для реализации диалогов подобного типа в интегрированной среде Delphi существуют специальные стандартные компоненты, расположенные на странице Dialogs палитры компонентов.
Компоненты вызова стандартных диалогов
Windows для открытия и
сохранения файлов OpenDialog
(
),
SaveDialog
(
)
и OpenPictureDialog
(
),
SavePictureDialog
(
)
отображают соответствующие модальные
диалоговые окна Windows.
Компоненты OpenDialog
и SaveDialog
работают с файлами любого типа, а
компоненты OpenPictureDialog
и SavePictureDialog
– с файлами изображений.
Открытие соответствующего диалога осуществляется методом Execute. Если в диалоге пользователь нажмет кнопку "Открыть" ("Сохранить"), диалог закрывается, метод Execute возвращает true и выбранный файл отображается в свойстве компонента-диалога FileName. Если же пользователь отказался от диалога (нажал кнопку "Отмена" или клавишу Esc), то метод Execute возвращает false.
Значение свойства FileName можно задать и перед обращением к диалогу. Тогда оно появится в диалоговом окне как значение по умолчанию. Таким образом, например, код выполнение команды "Сохранить как ...", в результате выполнения которой в файле с выбранным именем необходимо сохранить текст окна редактирования Memo1, может иметь вид:
With SaveDialog1 do BEGIN
FileName:=FName; // имя по умолчанию
if Execute then begin
FName:=FileName;
Memo1.Lines.SaveToFile(FName);
end;
END;
В этом коде предполагается, что имя файла хранится в строковой переменной FName. Перед вызовом диалога это имя передается в него как имя файла по умолчанию, а после выбора пользователем файла, его выбор запоминается в той же переменной, и текст сохраняется в выбранном файле методом SaveToFile класса TMemo.
Другой компонент FontDialog
(
)
вызывает стандартный диалог Windows
для выбора шрифта. Открытие диалога
также осуществляется методом Execute.
Если в диалоге выбрана кнопка "ОК"
(или нажата клавиша Enter),
диалог закрывается, метод Execute
возвращает true
и выбранные атрибуты шрифта передаются
в свойство Font
компонента-диалога. Если же пользователь
отказался от диалога (нажал кнопку
"Отмена" или клавишу Esc),
то метод Execute
возвращает false.
Значение свойства Font также можно задать перед вызовом диалогового окна. Тогда оно определит значения атрибутов шрифта по умолчанию, которые увидит пользователь в момент открытия диалога. Таким образом, например, выполнение команды "Шрифт", по которой пользователь может задать текущее значение шрифта для компонента RichEdit1, может иметь вид:
// Задание в качестве атрибутов по умолчанию
// атрибутов шрифта текущей позиции курсора в тексте
FontDialog1.Font.Assign(RichEdit1.SelAttributes);
// Открытие диалога
if(FontDialog1.Execute) then
RichEdit1.SelAttributes.Assign(FontDialog1.Font);
Свойство Device определяет, из какого списка возможных шрифтов будет предложен выбор в диалоговом окне: fdScreen – из списка экрана (по умолчанию), fdPrinter – из списка принтера, fdBoth – из обоих.
Свойство Options содержит множество опций диалога. Например, если установить опцию fdApplyButton, то в диалоговом окне появится еще одна кнопка "Применить", при нажатии которой возникает событие OnApply, в обработчике которого можно написать код, применяющий выбранные атрибуты без закрытия диалогового окна. Например:
RichEdit1.SelAttributes.Assign(FontDialog1.Font);
RichEdit1.Invalidate; // перерисовать компонент
Тогда можно, не прерывая диалога, наблюдать изменения непосредственно в окне RichEdit1, нажимая в диалоговом окне кнопку "Применить". При работе с компонентом класса TMemo аналогичный оператор может иметь вид:
Memo1.Font.Assign(FontDialog1.Font);
Свойства MaxFontSize и MinFontSize устанавливают ограничения на максимальный и минимальный размеры шрифта (действуют только при включенной опции fdLimitSize).
Компонент ColorDialog
(
)
отображает диалоговое окно Windows
для выбора цветов. Диалог активизируется
методом Execute.
Когда пользователь выбирает цвет и
нажимает "OK", диалог закрывается,
и выбранный цвет сохраняется в свойстве
Color.
Для визуализации диалоговых окон,
связанных с печатью, в Delphi
существуют компоненты PrinterSetupDialog
(
)
для отображения диалога установки
параметров принтера и
PrintDialog
(
),
который отображает стандартное диалоговое
окно для посылки заданий на принтер. В
последнем можно выбрать принтер и
установить его свойства, указать число
копий и последовательность их печати,
печатать в файл или непосредственно на
принтер, выбрать печатаемые страницы
или печатать только выделенный фрагмент
и т.д. Отметим, что компонент PrintDialog
не осуществляет печать. Он только
позволяет пользователю задать атрибуты
печати, которые могут быть прочитаны
приложением как ряд свойств. А сама
печать должна осуществляться программно
с помощью объекта типа TPrinter
или иным путем.
Задачи поиска и замены текстовых
фрагментов реализуются с помощью
компонентов FindDialog
(
,
отображает диалоговое окно поиска в
тексте заданного фрагмента) и ReplaceDialog
(
,
диалог контекстного поиска и замены).
Диалоги вызываются методом Execute. Сами по себе компоненты не осуществляют ни поиска, ни замены, они только обеспечивают интерфейс с пользователем. Поиск и замена должна осуществляться программно с помощью обработки событий OnFind (происходит при нажатии в диалоговом окне кнопки "Найти далее") и OnReplace (использование кнопок "Заменить" или "Заменить все", причем идентификация осуществляется по значениям флагов frReplace и frReplaceAll).
Задачи управления конфигурацией, т.е. начальная инициализация или настройки проектируемого приложения изначально (в 16-разрядных версиях Windows 3.x) решались с помощью текстовых INI-файлов. Работу с такими файлами проще всего осуществлять с помощью создания в приложении объекта типа TIniFile.
В них сохраняемая информация о различных настройках логически группируется в разделы, каждый из которых начинается оператором заголовка, заключенным в квадратные скобки (например, [Desktop]). В строках, следующих за заголовком, содержится информация, относящаяся к данному разделу, в форме: <ключ>=<значение> или <keyname>=<value>.
Начиная с Windows 95, использование INI-файлов не рекомендовано и вместо типа TIniFile, инкапсулирующего свойства подобных файлов, используются типы TRegistry, TRegIniFile и TRegistryIniFile, инкапсулирующие свойства системного реестра (registry).
Реестр – это база данных для хранения информации о системной конфигурации аппаратуры, о Windows и о приложениях Windows. Реестр имеет иерархическую организацию, которая содержит много уровней ключей, субключей и параметров. В реестре данные делятся на две категории: характеризующие компьютер и характеризующие пользователя. Характеристики компьютера включают в себя все, связанное с техническими средствами, а также с установленными приложениями и их конфигурацией. Характеристики пользователя включают в себя установки по умолчанию для экрана, пользовательские конфигурации, информацию о выбранных пользователем принтерах, установки сети и т.д.
Шесть основных ключей реестра содержат все субключи и записи низшего уровня. Четыре ключа верхнего уровня предназначены для характеристик компьютера:
Hkey_Local_Machine – информация о компьютере, включая конфигурацию установленной аппаратуры и программного обеспечения;
Hkey_Current_Config – информация о текущем оборудовании;
Hkey_Dyn_Data – динамические данные о состоянии, используемые процедурами plug-and-play;
Hkey_Classes_Root – информация об OLE, drag&drop, клавишах быстрого доступа и пользовательском интерфейсе.
Два ключа верхнего уровня, предназначенные для характеристик пользователя:
Hkey_Users – информация о пользователях, включая установки экрана и приложений;
Hkey_Current_User – информация о пользователе, зарегистрированном в данный момент.
Реестр хранится в файле SYSTEM.DAT в каталоге Windows. Просмотр и редактирование реестра осуществляется стандартным в Windows редактором реестра REGEDIT.EXE.
Хотя разработчики Windows и не рекомендуют использование INI-файлов, тем не менее их логически естественная структура и доступность для редактирования в любом текстовом редакторе предопределили их предпочтительность по сравнению с использованием реестра, особенно для прикладных программных средств. Отметим, что логическая организация INI-файлов подходит и для хранения расчетных данных.
Когда в приложении создается объект типа TIniFile, ему передается как FileName (и это единственное свойство данного класса) имя файла, с которым он связан, причем расширение может быть любым. Методы TIniFile позволяют читать информацию из файла, записывать, удалять разделы и т.п.
Например, оператор создания объекта Ini типа TIniFile и связывания его с файлом MyConfig.cfg, находящемся в одном каталоге с проектируемым программным обеспечением, имеет следующий вид.
var Ini:TIniFile;
...
Ini:=TIniFile.Create('MyConfig.cfg');
Следующий оператор проверяет наличие в файле раздела My Section, содержащего ключ MyKey.
if Ini.ValueExists('My Section','MyKey') then ...
Следующий оператор заносит в ключ MyKey раздела My Section значение '5'.
Ini.WriteInteger('My Section','MyKey',5);
Следующий оператор удаляет ключ MyKey раздела My Section.
Ini.DeleteKey('My Section','MyKey');
Следующие операторы сохраняют содержимое объекта Ini в файле на диске и разрушают объект Ini.
Ini.UpdateFile;
Ini.Free;
Вместо класса TINIFile возможно применение объектов типа TStringList, близких по возможностям.