Программирование выступает главным инструментом создания и поддержки любого программного обеспечения, поэтому в наш век информационных технологий его роль чрезвычайно важна как для современной техники и технологий, так и для общества в целом.
Изучение программирования начинается в школьном курсе информатики, в некоторых случаях учащиеся изучают программирование как отдельную дисциплину в рамках углубленного изучения или факультативов и школьных кружков. В вузовском курсе объем и глубина изучения программирования зависит от конкретного направления и профиля обучения.
В процессе обучения программированию учащиеся знакомятся с основными конструкциями языков программирования, применяют их для решения разнообразных задач. Правильная методика и подходы при обучении этой важной дисциплине позволяют вырабатывать у учащихся такие качества и способности, как логическое и критическое мышление, внимательность, аккуратность, находчивость, изобретательность, конструктивное мышление, у учащегося раскрываются его творческие способности [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 = Record
Align: 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;
Begin
Val(Text_Attrib,Vrem,Code);
Case Vrem Of
0: 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;
Begin
If Text_Attrib[1]='1' Then
Form1.SpeedButton4.Down:=True
Else
Form1.SpeedButton4.Down:=False;
If Text_Attrib[2]='1' Then
Form1.SpeedButton5.Down:=True
Else
Form1.SpeedButton5.Down:=False;
If Text_Attrib[3]='1' Then
Form1.SpeedButton6.Down:=True
Else
Form1.SpeedButton6.Down:=False;
If Form1.RichEdit1.Paragraph.Alignment=taLeftJustify Then
Form1.SpeedButton7.Down:=True
Else
Form1.SpeedButton7.Down:=False;
If Form1.RichEdit1.Paragraph.Alignment=taCenter Then
Form1.SpeedButton8.Down:=True
Else
Form1.SpeedButton8.Down:=False;
If Form1.RichEdit1.Paragraph.Alignment=taRightJustify Then
Form1.SpeedButton9.Down:=True
Else
Form1.SpeedButton9.Down:=False;
End;
Procedure Font_Delta;
Var Vrem: String;
begin
Form1.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=[] Then
Text_Attrib:='000';
If Form1.RichEdit1.SelAttributes.Style=[fsUnderLine] Then
Text_Attrib:='001';
If Form1.RichEdit1.SelAttributes.Style=[fsItalic] Then
Text_Attrib:='010';
If Form1.RichEdit1.SelAttributes.Style=[fsItalic,fsUnderLine] Then
Text_Attrib:='011';
If Form1.RichEdit1.SelAttributes.Style=[fsBold] Then
Text_Attrib:='100';
If Form1.RichEdit1.SelAttributes.Style=[fsBold,fsUnderLine] Then
Text_Attrib:='101';
If Form1.RichEdit1.SelAttributes.Style=[fsBold,fsItalic] Then
Text_Attrib:='110';
If Form1.RichEdit1.SelAttributes.Style=[fsBold,fsItalic,fsUnderLine] Then
Text_Attrib:='111';
SpeedButton_Settings;
End;
При формулировке задачи было требование, чтобы при повторном запуске программы она могла восстанавливать заданные параметры набора текста. Для реализации такой возможности необходимо сохранять параметры набора в отдельный файл (назовем его Settings.inf), а при загрузке программы загружать их из него. Создание такого файла будет выполняться по требованию пользователя, а при его отсутствии в каталоге с программой параметры набора текста будут заданы такими, как это было принято по умолчанию при разработке программы. Изменить содержимое файла с настройками можно посредством кнопки "Принять указанные параметры текста по умолчанию", обработчик которой содержит следующий код:
procedure TForm1.SpeedButton12Click(Sender: TObject);
Var F: File of Settings;
begin
Param.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 такие возможности также поддерживает), а также некоторые другие возможности, которые читатель сочтет нужным добавить в программу.