Использование диалоговых компонент текстовым редактором. Приемы отладки
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;
} }