Создание текстового редактора




1. Создайте новое приложение, выполнив команду New Application (Новое приложение) в меню File.

2. Сохраните проект. Для этого щелкните мышью на кнопке Save All (Сохранить Все) панели инструментов. Появится диалоговое окно для сохранения файла кода программы. В выбранном каталоге создайте новую папку «Текстовый редактор», щелкнув на кнопе Создание новой папки, и откройте ее. По умолчанию файлу дается расширение.pas. В поле Имя файла введите Main.pas и нажмите OK.После этого появится следующее диалоговое окно для сохранения файла проекта. По умолчанию файлу дается расширение.dpr (Delphi Project). Введите имя файла проекта TextEditor.dpr и нажмите ОК.

3. В меню Project выполните команду Options, затем в открывшемся диалоговом окне перейдите на вкладку Application (Приложение). В поле Title (Подпись) введите текст подписи - Текстовый редактор. Эта строка определяет заголовок приложения. По умолчанию название приложения совпадает с именем исполняемого (exe) файла программы.

Строка Icon определяет пиктограмму приложения, которая появляется на кнопке приложения в панели задач. Если пиктограмма не задана, то по умолчанию используется изображение факела. Задайте свою пиктограмму. Для этого нажмите кнопку Load Icon (Загрузить значок); в диалоговом окне выбора файла загрузите файл logo.ico из каталога Buttons (или любой созданный вами файл с расширением.ico). Выбранный вами образ пиктограммы запишется в файл ресурса (с расширением.res) проекта.

4. Поместите на форму следующие компоненты (см. рис.):

- cо страницы Win32 - два компонента ToolBar, StatusBar, RichEdit, ImageList;

- cо страницы StandartMainMenu и PopupMenu;

- cо страницы DialogsOpenDialog, SaveDialog, FontDialog, FindDialog, ReplaceDialog.

5. В окне Инспектора объектов выберите Form1. Задайте для него следующие свойства: Name (Имя) – MainForm; Caption (Заголовок) – Текстовый редактор, Position (Размещение) – poScreenCenter (по центру экрана), Width (Ширина) – 600, Height (Высота) – 400.

6. Выделите компонент RichEdit1. Этот компонент представляет собой многостраничный редактор форматированного текста. В отличие от компонента Memo страницы Standard текст в компоненте RichEdit подчиняется правилам Расширенного Текстового Формата (RTF – Rich Text Format) и может изменять такие свои характеристики, как шрифт, цвет, выравнивание и т.д. Атрибуты шрифта хранятся в свойстве TextAttributes. Доступ к атрибутам шрифта всего текста осуществляется через свойство редактора DefAttributes, а к выделенной части текста – через его свойство SelAttributes. Все эти свойства доступны только во время работы приложения.

Задайте для компонента RichEdit1 свойство Name – Editor. В Инспекторе объектов выделите свойство Align. Оно определяет вариант выравнивания компонента внутри контейнера, в котором находится этот компонент. В нашем случае в роли такого контейнера выступает форма MainForm. Выравнивание используется в тех случая, когда требуется, чтобы какой либо элемент занимал определенное положение относительно содержащего его контейнера, независимо от изменения размеров последнего. В данном случае необходимо, чтобы компонент Editor занимал всю незаполненную другими компонентами область формы, поэтому установите в свойстве Align – alClient.

Для того чтобы очистить содержимое объекта Editor, дважды щелкните в поле свойства Lines (Строки) и в открывшемся окне String List Editor удалите все строки.

В свойстве PopupMenu из списка выберите PopupMenu1. Теперь при нажатии правой кнопкой мыши по окну редактирования будет появляться всплывающее (контекстное) меню PopupMenu1.

7. Выделите компонент ImageList1. Он представляет собой контейнер для хранения множества рисунков одинакового размера. Нам он понадобится при создании кнопок панелей инструментов и пунктов меню.

Задайте для этого компонента свойство Name – ImageList. Затем дважды щелкните по нему мышью или выберите в его вспомогательном меню (щелчок правой кнопкой) опцию ImageList Editor. В появившемся окне редактора нажмите кнопку Add (Добавить) и выберите все файлы из каталога Buttons. В поле Images появится список изображений с номерами от 0 до 17.

8. Теперь создадим Главное меню приложения. Выделите MainManu1. Переименуйте его в MainMenu. В свойстве Images выберите ImageList.

Для создания опций меню дважды щелкните по компоненту левой кнопкой мыши, либо нажмите на нем правую кнопку и выберите Menu Disigner, либо щелкните по правой половине строки Items в Инспекторе объектов. Создайте меню со следующей структурой:

