C++Builder поставляется вместе с примером текстового редактора файлов формата RTF. который демонстрирует работу диалоговых компонент TOpenDialog, TSaveDialog, TFontDialog и TPrintDialog. Приложение также использует ранее описанные компоненты TMainMenu, TRichEdit, TPanel, TEdit, TSpeedButton. TComboBox, TUpDown, TLabel, TBevel и способно предоставлять контекстно-зависимую помощь из файла RICHEDIT.HLP.
=> По команде главного меню File | Open Project откройте диалог выбора проектов.
=> Войдите в каталог \...\CBuilder\Examples\Apps\RichEdit.
=> Выберите проектный файл с именем RichEdit и нажмите кнопку Open.
Рис. 4.21. Форма текстового редактора.
Рис. 4.21 показывает главную форму текстового редактора с перечнем имен основных обработчиков событий, коды которых, как правило, и составляют содержание файлов программных модулей приложений для C++Builder.
Компонента TRichEdit занимает всю свободную область формы редактора, причем вложенные свойства RichEditl->Paragraph содержат атрибуты форматирования параграфов документа. Объект FontName представляет название шрифта, выбранное пользователем из выпадающего списка TComboBox. Для установки размера шрифта служит объект FontSize области редактируемого ввода TEdit, сопряженный с кнопками TUpDown. Под панелью инструментов рас-
положена измерительная линейка с тремя регуляторами форматирования (объекты типа TLabel): левого отступа параграфа Leftind, ширины красной строки Firstind и правого отступа параграфа Rightind (последний регулятор появится после запуска программы). Внизу формы расположена панель строки состояния StatusBar, предназначенная для вывода пояснений к командам меню.
Меню редактора включает типовые команды управления, некоторым из которых поставлены в соответствие быстрые кнопки на панели инструментов.
| File | Edit | Help | |||
| New Open Save Save As | Undo | Contents Search for Help On How to Use Help | |||
| Cut Copy Paste | |||||
| About | |||||
| Font | |||||
| Exit |
Вы можете отредактировать (например, с помощью того же Microsoft Word) исходный справочный файл RICHEDIT.RTF из каталога \...\CBuilder\Examples\Apps\RichEdit\Help, а затем собрать новую версию RICHEDIT.HLP с помощью утилиты BUILDHLP.BAT. Наличие действующей команды меню Help придает программе профессиональный облик и облегчает работу пользователя.
После того, как вы запустите редактор и испытаете что он умеет, придет черед разобраться в том как он это делает. Листинг 4.1 содержит полный текст файла кодового модуля Romain.cpp с необходимыми комментариями. Несмотря на большой размер, целесообразно привести текст целиком, поскольку им вполне можно руководствоваться при создании собственных стилизованных приложений профессионального уровня с меню, быстрыми кнопками, диалогами и контекстной помощью.
ttinclude <vcl.h> ttinclude <windows.hpp> ftpragma hdrstop
#include "Romain.h"
^include "RichAbt.h"
const float RulerAdj = 4.0/3.0; // цена деления линейки
const int GutterWid = 6; // ширина поля подшивки
//-----_-------________--________--________--_____-__--_____
#pragma resource "*.dfm" TMainForm *MainForm;
// Конструктор главной формы приложения _ fastcall TMainForm::TMainForm(TComponent *0wner)
: TFormfOwner) { SetFileName((AnsiString)"Untitled");
)
// Установка текущих атрибутов Форматирования текста void _fastcall TMainForm::SelectionChange(TObject*) { char sizebuf[6];
try { FUpdating = true;
FirstInd->Left = // левая граница красной строки int (RichEditl->Paragraph->FirstIndent*RulerAdj)-
4+GutterWid;
LeftInd->Left = // левый отступ параграфа int( (RichEditl->Paragraph->LeftIndent+
RichEditl->Paragraph->FirstIndent)*RulerAdj)-
4+GutterWid;
RightInd->Le?t = II правый отступ параграфа •" Ruler->ClientWidth-6-
int( (RichEditl->Paragraph->RightIndent+GutterWid)*
RulerAdj);
BoldButton->Down = // состояние кнопки "жирный" RichEditl->SelAttributes->Style.Contains(fsBold);
ItalicButton->Down = //состояние кнопки "курсив" RichEditl->SelAttributes->Style.Contains(fsltalic);
UnderlineButton->Down = // состояние кнопки "подчерк." RichEditl->SelAttributes->Style.Contains(fsUnderline);
BulletsButton->Down = // состояние кнопки "нумерация" bool (RichEditl->Paragraph->Numbering);
FontSize->Text = // размер шрифта itoa(RichEditl->SelAttributes->Size, sizebuf, 10);
FontName->Text = // название шрифта RichEditl->SelAttributes->Name;
// Состояние кнопок выравнивания параграфа switch((int) RichEditl->Paragraph->Alignment) { case 0: LeftAlign->Down = true; break;
case 1: RightAlign->Down = true; break;
case 2: CenterAlign->Down = true; break;
} }






