Программирование выступает главным инструментом создания и поддержки любого программного обеспечения, поэтому в наш век информационных технологий его роль чрезвычайно важна как для современной техники и технологий, так и для общества в целом.
Изучение программирования начинается в школьном курсе информатики, в некоторых случаях учащиеся изучают программирование как отдельную дисциплину в рамках углубленного изучения или факультативов и школьных кружков. В вузовском курсе объем и глубина изучения программирования зависит от конкретного направления и профиля обучения.
В процессе обучения программированию учащиеся знакомятся с основными конструкциями языков программирования, применяют их для решения разнообразных задач. Правильная методика и подходы при обучении этой важной дисциплине позволяют вырабатывать у учащихся такие качества и способности, как логическое и критическое мышление, внимательность, аккуратность, находчивость, изобретательность, конструктивное мышление, у учащегося раскрываются его творческие способности [4, 7, 8, 13].
Для подготовки специалиста, конкурентоспособного на современном рынке информационных услуг, чрезвычайно важно в процессе обучения программированию постепенно отказываться от традиционных задач в пользу более интересных, сложных, ориентированных на решение практически важных проблем [2-4, 7-11, 16, 19].
Ниже в статье мы рассмотрим учебный пример, показывающий работу в среде визуального программирования Delphi (учебный пример на разработку программы построения графика функции рассмотрен в [17]). Среда разработки Delphi в курсе программирования может быть успешно использована при написании игровых [4, 6, 16], обучающих и контролирующих программ [5, 12], реализации моделей физических и экономических процессов [18], разработки прикладных программ [5, 12, 14, 15]. Для первоначального ознакомления со средой разработки Delphi можно использовать, например, книги [1, 20].
Рассмотрим следующую задачу. Необходимо разработать текстовый редактор, поддерживающий возможности форматирования текста. Программа должна иметь следующие возможности:
- ввод текста с заданным начертанием и форматированием (выравнивание, настройка размеров, стилей и цвета шрифта);
- применение настроек форматирования к любому фрагменту текста;
- сохранение текущих настроек форматирования как параметров по умолчанию при последующих запусках программы;
- открытие ранее сохраненного документа;
- сохранение подготовленного документа в файл.
Рассмотрим, какие компоненты и в каком количестве будут использованы в программе. Для удобства представим это в виде таблицы 1. Сразу отметим, что исходный код программы составляет порядка 400 строк и представлен с некоторыми пояснениями в виде архива в [21]. Окно готовой разработанной программы показано на рис. 1.
Тип компонента | Количество | Назначение в программе |
TRichEdit | 1 | Рабочая область программы для ввода текста документа. |
TComboBox | 2 | Хранят список доступных шрифтов и стандартные размеры шрифта. |
TToolBar | 1 | Панель инструментов. |
TSpeedButton | 11 | Кнопки панели инструментов. |
TToolButton | 1 | Разделитель на панели инструментов. |
TColorDialog | 1 | Диалог выбора цвета. |
OpenDialog | 1 | Диалог открытия файла. |
TSaveDialog | 1 | Диалог сохранения файла. |
TMainMenu | 1 | Основное меню программы (содержит два пункта: "Файл", "Справка"). |
TPopupMenu | 1 | Контекстное меню, которое вызывается на рабочей области программы и содержит следующие операции: выделить все, копировать, вставить, вырезать. |
TStatusBar | 1 | Служит для отображения полного имени текущего файла с текстом документа. |