Файл Правка Формат Справка
Создать Отменить Шрифт… Вызов справки
Открыть… - Маркер -
Сохранить Вырезать   О программе…
Сохранить как… Копировать    
- Вставить    
Выход Очистить    
  Выделить все    
  -    
  Найти…    
  Заменить…    

В инспекторе объектов задайте всех пунктов следующие свойства:

Caption Name SortCut ImageIndex Hint
Создать FileNewItem Ctrl+N   Создание нового документа.
Открыть… FileOpenItem Ctrl+O   Открытие существующего документа.
Сохранить FileSaveItem Ctrl+S   Сохранение активного документа.
Сохранить как… FileSaveAsItem     Сохранение активного документа под новым именем.
Выход FileExitItem Alt+X   Завершение работы с приложением; сохранение документа.
Отменить EditUndoItem Ctrl+Z   Отмена последнего выполненного действия.
Вырезать EditCutItem Ctrl+X   Удаление выделенного фрагмента в буфер обмена.
Копировать EditCopyItem Ctrl+C   Копирование выделенного фрагмента в буфер обмена.
Вставить EditPasteItem Ctrl+V   Вставка в документ содержимого буфера обмена.
Очистить EditDeleteItem Del   Удаление выделенного фрагмента.
Выделить все EditSelectAll Ctrl+A   Выделение всего документа.
Найти… EditFindItem Ctrl+F   Поиск указанного образца текста.
Заменить… EditReplaceItem Ctrl+H   Замена одного текста другим.
Шрифт… FormatFontItem     Выбор шрифта для выделенного фрагмента.
Маркер FormatBulletItem     Добавление в начало строки маркера.
Вызов справки HelpHelpMeItem     Вывод содержания встроенной справки.
О программе HelpAboutItem     Выведение сведений о программе, ее версии и авторских правах.

Свойство ShortCut задает комбинацию клавиш для быстрого выбора данной опции. Свойство ImageIndex содержит индекс связанного с опцией изображения из компонента ImageList. Это изображение появляется слева от опции. Если свойство имеет значение -1, с опцией не связано никакого изображения.

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

9. Выделите PopupMenu1. Переименуйте его в PopupMenu. В свойстве Images выберите ImageList. Таким же образом, как и для MainMenu, создайте для него следующие опции

Caption ImageIndex Hint
Вырезать   Удаление выделенного фрагмента в буфер обмена.
Копировать   Копирование выделенного фрагмента в буфер обмена.
Вставить   Вставка в документ содержимого буфера обмена.
-    
Шрифт…   Выбор шрифта для выделенного фрагмента.
Маркер   Добавление в начало строки маркера.

10. Создание Панели инструментов. Выделите компонент ToolBar1. Он представляет собой инструментальную панель. Главная отличительна черта ToolBar – это способность гибкого управления дочерними элементами, которые он может группировать, выравнивать по размерам, располагать в несколько рядов. Он содержит специально разработанные для него инструментальные кнопки ToolButton, которые очень похожи на SpeedButton.

Кроме инструментальных кнопок ToolButton, на панель инструментов ToolBar можно помещать и другие управляющие компоненты, например, комбинированные списки ComboBox или однострочные редакторы Edit.

Для добавления к панели инструментов новой кнопки нужно щелкнуть по ней правой кнопкой мыши и выбрать пункт New Button (Новая кнопка) локального меню. В результате справа от имеющихся кнопок появится новая кнопка. Эти кнопки автоматически выравниваются и размещаются вплотную друг к другу. Чтобы выделить какую либо кнопку или их группу, в панель инструментов можно вставить разграничивающий промежуток (разделитель). Для этого в локальном меню следует задать команду New Separator (Новый разделитель).

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

Компонент ToolButton не имеет свойства для хранения картинки, однако компонент ToolBar может использовать контейнер ImageList, чтобы извлечь из него нужную картинку и поместить ее на инструментальную кнопку.

Установите в свойство Images компонента ToolBar1 значение ImageList. Поместите на панель инструментов кнопки и разделители, как показано на рисунке. В свойстве Height задайте 30, затем щелкните по знаку + возле свойства EdgeBorders (Рамка) и установите значения всех подсвойств True. Для всех кнопок задайте свойство ShowHint – True. Это свойство используется для того, чтобы отображалась подсказка, заданная в свойстве Hint (по умолчанию оно False). Остальные свойства кнопок задайте следующим образом:

Name ImageIndex Hint
NewButton   Создать|Создание нового документа.
OpenButton   Открыть|Открытие существующего документа.
SaveButton   Сохранить|Сохранение активного документа.
FindButton   Найти|Поиск указанного образца текста.
CutButton   Вырезать|Удаление выделенного фрагмента в буфер обмена.
CopyButton   Копировать|Копирование выделенного фрагмента в буфер обмена.
PasteButton   Вставить|Вставка в документ содержимого буфера обмена.
UndoButton   Отменить|Отмена последнего выполненного действия.

Как было сказано ранее, свойство Hint содержит текст подсказки, всплывающей при наведении мыши на данный объект. Обычно эта подсказка содержит лаконичный текст, чтобы не отнимать слишком большую часть экрана. Этот текст можно дополнить развернутым сообщением в Строке состояния, занимающей нижнюю часть формы. Чтобы отобразить «длинное» сообщение, его нужно, прежде всего, поместить в строку Hint сразу после «короткого» и отделить обе части символом «|». Далее необходимо в самом начале программы (в обработчике события OnCreate) указать программе метод, который будет обрабатывать событие OnHint. Это событие возникает в момент появления подсказки и предназначено для отображения длинного сообщения, которое метод-обработчик может получить в свойстве Hint глобального объекта Application.

11. Выделите компонент ToolBar2. Задайте для него свойства Images – ImageList, Height – 30, EdgeBorders –True все, кроме ebTop.

Поместите на панель инструментов разделители, кнопки и два компонента ComboBox, как показано на рисунке. Для всех кнопок и обоих компонентов ComboBox задайте свойство ShowHint – True. Остальные свойства кнопок задайте следующим образом:

Name ImageIndex Hint
FontName   Шрифт|Изменение шрифта для выделенного фрагмента.
FontSize   Размер|Изменение размера шрифта для выделенного фрагмента.
BoldButton   Жирный|Использование жирного шрифта для выделенного фрагмента.
ItalicButton   Курсив|Использование курсива для выделенного фрагмента.
UnderlButton   Подчеркнутый|Непрерывное подчеркивание текста в выделенном фрагменте.
LeftButton   По левому краю|Выравниване абзаца по левому краю.
CenterButton   По центру|Выравнивание абзаца по центру.
RightButton   По правому краю|Выравнивание абзаца по правому краю.
BulletButton   Маркеры|Добавление маркера в начало строки.

Для компонентов FontName и FontSize удалите содержимое свойства Text.

Выберите компонент FontSize, дважды щелкните на свойстве Items и в открывшемся окне редактора введите строки 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72.

Удерживая клавишу <Shift>, выделите все 7 кнопок панели ToolBar2, поочередно щелкнув по ним мышью. Задайте для них свойство Style – tbsCheck. Теперь таким же образом выделите только кнопки LeftButton, CenterButton и RightButton и задайте для них свойство Grouped – True.

12. Выделите компонент StatusBar1. Этот компонент обычно используется для отображения информации о состоянии приложения. Он представляет собой строку состояния, которая может иметь одну или несколько панелей для вывода текстовой информации. Чтобы создать несколько панелей в строке состояния и управлять ими, можно использовать свойство Panels, позволяющее обращаться к панелям строки состояния как к элементам массива, нумерация которых начинается с нуля. Первым элементом будет Panels[0], вторым - Panels[1] и т.д.

Щелкните два раза по панели StatusBar или выберите команду Panels Editor в контекстном меню этого компонента. С помощью кнопки Add New создайте четыре панели. Задайте для их свойства Width – 500, 30, 30, 30 соответственно. Для Panel[0] и Panel[3] в свойстве Bevel установите None. А для Panel[1] и Panel[2] в свойстве Alignment - taCenter.

Panel[0] будет использоваться для вывода подсказок к управляющим элементам. А Panel[1] и Panel[2] – для отображения информации о том, нажаты ли клавиши <NumLock> и <Insert>.

13. Для открытия файлов используется диалоговое окно Открытие файла, а для сохранения Сохранение файла. Для них существуют компоненты OpenDialog и SaveDialog.

Свойство FileName типа String содержит маршрут поиска и выбранный файл при успешном завершении диалога. Программа может использовать это свойство для доступа к файлу с целью читать из него данные (TOpenDialog) или записывать в него (TSaveDialog).

Свойство Filter типаString используется для фильтрации (отбора) файлов, показываемых в диалоговом окне. Это свойство можно устанавливать с помощью специального редактора на этапе конструирования или программно.

Выделите компонент OpenDialog1 и переименуйте его в OpenDialog, задав для него соответствующее значение свойства Name. Для того чтобы сформировать фильтр, из Инспектора Объектов щелчком в области значения свойства Filter вызовите редактор фильтра (Filter Editor). Рабочее поле этого редактора представляет собой таблицу, состоящую из двух колонок, имеющих заголовки Filter Name (Имя фильтра) и Filter (Фильтр). Значения фильтра вводятся построчно, при этом в левой колонке указывается описание фильтра, а в правой – соответствующая маска. Задайте два фильтра: Файл RTF - *.rtf и Все файлы - *.*.

Теперь выделите SaveDialog 1 и переименуйте его в SaveDialog. Задайте для него фильтр Файл RTF - *.rtf.

14. Создайте окно, выводящее информацию о вашей программе. На панели инструментов с помощью кнопки New вызовите диалоговое окно New Items и на вкладке Forms выберите форму About box. Перед вами появится стандартное окно AboutBox, содержащее графический рисунок, текстовые компоненты Label и кнопку ОК. Сохраните эту форму под именем About.pas. Для формы AboutBox в свойстве Caption задайте О программе. С помощью свойства Picture компонента ProgramIcon, поместите на форму подходящий рисунок. В компоненты Label введите имя приложения и информацию о его разработчике. Задайте для них соответствующий шрифт в свойстве Font.

15. Теперь запишите процедуры для созданных пунктов меню, начиная с меню «Файл ». При выборе Пункта меню «Создать » должен создаваться новый документ. Выберете этот пункт, и в открывшемся окне кода программы добавьте текст:

procedure TMainForm.FileNewItemClick(Sender: TObject);

{Создание нового файла}

begin

CheckFileSave;

SetFileName(Untitled);

Editor.Lines.Clear; //Очистка содержимого окна редактирования

Editor.Modified:= False; //Содержимое не изменено

{Шрифт и размер шрифта в новом документе по умолчанию}

Editor.SelAttributes.Name:= DefFontData.Name;

Editor.SelAttributes.Size:= DefFontData.Height;

end;

Здесь CheckFileSave вызывает процедуру проверяющую, сохранены ли изменения в текущем файле. Эту процедуру необходимо создать самостоятельно. Для этого сначала ее нужно описать в разделе Private, вставив код procedure CheckFileSave;. Затем в разделе implementation после строки {$R *.dfm} записать саму процедуру:

procedure TMainForm.CheckFileSave;

{Проверка, сохранены ли изменения в файле}

var

Otvet: Integer;

begin

{Выход из процедуры, если текст не изменен}

if Editor.Modified = False then Exit;

Otvet:= MessageDlg('Сохранить изменения в файле "'

+ExtractFileName(FileName)+'"?',

mtConfirmation, mbYesNoCancel, 0);

case Otvet of {Выбор в зависимости от нажатой кнопки}

idYes: FileSaveItemClick(Self);{ Сохранить как...}

idNo:;

idCancel: Abort;

end;

end;

В первой строке этой процедуры проверяется свойство Modified окна редактирования Editor. Если оно равно False, т.е. содержание этого окна не изменено, то работа процедуры заканчивается. В противном случае нам необходимо сохранить внесенные изменения. Запускается стандартное диалоговое окно, содержащее три кнопки: «OK», «NO», «Cancel», и задающее вопрос, нужно ли сохранять изменения в текущем файле. Переменной Otvet присваивается значение одной из трех нажатых кнопок. Затем в зависимости от значения этой переменной выбираются необходимые действия. Если нажата кнопка «OK», то, вызывается процедура, происходящая при выборе пункта меню «Сохранить как…», которая будет описана в п.18, и файл сохраняется.

Во второй строке процедуры CheckFileSave происходит задание имени для нового файла. Для этого вызывается процедуру SetFileName, которую опять же нужно создать вручную, т.е. вставить код

procedure SetFileName(Name: String);

{Установка имени текущего файла}

begin

FileName:=Name; {Новое имя файла}

{Заголовок формы = Имя файла + Имя проекта}

MainForm.Caption:= ExtractFileName(Name)+

' - '+Application.Title;

end;

В этой процедуре переменной FileName, которую предварительно нужно описать в разделе var всего модуля, присваивается значение входного параметра процедуры Name. Значение этой переменной будет использоваться и в других процедурах программы. При создании нового файла он по умолчанию должен имеет имя «Без имени», поэтому мы в процедуре FileNewItemClick SetFileName вызывается с параметром Untitled, где Untitled – константа, описанная перед разделом var следующим образом:

const

Untitled = 'Без имени.rtf'; {Имя несохраненного файла}

Далее в заголовок формы записывается имя файла и имя приложения. Функция ExtractFileName выделяет из полного пути к файлу его имя и расширение.

16. Пункт «Открыть » из меню «Файл» предназначен для открытия уже существующего файла. Для него добавьте процедуру:

procedure TMainForm.FileOpenItemClick(Sender: TObject);

{Открытие существующего файла}

begin

CheckFileSave;

{Если в диалоговом окне выбран файл}

if OpenDialog.Execute then

begin

{В окно редактора загружается содержимое файла}

Editor.Lines.LoadFromFile(OpenDialog.FileName);

{Именем текущего файла становится имя выбранного файла}

SetFileName(OpenDialog.FileName);

Editor.SetFocus;//Курсор помещается в окно редактора

Editor.Modified:= False; //Текст не изменен

end;

end;

Здесь также сначала предлагается возможность сохранить изменения в текущем файле, а затем открывается файл, выбранный в окне «Открыть».

Метод Execute вызывает на экран стандартное окно диалога. Эта функция в качестве результата возвращает логическое значение, позволяющее определить, как закрыт диалог. Если пользователь в процессе диалога нажал кнопку Открыть или Сохранить, то диалог считается принятым, и функция Execute возвращает значение True. Если диалог был закрыт любым другим способом, то он считается отвергнутым, и функция возвращает значение False.

17. Пункт «Сохранить » вызывает процедуру меню «Сохранить как…», если файл еще ни разу не был сохранен, и сохраняет изменения в файле, если у него уже есть имя, отличное от Untitled.

procedure TMainForm.FileSaveItemClick(Sender: TObject);

{Сохранение файла}

begin

if FileName = Untitled then

FileSaveAsItemClick(Sender) //Сохранить как...

else

begin

Editor.Lines.SaveToFile(FileName);

Editor.Modified:= False;

end;

end;

18. Пункт «Сохранить как… » используется для сохранения файла под другим именем. Он открывает диалоговое окно «Сохранить как…». Если файл с выбранным для сохранения именем существует, т.е. функция FileExists(FileName) имеет значение true, то выводится диалоговое окно, спрашивающее, нужно ли заменить уже существующий файл. Затем содержимое окна редактирования записывается в файл с выбранным именем и устанавливается новое имя текущего файла.

procedure TMainForm.FileSaveAsItemClick(Sender: TObject);

{Сохранение файла под другим именем}

begin

SaveDialog.FileName:=FileName; //Имя для сохранения по умолчанию

if SaveDialog.Execute then

begin

if FileExists(SaveDialog.FileName) then

if MessageDlg('Файл '+SaveDialog.FileName+' уже существует. Заменить?',

mtConfirmation, mbYesNoCancel, 0) <> idYes then Exit;

Editor.Lines.SaveToFile(SaveDialog.FileName);

SetFileName(SaveDialog.FileName);

Editor.Modified:= False;

end;

end;

19. Пункт «Выход » закрывает приложение:

procedure TMainForm.FileExitClick(Sender: TObject);

{Выход из приложения}

begin

Close;

end;

Т.к. при выходе из приложения закрывается и редактируемый документ, то перед выходом необходимо проверить, сохранены ли изменения в текущем файле. Для того чтобы выполнить эту проверку, в Инспекторе Объектов выберите форму MainForm, на вкладке Events выберите событие OnCloseQuery и дважды щелкните по полу возле него. В открывшемся окне редактора кода создайте процедуру:

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

{Получение подтверждения на сохранение изменений}

begin

CheckFileSave;

end;

20. Следующее меню - «Правка ». Пункт «Отменить » используется для отмены последнего произведенного действия. Добавьте для него процедуру

procedure TMainForm.EditUndoItemClick(Sender: TObject);

{Отмена предыдущего действия}

begin

Editor.Undo;

end;

Метод Undo восстанавливает текст в том виде, в каком он был перед последним получением компонентом фокуса ввода.

21. Пункты меню «Вырезать », «Копировать » и «Вставить » используются для помещения выделенного текста в буфер обмена, или копирования текста из него. Для выполнения этих действий применяются методы CopyToClipBoard и CutToClipBoard, которые помещают данные в буфер обмена, копируя и вырезая их из источника, и метод PasteFromClipBoard, который вставляет текстовый фрагмент из буфера обмена в поле редактора. Поэтому для данных пунктов меню в коды процедур поместите соответственно

Editor.CutToClipboard;

Editor.CopyToClipboard;

Editor.PasteFromClipboard;

22. Пункт «Очистить » удаляет выделенный текст. Для него добавьте код

Editor.ClearSelection;

23. Пункт «Выделить все » выделяет все содержимое окна редактирования. Процедура для него выглядит следующим образом:

procedure TMainForm.EditSelectAllItemClick(Sender: TObject);

{Выделение всего текста}

begin

Editor.SelectAll;

end;

24. При выборе пункта «Найти… » вызывается диалоговое окно для поиска в тексте редактора необходимой строки. Для организации стандартного диалога Поиск используется компонент FindDialog, который предназначен для ввода текстовой информации в строку с заголовком Образец. Введенная строка является значением свойства FindText типа String.

procedure TMainForm.EditFindItemClick(Sender: TObject);

{Открытие окна "Найти"}

begin

FindDialog.Execute;

end;

Сам же поиск строки осуществляется при вызове события OnFind компонента FindDialog. Чтобы добавить код к этой процедуре, выделите компонент FindDialog, в Инспекторе Объектов на вкладке Events дважды щелкните на событии OnFind.

procedure TMainForm.FindDialogFind(Sender: TObject);

{Ищется первое появление в тексте заданной для поиска строки}

begin

if pos(FindDialog.FindText,Editor.Text)<>0 then

begin

Editor.HideSelection:=False;

Editor.SelStart:=pos(FindDialog.FindText, Editor.Text)-1;

Editor.SelLength:=Length(FindDialog.FindText);

end

else MessageDlg('Строка '+FindDialog.FindText+' не найдена!',

mtConfirmation, [mbYes],0);

end;

Функция pos(Substr: String; S: String): Integer – определяет позицию (номер) символа, начиная с которого подстрока Substr входит в строку S, при этом ищется первое вхождение. Если подстрока не найдена, то возвращается ноль. Т.е., если строка, введенная в поле Образец, не найдена в тексте окна редактирования, то выдается сообщение о том, что данная стока не найдена.

Свойства SelStart и SelLength типа Integer позволяют работать с выделенным фрагментом текста. Они задают соответственно начальную позицию в строке и длину выделенного фрагмента. Свойство HideSelection типа Boolean определяет, будет ли отображаться выделенный текст при потере компонентом фокуса ввода. Если это свойство имеет значение True (по умолчанию), то текст не будет выглядеть выбранным при переходе фокуса на другой элемент управления. Для того чтобы текст был выделен цветом, свойству HideSelection необходимо установить значение False.

25. Так же, как и «Найти…», пункт «Заменить… » открывает окно RepleceDialog.

procedure TMainForm.EditReplaceItemClick(Sender: TObject);

{Открытие окна "Замена"}

begin

ReplaceDialog.Execute;

end;

Компонент RepleceDialog используется для организации стандартного диалога Замена. Этот диалог предназначен для ввода текстовой информации в строки с заголовками Образец и Заменить на:. Введенные строки являются значениями свойств FindText и ReplaceText типа String соответственно. Замена текста происходит при вызове события OnReplace компонента RepleceDialog.

procedure TMainForm.ReplaceDialogReplace(Sender: TObject);

{Заменяются все вхождения в текст заданной для поиска строки }

begin

Editor.HideSelection:=true;

while pos(ReplaceDialog.FindText,Editor.Text)<>0 do

begin

Editor.SelStart:=pos(ReplaceDialog.FindText,Editor.Text)-1;

Editor.SelLength:=Length(ReplaceDialog.FindText);

Editor.SelText:=ReplaceDialog.ReplaceText;

end;

Editor.HideSelection:=false;

end;

Значение свойства SelText типа String определяет содержимое выделенного фрагмента.

26. Пункт «Шрифт » меню «Формат » предназначен для установки параметров шрифта выделенного текста. Диалог выбора шрифта реализует компонент FindDialog. Он обладает свойством Font (шрифт) типа TFont, которое определяет выбранные параметры шрифта и имеет ряд подсвойств, основными из которых являются Name (Имя), Style (Стиль), Size (Размер) и Color (Цвет).

procedure TMainForm.FormatFontItemClick(Sender: TObject);

{Выбор шрифта}

begin

FontDialog.Font.Assign(Editor.SelAttributes);

if FontDialog.Execute then

Editor.SelAttributes.Assign(FontDialog.Font);

EditorSelectionChange(Self);

Editor.SetFocus;

end;

Процедура EditorSelectionChange происходит при изменении содержимого окна редактирования Editor и будет в п. 35.

27. Выбор пункта «Маркер » добавляет или удаляет маркер в начале текущего абзаца.

procedure TMainForm.FormatBulletItemClick(Sender: TObject);

{Маркированный список}

begin

with Editor do

if Paragraph.Numbering=nsNone then Paragraph.Numbering:= nsBullet

else Paragraph.Numbering:= nsNone;

end;

Свойство Paragraph окна редактирования Editor определяет информацию о формате текущего абзаца. Текущим является тот абзац, который содержит выделенный текст. Если текст не выделен, то текущий абзац – тот, который содержит курсор. Подсвойство Numbering свойства Paragraph определяет, помечен ли абзац маркером. Если оно имеет значение nsNone, то слева никаких маркеров нет. Если же оно равно nsBullet, то в начале абаза есть маркеры с соответствующим для них отступом.

28. При выборе пункта меню «О программе… » должна появляться форма «О программе», созданная в п.14. Задайте для этого пункта процедуру

procedure TMainForm.HelpAboutItemClick(Sender: TObject);

{Вызов формы "О программе"}

begin

AboutBox.ShowModal;

end;

а в поле uses подключите модуль about.

29. Пункты вспомогательного меню PopUpMenu дублируют некоторые пункты главного меню, поэтому создавать для них новые процедуры не нужно. По очереди выделите все эти пункты, и на вкладке Events Инспектора Объектов в поле события OnClick выберите процедуру соответствующего пункта меню:

пункт процедура
«Вырезать» EditCutItemClick
«Копировать» EditCopyItemClick
«Вставить» EditPasteItemClick
«Шрифт…» FormatFontItemClick
«Маркер» FormatBulletItemClick

30. Теперь добавьте процедуры для панелей инструментов. Все кнопки панели инструментов ToolBar1 также повторяют пункты главного меню. Поэтому для всех них также необходимо на вкладке Events Инспектора Объектов в поле события OnClick выбрать процедуру соответствующего пункта меню: для NewButton – FileNewItemClick, для OpenButton – FileOpenItemClick и т.д.

31. На панели инструментов ToolBar2 только кнопка BulletButton дублирует пункт меню Формат/Маркеры. Поэтому для нее в событии OnClick задайте процедуру выбора этого пункта меню FormatBulletItemClick.

32. Комбинированный список FontName предназначен для выбора имени шрифта выделенного текста.

procedure TMainForm.FontNameChange(Sender: TObject);

{Выбор шрифта}

begin

{Имя шрифта выделенного текста:= Текст выбранного пункта списка}

Editor.SelAttributes.Name:= FontName.Items[FontName.ItemIndex];

end;

Комбинированный список FontSize позволяет изменять размер выделенного текста:

procedure TMainForm.FontSizeChange(Sender: TObject);

{Размер шрифта}

begin

Editor.SelAttributes.Size:= StrToInt(FontSize.Text);

end;

33. Кнопка BoldButton задает жирный стиль шрифта для выделенного текста. Если выделенный текст уже жирный, то этот эффект снимается. Когда в п. 11 задавались свойства кнопок панели ToolBar2, для этой кнопки было задано свойство Style – tbsCheck. Это означает, что данная кнопка может находиться в нажатом положении, а для ее освобождения нужно щелкнуть по ней еще раз. Свойство Down типа Boolean определяет состояние кнопки, если оно содержит True, то кнопка «утоплена».

procedure TMainForm.BoldButtonClick(Sender: TObject);

{Жирный шрифт}

begin

with Editor.SelAttributes do

if BoldButton.Down then Style:= Style + [fsBold]

else Style:= Style - [fsBold];

end;

Кнопки ItalicButton и UnderlButton задают курсивный и подчеркнутый стиль текста соответственно. Для них также свойство Style было задано tbsCheck.

procedure TMainForm.ItalicButtonClick(Sender: TObject);

{Курсивный шрифт}

begin

with Editor.SelAttributes do

if ItalicButton.Down then Style:= Style + [fsItalic]

else Style:= Style - [fsItalic];

end;

procedure TMainForm.UnderlButtonClick(Sender: TObject);

{Подчеркнутый шрифт}

begin

with Editor.SelAttributes do

if UnderlButton.Down then Style:= Style + [fsUnderline]

else Style:= Style - [fsUnderline];

end;

34. Далее следует группа кнопок, задающих выравнивание абзаца: LeftButton – выравнивание по левому краю, CenterButton – по центру, RightButton – по правому краю. Для них свойство Style было задано tbsCheck, а свойство Grouped – True. Т.е., кроме того, что эти кнопки могут быть в нажатом состоянии, свойство Grouped определяет, что в любой момент может быть нажата только одна кнопка группы. Поскольку эти три кнопки содержаться в одной группе, абзац может иметь только один стиль выравнивания. Создайте для них одну общую процедуру AlignButtonClick. Сначала опишите ее в разделе type:

procedure AlignButtonClick(Sender: TObject);

а затем добавьте саму процедуру:

procedure TMainForm.AlignButtonClick(Sender: TObject);

{Выравнивание абзаца}

begin

with Editor.Paragraph do

if LeftButton.Down then Alignment:= taLeftJustify

else if RightButton.Down

then Alignment:= taRightJustify

else if CenterButton.Down then Alignment:= taCenter;

end;

Здесь в зависимости от того, какая кнопка находится в нажатом состоянии, свойству Alignment (Выравнивание) текущего параграфа присваивается значение taLeftJustify (по левому краю), taCenter (по центру) или taRightJustify (по правому краю).

Теперь каждой из трех кнопок на вкладке Events Инспектора Объектов в поле события OnClick выберите процедуру AlignButtonClick.

35. Теперь для компонента Editor создайте процедуру события OnSelectionChange, возникающего при изменении выделенного текста. В этой процедуре нужно будет задать, какие из кнопок и пунктов меню активны, а какие нет.

Кнопка и меню «Вставить » активны (свойство Enabled (Активен) = True) только тогда, когда содержимое буфера обмена имеет текстовый формат, т.е. когда Clipboard.HasFormat(CF_TEXT) = true. Для доступа к объекту буфера обмена в разделе uses модуля указывается модуль Clipbrd.

Действия «Вырезать » и «Копировать » могут быть выполнены, если выделен какой-либо текст. Поэтому вспомогательной переменной HasSelection типа Boolean присваивается значение true, если длина выделенного теста больше нуля. Затем в зависимости от этой переменной устанавливается, активны или не активны соответствующие управляющие элементы, т.е. пункты главного и вспомогательного меню и кнопки на панели инструментов.

Далее проверяется формат шрифта текущего текста, и устанавливаются соответствующие свойства кнопок панели инструментов ToolBar2.

procedure TMainForm.EditorSelectionChange(Sender: TObject);

var HasSelection: Boolean;

begin

{Пункт "Вставить" активен, если содержимое буфера

обмена имеет текстовый формат.}

EditPasteItem.Enabled:= Clipboard.HasFormat(CF_TEXT);

N7.Enabled:= Clipboard.HasFormat(CF_TEXT);

PasteButton.Enabled:=Clipboard.HasFormat(CF_TEXT); {Переменная, отвечающая, выделен ли текст.}

HasSelection:= Editor.SelLength > 0;

{Пункты из меню "Правка" активны, если длина выделенного

текста больше нуля.}

EditCutItem.Enabled:= HasSelection;

N5.Enabled:= HasSelection;

CutButton.Enabled:= HasSelection;

EditCopyItem.Enabled:= HasSelection;

N6.Enabled:= HasSelection;

CopyButton.Enabled:= HasSelection;

EditDeleteItem.Enabled:= HasSelection;

Editor.HideSelection:=False;

with Editor do

begin

//Состояние кнопок стиля в соответствии с форматом

BoldButton.Down:= fsBold in SelAttributes.Style;

ItalicButton.Down:= fsItalic in SelAttributes.Style;

UnderlButton.Down:= fsUnderline in SelAttributes.Style;

BulletButton.Down:= Boolean(Paragraph.Numbering);

//Текст поля FontSize = размер шрифта

FontSize.Text:= IntToStr(SelAttributes.Size);

//Текст поля FontName = имя шрифта

FontName.Text:= SelAttributes.Name;

{Нажата та из кнопок выравнивания, которой соответствует

выравнивание текущего абзаца}

case Ord(Alignment) of

0: LeftButton.Down:= True;

1: RightButton.Down:= True;

2: CenterButton.Down:= True;

end;

end;

end;

36. Выделите в Инспекторе Объектов форму MainForm и на вкладке Events выберите событие OnCreate, происходящее при создании формы. Задайте для него процедуру:

procedure TMainForm.FormCreate(Sender: TObject);

{Операции при создани



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-02-04 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: