Диалоговые компоненты
Невизуальные компоненты Delphi
Невизуальные компоненты представляют собой, как правило, компоненты, с помощью которых осуществляется доступ к системным ресурсам. Они отображаются только во время конструирования интерфейса, но не видны во время работы приложения. Примером таких компонентов служит компонент Timer, который был использован при разработке игры «Жизнь». Кроме него к невизуальным компонентам относят диалоговые компоненты и компоненты-меню.
Диалоговые компоненты
В Win32 диалоговым окном называется окно стандартного размера без кнопок максимизации и минимизации. Диалоговые окна позволяют управлять различными режимами работы программы и сообщать ей необходимую информацию. Диалоговое окно может пересылать сообщения, задавать вопросы и принимать ответы.
Выделяют два вида диалоговых окон — модальные и немодальные. Модальные диалоговые окна сохраняют фокус ввода до закрытия окна. Немодальные диалоговые окна позволяют переключаться в другие окна без закрытия данного окна.
Компонент | Диалоговая панель |
OpenDialog | выбор открываемого файла по шаблону |
SaveDialog | создание файла |
FontDialog | выбор шрифта и его характеристик |
ColorDialog | выбор цвета |
PrintDialog | вывод на устройство печати |
PrinterSetupDialog | панель настройки устройства печати |
FindDialog | панель поиска |
ReplaceDialog | панель замены |
OpenPictureDialog | выбор графического изображения с просмотром |
SavePictureDialog | сохранение графического изображения с просмотром |
Библиотека VCL Delphi содержит 10 компонентов, реализующих стандартные диалоговые панели, используемые многими Windows-приложениями. Эти компоненты расположены в панели компонентов на странице Dialogs. Компоненты и реализуемые ими стандартные диалоговые панели перечислены в таблице на предыдущей странице.
8.1.1. Основные правила использования диалоговых панелей
Работа со стандартными диалоговыми окнами осуществляется в три этапа.
Вначале на форму помещается соответствующий компонент и осуществляется настройка его свойств. Настройка свойств может проходить как на этапе конструирования, так и в ходе выполнения программы. Как и для любых других компонентов, программист не должен заботиться о вызове конструктора и деструктора диалогового окна — эти вызовы реализуются автоматически в момент старта и завершения программы.
На втором этапе осуществляется вызов стандартного для диалоговых компонентов метода Execute, который отображает соответствующее диалоговое окно. Вызов этого метода обычно располагается внутри обработчика какого-либо события. Например, для отображения стандартного диалогового окна сохранения файла в ответ на выбор пункта меню Файл/Сохранить может быть выполнен оператор:
If SaveDialogl. Execute Then ...
а обработчик нажатия кнопки Save может вызвать такой же метод у компонента TSaveDialog и т. д. Только после обращения к методу Execute на экране появляется соответствующее диалоговое окно. Стандартное окно диалога является модальным окном, поэтому сразу после обращения к Execute дальнейшее выполнение программы приостанавливается до тех пор, пока пользователь не закроет окно.
Метод Execute является логической функцией, которая возвращает значение True, если результат диалога с пользователем был успешным. Проанализировав результат выполнения метода Execute, программа может выполнить третий этап — использование введенных с помощью диалогового окна данных — имени файла, настроек принтера, выбранного шрифта и т. д.
Упражнение 8.1. Создайте приложение, которое использует компонент ColorDialog для изменения цвета формы.
Решение
Создайте каталог Dialogl, файл модуля сохраните в файле Main.pas, файл проекта — ChangeColor.dpr.
Поместите на форму компоненты ColorDialog и Button (измените значения свойства Caption на «Изменить цвет», Name — «ChangeBtn»).
Создайте обработчик события OnClick кнопки:
procedure TForml.ChangeBtnClick {Sender: TObject); begin
If ColorDialogl.Execute then
{отображение стандартного диалогового окна выбора цвета} Color:=ColorDialogl.Color;
{значение, возвращенное диалоговым окном, присваивается
свойству Color формы}
end;
Эксперимент. Сохраните файлы проекта. Запустите приложение. Убедитесь, что компонент ColorDialog работает как стандартное диалоговое окно выбора цвета. Определите значение, возвращаемое методом Execute при выборе кнопок ОК и Cancel.
Аналогичным образом используются другие стандартные диалоговые компоненты. Заметим, что для всех компонентов, кроме PrinterSetupDialog, метод Execute является функцией.
8.1.2. Компоненты OpenDialog и SaveDialog
Компонент OpenDialog позволяет выбрать открываемый файл по заданному шаблону.
Компонент SaveDialog используется для выбора имени файла, в котором будет сохраняться информация.
FileName содержит маршрут поиска и выбранный файл при успешном завершении диалога;
Default Ext определяет расширение файла по умолчанию: если при задании имени файла пользователь не указал расширение, то к имени файла будетсдобавлена разделительная точка и значение этого свойства;
Filter используется для выбора файлов, отображаемых
в диалоговом окне. Для определения фильтра можно воспользоваться редактором свойства. Свойство можно устанавливать с помощью специального редактора или программно:
OpenDialogl.Filter: ='Текстовые файлы| * . txt |Файлы Паскаля|*.pas;*.dpr1;
Символы « | » служат для разделения фильтров друг от друга, а также для разделения описания фильтруемых файлов от соответствующей маски выбора;
Filterlndex указывает, какой из заданных шаблонов отображается в списке. По умолчанию значение этого свойства равно 1;
InitialDir задает название каталога, содержимое
которого будет отображаться при вызове диалогового окна. Если значение этого свойства не задано, то отображается содержимое текущего каталога;
Title задает текст заголовка диалогового окна;
Options позволяет определить настройки диалогового окна
Значение | Описание (при установленном значении True) |
ofAllowMultiSelect | позволяет одновременно выбрать из списка более одного файла |
ofCreatePrompt | при вводе имени несуществующего файла отображает окно, которое запрашивает подтверждение на создание этого файла |
ofExtensionDifferent | расширение имени выбранного файла отлично от расширения, заданного свойством DefaultExt |
ofFileMustExist | при вводе имени несуществующего файла выдается предупреждающее сообщение |
ofHideReadOnly | переключатель Read Only (только для чтения) не отображается |
Значение | Описание (при установленном значении True) |
ofNoChangeDir | после закрытия диалогового окна изменения текущего каталога не происходит (выбранный пользователем каталог не сохраняется) |
ofNoReadOnlyReturn | файлы с атрибутом «только для чтения» не отображаются |
ofNoTestFileCreate | при создании файла приложение должно само отслеживать правильность создания файла |
ofNoValidate | пользователь не информируется о вводе недопустимых в именах файлов символов |
ofOverWritePrompt | попытка сохранения файла поверх уже существующего приводит к отображению предупреждающего сообщения |
ofReadOnly | при начальном отображении диалогового окна установлен флажок Read Only (при отключенном значении ofHideReadOnly) |
ofPathMustExist | пользователь может указывать только существующие каталоги |
ofShareAware | ошибки доступа к файлу игнорируются |
ofShowHelp | диалоговое окно содержит кнопку Help |
ofOldStyleDialog | создает диалог в стиле Windows 3.x |
ofNoNetWorkButton | запрещает вставку кнопки для создания сетевого диска (при включенном ofOldStyleDialog) |
ofNoLongNames | запрещает использование длинных имен файлов |
return false">ссылка скрыта
8.1.3. Компонент FontDialog
Компонент FontDialog используется для вызова стандартного диалогового окна выбора шрифтов и их характеристик.
Device позволяет указать тип устройства, для которого
выбираются шрифты:
fdScreen — экран;
fdPrinter — принтер;
fdBoth — шрифты, поддерживаемые и экраном, и принтером;
MinFontSize, этими свойствами определяется диапазон MaxFontSize возможных значений размеров шрифтов.
Значения этих свойств задаются в пунктах
(1 пункт равен 1/72 дюйма, что приблизительно равно 0.36 мм). Если свойства содержат 0, то ограничения на размер шрифта отсутствуют;
Font содержит результат выбора шрифта;
Options задает ряд опций диалоговой панели выбора шрифтов:
Значение | Описание (при установленном значении True) |
fdAnsiOnly | пользователь может выбирать только шрифты, в которых находится набор символов, поддерживаемых Windows |
fdEffects | в диалоговом окне будут отображены группа кнопок Effects и список Color |
fdFixedPitchOnly | в списке шрифтов приводятся только моноширинные шрифты |
fdForceFontExist | при вводе имени несуществующего шрифта выдается предупреждающее сообщение |
fdNoFaceSel | при начальном отображении диалогового окна ни один шрифт не выбран |
fdNoOEMFonts | запрещает выбор шрифтов MS-DOS |
fdNoVectorFonts | исключает векторные шрифты (шрифты для Windows 1.0; используются в плоттерах) |
fdNoSimulations | отображаются только реальные шрифты, а не синтезированные графическим интерфейсом Windows |
fdNoSizeSel | при начальном отображении диалогового окна ни один размер не выбран |
Значение | Описание (при установленном значении True) |
fdNoStyleSel | при начальном отображении диалогового окна ни один стиль шрифта не выбран |
fdShowHelp | в диалоговом окне находится кнопка Help |
fdTrueTypeOnly | в списке шрифтов отображаются только TrueType-шрифты |
fdWysiwyg | в списке шрифтов отображаются только шрифты, доступные и для экрана, и для принтера |
fdLimitSize | включает ограничения на размер шрифта, заданные свойствами MinFontSize и MaxFontSize |
fdScalableOnly | включает только масштабируемые шрифты (векторные и TrueType) |
fdApplyButton | диалоговое окно содержит кнопку Apply |
Для того чтобы изменить шрифт компонента на значение, установленное в диалоговом окне, необходимо определить обработчик сообщения OnApply компонента FontDialog.
8.1.4. Компоненты PrintDialog и PrinterSetupDialog
Компоненты PrintDialog и PrinterSetupDialog предназначены для управления параметрами принтера и процессом печати.
8.1.5. Компонент ColorDialog
Компонент ColorDialog используется для вызова диалогового окна настройки цветов.
Color содержит выбранный цвет;
CustomColors содержит до 16 цветов, определенных пользователем. Каждая строка имеет такой формат: ColorX=HHHHHH, где X — буква от А до Р, определяющая номер цвета, НННННН — шестнадцатеричное представление цвета в формате RGB;
Options задает значения опций, определяющих настройку окна:
Значение | Описание (при установленном значении True) |
cdFullOpen | показывать с развернутым окном выбора цвета пользователя |
cdPreventFullOpen | запретить показ окна выбора цвета пользователем |
cdShowHelp | включить в окно кнопку Help |
cdSolidColor | выбирать ближайший сплошной цвет |
cdAnyColor | разрешить выбор несплошных цветов |
8.1.6. Компоненты FindDialog и ReplaceDialog
Компонент FindDialog используется для отображения стандартного диалогового окна, предназначенного для ввода искомой информации.
FindText устанавливает образец для поиска;
Options задает значения опций, определяющих настройку окна:
Значение | Описание (при установленном значении True) |
frDown | устанавливает направление поиска вперед по тексту. Это значение установлено по умолчанию |
frFindNext | устанавливается в True, когда пользователь нажимает кнопку Найти далее, в False — при закрытии окна |
frHideMatchCase | удаляет переключатель «С учетом регистра» |
frHideWholeWord | удаляет переключатель «Только слово целиком» |
frHideUpDown | удаляет кнопки выбора направления поиска |
frMatchCase | устанавливает флажок в переключателе «С учетом регистра» |
frDisableMatchCase | запрещает выбор переключателя «С учетом регистра» |
frDisableUpDown | запрещает использование кнопок выбора направления поиска |
frDisableWholeWord | Блокирует переключатель «Только слово целиком» |
Значение | Описание (при установленном значении True) |
frReplace | используется в компоненте TReplaceDialog, чтобы сообщить системе о необходимости замены текущего выбора |
frReplaceAll | используется в компоненте TReplaceDialog, чтобы сообщить системе о необходимости замены всех вхождений образца поиска |
frWholeWord | устанавливает флажок в переключателе «Только слово целиком» |
frShowHelp | включает в окно кнопку Help |
Диалоговое окно поиска является немодальным, т. е. реализована возможность просмотра найденного фрагмента и, при необходимости, продолжения поиска. С этой целью для компонента определено событие OnFind, которое возникает всякий раз, когда пользователь нажимает кнопку FindNext. Обработчик события должен содержать алгоритм поиска заданного образца в тексте и отображения его пользователю.
Компонент ReplaceDialog предназначен для ввода текста, который необходимо найти и заменить на указанный текст. Класс TReplaceDialog является прямым потомком класса TFindDialog и наследует от него большинство свойств.
Новое свойство ReplaceText определяет текст замены. Обработчик события OnReplace, которое происходит после нажатия кнопок Replace или ReplaceAll, должен содержать алгоритм замены найденного текста на текст, заданный значением свойства ReplaceText.
8.1.7. Компонент OpenPictureDialog
Компонент OpenPictureDialog является потомком класса TOpenDialog и предназначен для выбора графических изображений с возможностью их просмотра. Компонент OpenPictureDialog поддерживает графические изображения в следующих форматах:
BMP Windows Bitmap
ICO Icon
WMF Windows Metafile
EMF Enhanced Windows Metafile
Примечание. Форматы графических изображений определяются классом TPicture, используемым для просмотра изображений.
8.1.8. Компонент SavePictureDialog
Компонент SavePictureDialog является «потомком» класса TSaveDialog и предназначен для сохранения графических изображений с возможностью их предварительного просмотра в одном из форматов, поддерживаемых классом TPicture.
8.2. Компоненты-меню
Компоненты-меню MainMenu (главное меню) и PopupMenu (всплывающее меню) располагаются на странице Standartd палитры компонентов. Редакторы меню (рис. 8.2.1) позволяют создавать меню во время проектирования приложения и сразу же испытывать их по мере готовности. Для вызова редактора меню вызовите контекстное меню компонента.
Для определения свойств пунктов меню используется Инспектор объектов. Кроме того, редактор меню обладает всплывающим меню, которое обеспечивает быстрый доступ к наиболее часто используемым командам и доступ к шаблонам меню (Menu Template). Для вызова контекстного меню нажмите на правую кнопку мыши в окне редактора меню или комбинацию клавиш Alt+F10, когда курсор расположен в этом окне.
Всякий раз, когда пользователь нажимает кнопку мыши на элементе меню либо использует короткие клавиши или клавиши быстрого доступа, связанные с этим элементом, происходит событие OnClick.
Примечания
1. Разделительные линии используются для наглядного группирования родственных элементов меню, например элементы меню Файл, связанные с печатью (Параметры страницы..., Предварительный просмотр, Печать). Для добавления в меню разделительной линии используйте символ «-» (минус) в качестве значения свойства Caption.
2. Клавиша быстрого доступа — это подчеркнутая буква в элементе меню. Она может использоваться совместно с клавишей Alt для доступа прямо к этому элементу. Чтобы назначить клавишу быстрого доступа в свойстве Caption соответствующего пункта меню, поставьте символ «&» непосредственно перед буквой, которую хотите сделать клавишей быстрого доступа.
3. Горячая клавиша — это комбинация клавиш Ctrl+символ, которая дает непосредственный доступ к какой-либо функции меню, минуя само меню. Горячие клавиши обычно назначают часто используемым элементам меню. Горячая клавиша для элемента меню назначается через свойство Shortcut.
4. Ветви меню могут быть вложенными — прицеплены к элементам меню более высокого уровня в качестве подменю. Для того чтобы создать подменю, растущее из какого-то верхнего элемента, выделите этот элемент и нажмите комбинацию клавиш Ctrl+стрелка вправо.
Упражнение 8.2. Разработайте приложение «Текстовый редактор».
Решение
Создайте новый проект. Создайте каталог TextEdit, сохраните файл модуля под именем Main.pas, файл проекта — TextEdit.dpr.
В Windows-приложениях встречаются два основных стиля интерфейса пользователя. Все разработанные ранее приложения относились к SDI (Single Document Interface — однодоку-ментный интерфейс) приложениям. SDI-приложение состоит из одного главного окна и может использовать несколько дополнительных вторичных окон. SDI-приложения позволяют работать одновременно только с одним документом. Чтобы открыть другой документ, нужно закрыть текущий.
В MDI (Multiply Document Interface — многодокументный интерфейс) приложениях возможна работа одновременно с несколькими документами, при этом каждый документ отображается в собственном окне. Каждое дочернее окно по сути своей является главным, но оно содержится внутри родительского окна.
При разработке приложения «Текстовый редактор» используем многодокументный интерфейс.
1-й этап. Визуальное проектирование
Измените свойства главной формы следующим образом:
Свойство | Значение |
Caption | Текстовый редактор |
Name | MDIFile |
FormStyle | fsMDIForm |
Position | poDefault |
Положите на форму компонент MainMenu. Используя редактор меню, разработайте меню, показанное на рис. 8.2.2.
Измените значение свойства Name каждого элемента меню следующим образом:
Файл | MenuFileMIt |
Создать | FileNewMIt |
Открыть | FileOpenMIt |
Выход | FileExitMIt |
Справка | HelpMIt |
В Delphi меню определяется минимальным числом элементов меню. При добавлении дочернего окна меню главного и дочернего окон объединяются, порядок расположения пунктов меню определяется значением свойства Grouplndex.
Установите значение свойства Grouplndex элемента меню Файл равным 1, а Справка — 10.
Сохраните файлы проекта.
Для работы с текстовыми документами добавьте в проект новую форму. Сохраните модуль формы под именем Child.pas. Установите свойства дочерней формы следующим образом:
Caption | Новый файл |
Ctrl3D | False |
FormStyle | fsMDIChild |
Name | MDIChild |
Опустите на форму компонент RichEdit (страница Win32) и установите свойства следующим образом:
Align alClient
BorderStyle bsNone
ScrollBars ssBoth
Сохраните файлы проекта.
Эксперимент. Запустите проект. Как отображаются формы приложения? Объясните, почему так происходит. ♦
После запуска приложения появляются одновременно оба окна — главное и дочернее. Причина, по которой отображается окно MDIChild, связана с тем, как Delphi генерирует код. Когда в проект добавляется новая форма, Delphi автоматически создает глобальную переменную для новой формы в файле модуля, а к файлу проекта прибавляет строку, инициализирующую экземпляр соответствующего класса формы. Чтобы обойти это, удалите из файла проекта строку кода:
Application.CreateForm(TMDIChild, MDIChild);
Эксперимент. Запустите проект. Убедитесь в том, что при запуске приложения отображается только главная форма приложения. ♦
2-й этап. Создание программного кода
Создадим обработчик события выбора элемента меню главной формы Файл/Выход:
procedure TMDIFile.FileExitMItClick(Sender: TObject);
begin
Close;
end;
Эксперимент. Запустите проект. Что происходит при выборе пункта меню Файл/Выход? Объясните, почему так происходит. ♦
Добавьте обработчик события выбора меню Файл/Создать:
procedure TMDIFile.FileNewMItClick(Sender: TObject);
var MDIChild: TMDIChild;
begin
MDIChild := TMDIChild.Create(Self);
end;
Эксперимент. Сохраните и запустите проект. Создайте 5 файлов. Попробуйте выполнить различные манипуляции с окнами: переместить, изменить размеры, минимизировать и максимизировать, закрыть некоторые окна. Что происходит при выборе пункта меню Файл/Выход? Объясните, почему так происходит. ♦
При закрытии дочернего окна оно не закрывается, а минимизируется. Чтобы устранить этот недостаток, создайте обработчик события OnClose дочерней формы:
procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := CaFree;
end;
Вернемся к разработке визуального интерфейса дочернего окна: необходимо включить в меню главной формы опции меню дочернего окна. Положите на форму MDIChild компонент Main-Menu, создайте пункты меню дочернего окна и измените значения свойств следующим образом:
Элемент меню | Name | Group Index | Shortcut |
&Файл | FileMenuMIt | ||
Созд&ать | FileNewMIt | ||
&Открыть | FileOpenMIt | F3 | |
&3акрыть | FileCloseMIt | Alt+F3 | |
(разделитель) | |||
&Сохранить | FileSaveMIt | Ctrl+S | |
Со&хранить как... | FileSaveAsMIt | ||
(разделитель) | |||
&Выход | FileExitMIt | AU+F4 | |
&Формат | FormatMIt | ||
&Окно | WindowMIt | ||
&Упорядочить | WindowTileMIt | ||
&3акрыть все | WindowCloseAllMIt |
Элементы меню Формат и Окно дочерней формы, имеющие Grouplndex, равные 2 и 5 соответственно, помещаются между элементами Файл и Справка меню главного окна.
Эксперимент. Сохраните и запустите проект. Попробуйте создать несколько новых текстовых файлов.
Поскольку после создания нового файла меню главного окна приложения заменяется на меню дочерней формы, и, соответственно, события выбора пунктов меню адресуются не к окну главной формы, а к дочернему окну, то создание еще одногофайла становится невозможным. Чтобы исправить эту ошибку, создайте обработчик события OnClick пункта меню Файл/Создать дочернего окна:
procedure TMDIChild.FileNewMItClick(Sender: TObject);
begin
MDIFile.FileNewClick(Sender);
end;
Напишите аналогичный код для пункта меню Файл/Выход. Объясните различие между процедурами MDIChild.FileClose-MltClick и MDIChild.FileExitMItClick.
Запустите проект. Убедитесь в возможности создания более одного файла. ♦
Создадим обработчики выбора пунктов меню Окно.
procedure TMDIChild.WindowTileMItClick(Sender: TObject);
begin
MDIFIle.Tile; {упорядочить открытые окна}
end;
procedure TMDIChild.WindowCloseAllMItClick(Sender: TObject);
var i: Integer;
begin
with MDlFile do
for l:= 0 to MDIChildCount-1 do
{свойство MDIChildCount хранит значение количества дочерних окон} MDIChildren[i].Close;
{массив MDIChildren содержит указатели на дочерние окна}
end;
Эксперимент. Запустите проект. Убедитесь в работоспособности подпунктов меню Окно. ♦
Вернемся к разработке программного кода главной формы приложения. При обработке события выбора пункта меню Файл/Открыть необходимо знать имя открываемого файла — воспользуемся компонентом OpenDialog. Измените свойства компонента следующим образом:
Name FileOpenDialog
Options OfFileMustExist True
Filter Определите самостоятельно, предоставив возможность открытия текстовых файлов (*.txt), файлов Паскаля (*.pas; *.dpr), всех файлов (*.*)
Создайте обработчик события выбора пункта меню Файл/ Открыть:
procedure TMDIFile.FileOpenMItClick(Sender: TObject); var MDIChild: TMDIChild; begin
if FileOpenDialog.Execute then begin
MDIChild := TMDIChild.Create(Self); MDIChild.Open(FileOpenDialog.FileName); MDIChild.SetFocus;
{устанавливаем фокус клавиатуры на это окно} end; end;
Метод Open класса TMDIChild предназначен для открытия выбранного файла:
procedure TMDIChild.Open(const AFileName: string); begin
FileName := AFileName;
RichEditl.Lines.LoadFromFile(FileName); Caption := FileName; end;
В описание класса TMDIChild добавьте переменную FileName (раздел private) и заголовок процедуры Open (раздел public).
Эксперимент. Запустите приложение. Откройте любой файл с расширением .txt. Попробуйте открыть еще один файл. Почему не выполняется команда меню Файл/Открыть? Объясните и устраните эту ошибку. ♦
Задание для самостоятельного выполнения
1. Напишите программный код для пунктов меню Сохранить и Сохранить как...
8.2.1. Форматирование абзаца
Поместите на форму компонент Toolbar (страница Win32). Используя контекстное меню, поместите в него три новые кнопки (New Button) и разделитель (New Separator). Используя Image Editor, создайте для кнопок иконки «Выравнивание по правому краю», «Выравнивание по левому краю», «Выравнивание по центру» и отобразите их на кнопках панели инструментов.
Установите следующие значения свойств:
Свойство Style кнопок палитры инструментов определяет тип кнопки. Значение, равное tbsButton, определяет обычный вид кнопки, tbsCheck — в этом случае щелчок на кнопке приводит к изменению свойства Down (если кнопка выбрана, то она отображается вдавленной), tbsDropDown — кнопка отображается в виде раскрывающегося списка, tbsSeparator — создает расстояние между группами, tbsDivider — кнопка отображается как вертикальная разделительная линия.
Значение свойства Grouped, равное true, в последовательности расположенных рядом кнопок TbsCheck позволяет выделить не более одной кнопки одновременно.
Создайте обработчики событий нажатия на кнопки:
procedure TMDIChild.LeftTlbClick(Sender: TObject);
begin with Sender as TToolButton do
RichEditl.Paragraph.Alignment := TAlignment(Tag);
end;
Объектное свойство Paragraph класса TRichEdit содержит информацию о форматировании абзаца. Alignment (выравнивание по горизонтали) определяет внешний вид и ориентацию краев абзаца:
type TAlignment = (taLeftJustify, taRightJustify, taCenter);
соответственно TAlignment(O) принимает значение taLeftJustify — выравнивание по левому краю.
Эксперимент. Запустите приложение. Убедитесь, что при выделении кнопок происходит соответствующее выравнивание границ абзаца. ♦
Задания для самостоятельного выполнения
2. Дополните меню Формат командой Абзац. При выборе этой команды должно появляться диалоговое окно (рис. 8.2.3).
При выборе кнопки ОК должны вноситься соответствующие изменения в форматирование текущего абзаца (изучите свойства, описанные в классе TParaAttributes).
3. Модифицируйте программу так, чтобы при перемещении от абзаца, выровненного, например, по центру, к абзацу, выровненному по левому краю, производились соответствующие изменения в панели инструментов (кнопка «Выравнивание по левому краю» становилась активной).
8.2.2. Форматирование текста
Поместите на панель инструментов еще три кнопки и разделитель для изменения начертания выделенных символов (курсив, полужирный, подчеркивание). Создайте иконки для этих кнопок.
В Object Pascal свойство Font.Style поддерживается следующими типами:
TFontSty]e= {fsBold, fsltalic, fsUnderline, fsStrikeOut);
TFontStyles = set of TFontStyle;
Установите значения свойств кнопок следующим образом:
Напишите обработчики события нажатия на кнопки:
procedure TMDIChild.BoldTlbClick(Sender: TObject);
var Temp: TToolButton;
begin Temp := Sender as TToolButton;
{определяем, какая кнопка была нажата}
with RichEditl.SelAttributes do
{с выделенным фрагментом текста выполняем следующие действия}
if TFontStyle(Temp.Tag) in Style then
begin
{если стиль начертания был использован, то отменяем его}
Style := Style-[TFontStyle(Temp.Tag)]; Temp.Down := false end else
begin
{иначе применяем его}
Style := Style+[TFontStyle(Temp.Tag)]; Temp.Down :- true
end;
end;
Эксперимент. Запустите приложение. Убедитесь в правильности работы приложения. ♦
Задания для самостоятельного выполнения
4. Модифицируйте программу так, чтобы при перемещении между словами, выделенными различными стилями начертания, соответствующие изменения происходили в панели инструментов.
5. Поместите на панель компоненты для отображения
- размера символов;
- шрифта символов (Times New Roman и др.);
- цвета символов.
Создайте обработчики событий выбора этих компонентов.
6. Добавьте в меню Формат команду Шрифт. Напишите обработчик события выбора этого пункта меню, используя компонент FontDialog.
8.2.3. Элементы меню Правка
Используя команду Insert From Template.../Edit Menu контекстного меню редактора меню, добавьте в меню дочернего окна
элемент Правка. Измените свойство Caption подпунктов меню в соответствии с рис. 8.2.4 (лишние пункты меню удалите).
Создайте обработчик события подпункта меню Правка/Вырезать:
procedure TMDIChild.CopylClick(Sender: TObject);
begin Richeditl.CutToClipboard;
{заменяет содержимое буфера обмена на выделенный текст} end;
Эксперимент. Запустите приложение. Убедитесь в правильности работы меню Правка/Вырезать. Создайте обработчики событий выбора пунктов меню Правка/Копировать и Правка/Вставить. ♦
Для реализации пункта меню Правка/Найти воспользуемся компонентом FindDialog:
procedure TMDIChild.FindlClick(Sender: TObject);
begin
FindDialogl.Execute;
end;
После выбора кнопки Find Next у компонента FindDialogl возникает событие OnFind:
procedure TMDIChild.FindDialoglFind(Sender: TObject);
var FoundAt, N_Line: Longlnt;
StartPos, ToEnd: integer;
begin
with RichEditl do
begin
if SelLength <> 0 then
{если искомый фрагмент найден, но поиск продолжается}
StartPos := SelStart + SelLength
{следующий фрагмент начинаем искать за найденным фрагментом}
else StartPos := 0;
{иначе поиск начинаем с начала текста}
ToEnd := Length(Text) — StartPos;
{определяем длину фрагмента, в котором будет осуществляться поиск}
FoundAt := FindText(FindDialogl.FindText, StartPos, ToEnd, [stMatchCase]);
{последний параметр метода TRichEdit.FindText определяет опции поиска, в данном случае при поиске будет учитываться регистр}
if FoundAt о -1 then begin
{если искомый фрагмент найден}
SetFocus;
{выделяем найденный фрагмент:}
SelStart := FoundAt;
SelLength := Length{FindDialogl.FindText);
{определяем номер первой сроки найденного фрагмента:}
N_line := Richeditl.Perform(EM_LINEFROMCHAR, RichEditl.SelStart, 0);
{изменяем значение позиции полосы прокрутки, чтобы отобразить найденный текст:}
sendmessage(RichEditl.Handle, EM_SCROLLCARET, N_Line, Ob-end;
end;
end;
Эксперимент. Запустите приложение. Убедитесь в правильности работы меню Правка/Найти.
Установите в диалоговом окне Find флажок Match whole word only (только слово целиком). Правильно ли выполняется поиск? Используя свойство Options компонента FindDialogl, внесите исправления в код метода TMDIChild. FindDialogl Find. ♦
Задания для самостоятельного выполнения
7. Напишите обработчики событий выбора пунктов меню
- Правка/Заменить (воспользуйтесь компонентом Replace-Dialog);
- Правка/Специальная вставка... (воспользуйтесь проектом Fonts.dpr, разработанным в упр. 6.1.1).
8. Реализуйте команды Найти и Заменить для объекта типа TStrinList.
9. Создайте приложение «Музыкальная открытка». Приложение позволяет выбрать цвет формы, ввести текст поздравления, изменить шрифт текста, добавить рисунок и мелодию (воспользуйтесь компонентом MediaPlayer со страницы System). После щелчка на кнопке «Готово» остаются видимыми только текст поздравления и рисунок, звучит выбранная мелодия.
10. Используя компонент MediaPlayer, создайте программу, которая с помощью компонентов DirectoryListBox, DriveComboBox, Flle'">Подготовка к переговорам