Рассмотрим некоторые вопросы, связанные с реализацией программы.
Выясним сначала, какой компонент выбрать для рабочего поля программы. Очевидно, что компонент Memo для наших целей не подходит, т.к. в нем нет возможностей для форматирования отдельных фрагментов текста. Поэтому мы выберем компонент RichEdit. Он позволит работать как с отдельными абзацами, так и с выделенными фрагментами текста.
Чтобы работать с параметрами текста, набираемого в окне разрабатываемого редактора, в процессе разработки удобно ввести отдельную структуру (запись) следующего содержания:
Settings = RecordAlign: TAlignment;Font_Name: String[50];Font_Size: Integer;Font_Color: TColor;Text_Attrib: String[3];End;
Для удобства работы со стилями текста ("жирный", "курсивный", "подчеркнутый") введем отдельную переменную:
Text_Attrib: String[3];Смысл ее введения заключается в следующем: переменная будет содержать тройку нулей и единиц. При этом символы будут отвечать за активность (значение единица) или не активность стилей: первый символ за стиль "жирный", второй — за "курсивный", третий — за "подчеркнутый". Обработка стилей текста будет выполняться следующей процедурой:
Procedure Font_Style;Var Vrem,Code: Integer;BeginVal(Text_Attrib,Vrem,Code);Case Vrem Of0: Form1.RichEdit1.SelAttributes.Style:=[];1: Form1.RichEdit1.SelAttributes.Style:=[fsUnderLine];10: Form1.RichEdit1.SelAttributes.Style:=[fsItalic];11: Form1.RichEdit1.SelAttributes.Style:=[fsItalic,fsUnderLine];100: Form1.RichEdit1.SelAttributes.Style:=[fsBold];101: Form1.RichEdit1.SelAttributes.Style:=[fsBold,fsUnderLine];110: Form1.RichEdit1.SelAttributes.Style:=[fsBold,fsItalic];111: Form1.RichEdit1.SelAttributes.Style:=[fsBold,fsItalic,fsUnderLine];End; {Case}End;
Далее учтем, что при наборе текста, перемещении по абзацам или выделении фрагмента текста должны отражаться его параметры в панели инструментов (должны быть нажаты или отжаты соответствующие кнопки, указан цвет текста, шрифт, его размер). За это будут отвечать следующие две процедуры.
Procedure SpeedButton_Settings;BeginIf Text_Attrib[1]='1' ThenForm1.SpeedButton4.Down:=TrueElseForm1.SpeedButton4.Down:=False;If Text_Attrib[2]='1' ThenForm1.SpeedButton5.Down:=TrueElseForm1.SpeedButton5.Down:=False;If Text_Attrib[3]='1' ThenForm1.SpeedButton6.Down:=TrueElseForm1.SpeedButton6.Down:=False;If Form1.RichEdit1.Paragraph.Alignment=taLeftJustify ThenForm1.SpeedButton7.Down:=TrueElseForm1.SpeedButton7.Down:=False;If Form1.RichEdit1.Paragraph.Alignment=taCenter ThenForm1.SpeedButton8.Down:=TrueElseForm1.SpeedButton8.Down:=False;If Form1.RichEdit1.Paragraph.Alignment=taRightJustify ThenForm1.SpeedButton9.Down:=TrueElseForm1.SpeedButton9.Down:=False;End;Procedure Font_Delta;Var Vrem: String;beginForm1.SpeedButton11.Font.Color:=Form1.RichEdit1.SelAttributes.Color;Str(Form1.RichEdit1.SelAttributes.Size,Vrem);Form1.ComboBox2.Text:=Vrem;Form1.ComboBox1.Text:=Form1.RichEdit1.SelAttributes.Name;If Form1.RichEdit1.SelAttributes.Style=[] ThenText_Attrib:='000';If Form1.RichEdit1.SelAttributes.Style=[fsUnderLine] ThenText_Attrib:='001';If Form1.RichEdit1.SelAttributes.Style=[fsItalic] ThenText_Attrib:='010';If Form1.RichEdit1.SelAttributes.Style=[fsItalic,fsUnderLine] ThenText_Attrib:='011';If Form1.RichEdit1.SelAttributes.Style=[fsBold] ThenText_Attrib:='100';If Form1.RichEdit1.SelAttributes.Style=[fsBold,fsUnderLine] ThenText_Attrib:='101';If Form1.RichEdit1.SelAttributes.Style=[fsBold,fsItalic] ThenText_Attrib:='110';If Form1.RichEdit1.SelAttributes.Style=[fsBold,fsItalic,fsUnderLine] ThenText_Attrib:='111';SpeedButton_Settings;End;
При формулировке задачи было требование, чтобы при повторном запуске программы она могла восстанавливать заданные параметры набора текста. Для реализации такой возможности необходимо сохранять параметры набора в отдельный файл (назовем его Settings.inf), а при загрузке программы загружать их из него. Создание такого файла будет выполняться по требованию пользователя, а при его отсутствии в каталоге с программой параметры набора текста будут заданы такими, как это было принято по умолчанию при разработке программы. Изменить содержимое файла с настройками можно посредством кнопки "Принять указанные параметры текста по умолчанию", обработчик которой содержит следующий код:
procedure TForm1.SpeedButton12Click(Sender: TObject);Var F: File of Settings;beginParam.Align:=Form1.RichEdit1.Paragraph.Alignment;Param.Font_Name:=Form1.ComboBox1.Text;Param.Font_Size:=StrToInt(Form1.ComboBox2.Text);Param.Font_Color:=Form1.SpeedButton11.Font.Color;Param.Text_Attrib:=Text_Attrib;AssignFile(F,ExtractFileDir(Application.ExeName)+'\Settings.inf');Rewrite(F);Write(F,Param);CloseFile(F);end;
При запуске программе необходимо выполнить следующие действия (см. процедуру FormCreate в [21]):
- загрузить параметры набора текста из файла Settings.inf, а при его отсутствии принять настройки по умолчанию;
- отобразить в панели статуса имя текущего файла документа (сразу после запуска программы имя файла по умолчанию NoName.rtf);
- загрузить список доступных шрифтов в компонент ComboBox1.
Программная реализация всего проекта в целом будет ясна из приведенного кода в [21].
На рис. 2 показано окно разработанной программы, рабочая область которой содержит набранный текст. Некоторый фрагмент текста выделен и вызвано контекстное меню.

Рассмотренный пример показывает, как можно использовать компонент RichEdit для создания простого текстового редактора. Написанная программа может использоваться в качестве интерактивного метода обучения программированию (метод проектов).
Для тренировки предлагаем читателю усовершенствовать код программы и внести возможности выравнивания текста по ширине, настройку межстрочного интервала (компонент RichEdit такие возможности также поддерживает), а также некоторые другие возможности, которые читатель сочтет нужным добавить в программу.