Диалоговые компоненты

Невизуальные компоненты 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 запрещает использование длинных имен файлов

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 со страницы Sys­tem). После щелчка на кнопке «Готово» остаются видимы­ми только текст поздравления и рисунок, звучит выбранная мелодия.

10. Используя компонент MediaPlayer, создайте программу, кото­рая с помощью компонентов DirectoryListBox, DriveComboBox, FlleListBox, FilterComboBox позволяет составить список тре­ков (они заносятся в компонент ListBox). Программа работа­ет в фоновом режиме, проигрывая все файлы из списка по порядку. После того как проиграны все файлы, выводится со­общение и пользователю предлагается изменить список либо оставить его прежним. Для изменения списка добавь­те на форму кнопки «Очистить все», «Удалить файл». Моди­фицируйте программу, сделав возможным сохранение спис­ка. При запуске программы пользователь выбирает либо создание нового списка, либо использование сохраненного.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: