Алгоритм, написание и отладка программы "Текстовый редактор"

задание на проектирование



Разработать программу формирования текста из исходного текстового файла по заданным параметрам образца. Перенос строк осуществлять по границе слова. Предусмотреть возможности:

	изменения шрифта;

	изменение размера шрифта;

	типа выравнивания;

	цвета текста и фона;

	сохранения текста в файл;

	открытие текстового файла

	поиска и замены текстового фрагмента.


Введение



Данное задание возможно реализовать на любом из известных языков программирования, и для закрепления и усовершенствования своих практических навыков разработки алгоритмов, написания и отладки программ на языке программирования С++ я использовал среду разработки C++Builder 6

Поставленная передо мной задача посвящена редактированию текста. Редактирование текста является очень важной частью оформления документов.

Разрабатываемая программа – «Текстовый редактор» не является какой-то сверхновой программой и на сегодняшний день имеет огромное количество подобных приложений, разработанных как отдельными людьми, так и целыми корпорациями.

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



			
ВЫБОР И ОБОСНОВАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ



В качестве языка программирования для реализации автоматизированной рабочей программы зав.отделения выбран С++ и, основанная на нем среда разработки C++Builder 6. Это мощная система визуального объектно-ориентированного программирования, позволяющая решать множество задач, в частности:

	Создавать законченные приложения для Windows самой различной направленности, от чисто вычислительных и логических, до графических и мультимедиа.

	Быстро создавать (даже начинающим программистам) профессионально выглядящий оконный интерфейс для любых приложений, написанных на любом языке. В частности, с помощью C++Builder можно объединить в единую систему с удобным современным интерфейсом имеющиеся на предприятии прикладные программы DOS, Windows и др. Интерфейс удовлетворяет всем требованиям Windows и автоматически настраивается на ту систему, которая установлена на компьютере пользователя, поскольку использует многие функции, процедуры, библиотеки Windows.

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

	Создавать многозвенные распределенные приложения, основанные на различных технологиях.

	Создавать приложения, которые управляют другими приложениями, в частности, такими программами Microsoft Office, как Word, Excel и др.

	Создавать кросс-платформенные приложения, которые можно компилировать и эксплуатировать как в Windows, так и в системе Linux.

	Создавать приложения различных классов для работы в.

	Создавать профессиональные программы установки для приложений Windows, учитывающие всю специфику и все требования Windows.

	И многое, многое другое, включая создание отчетов, справочных систем, библиотек DLL, компонентов ActiveX и т.п.

C++Builder — чрезвычайно быстро развивающаяся система, так как ее создатели постоянно отслеживают все тенденции информационных технологий. Новые версии выпускаются ежегодно.

Для большинства применений возможности эквивалентных версий С++Вuilder и Delphi примерно одинаковы. Это не удивительно, поскольку язык Object Pascal в настоящее время очень близок (конечно, если не учитывать синтаксис) к C++. Так что для большинства задач выбор C++ или Object Pascal, и, соответственно, C++Builder или Delphi — дело вкуса и привычки программиста. Но все-таки язык C++ пока несколько более мощный, чем Object Pascal. К тому же в C++ наработаны более обширные библиотеки функций. Так что некоторые, сравнительно сложные задачи проще решать с помощью C++Builder.

Из прекрасного средства создания приложений для Windows C++Builder превращается в инструмент создания приложений для многозвенных распределенных кросс-платформенных корпоративных информационных систем.



		ФИЗИЧЕСКАЯ СТРУКТУРА ПРОГРАММЫ



Проект C++Builder состоит из форм, модулей с их заголовочными файлами и файлами реализации, установок параметров проекта, ресурсов и т.д. Вся эта информация размещается в файлах. Многие из этих файлов автоматически создаются C++Builder, когда мы строим наше приложение. Ресурсы, такие, как битовые матрицы, пиктограммы и т.д., находятся в файлах, которые мы получаем из других источников или создаем при помощи многочисленных инструментов и редакторов ресурсов, имеющихся в нашем распоряжении (см. табл. 1).



Таблица 1 – Физическая структура программы

Наименование

Назначение

Головной файл 

проекта (.cpp)

TeRAn.cpp

С++Builder создает файл .cpp для головной функции WinMain, инициирующей приложение и запускающей его на выполнение.

Файл опций 

проекта (.bpr)

TeRAn.bpr

Этот текстовый файл содержит установки опций проекта и указания на то, какие файлы должны компилироваться и компоноваться в проект. Файл сохраняется в формате XML.

Файл реализации модуля (.cpp)

TeR.cpp

Каждой создаваемой вами форме соответствует текстовый файл реализации модуля, используемый для хранения кода. Иногда вы можете сами создавать модули, не связанные с формами.

Текстовый файл реализации главного окна программы

Unit1.cpp

Текстовый файл реализации модуля «О программе»

Unit2.cpp

Текстовый файл реализации модуля «Справка»

Заголовочный файл модуля (.h)

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

Файл формы (.dfm)



Это двоичный или текстовый файл, который С++Builder создает для хранения информации о ваших формах. Вы можете смотреть этот файл в текстовом виде или в виде формы. Каждому файлу формы соответствует файл модуля (.cpp).

Исполняемый файл (.exe)

TeRAn.exe

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

Объектный файл модуля (.obj)

Это откомпилированный файл модуля (.cpp), который компонуется в окончательный исполняемый файл.

Файл ресурсов проекта (.res)

Двоичный файл, содержащий ресурсы проекта: пиктограммы, курсоры и т.п. по умолчанию содержит только пиктограмму проекта. Может дополнятся с помощью Редактора Изображений (Image Editor)

Файл таблицы символов (.tds)

Двоичный файл, используемый отладчиком в процессе отладки приложения.

Файлы резервных копий (.~cpp, .~h, .~bp, .~df )

Это соответственно файлы резервных копий для файлов реализации модуля, заголовочного, проекта и формы. Если вы что-то безнадежно испортили в своем проекте, можете соответственно изменить расширение этих файлов и таким образом вернуться к предыдущему не испорченному варианту.



Из всех перечисленных файлов важнейшими являются файлы .cpp, .h, .dfm, .bpr, .res. Это те файлы, которые вы, например, должны перенести на другой компьютер, если захотите продолжить на нем работу над своим проектом. Все остальные файлы C++Builder создаст автоматически в процессе компиляции проекта и его отладки.

Информация о формах C++Builder хранится в трех файлах: .cpp, .h, .dfm. В двоичном или текстовом файле с расширением .dfm хранится информация о внешнем виде формы, ее размерах, местоположении на экране и т.д. 

Основной файл, с которым вы работаете – файл реализации модуля .cpp, в котором хранится код, соответствующий данной форме. В текстовом заголовочном файле с расширением .h хранится объявление класса вашей формы. Весь основной текст этого файла C++Builder формирует автоматически по мере проектирования вами формы. 

Если вы поочередно работаете над многими проектами, то пространство на диске может неэффективно забиваться ненужными файлами. В этом случае полезно удалять вспомогательные файлы тех проектов, над которыми вы временно не работаете. Прежде всего, это относится к файлам .obj, .res, .tds, .~*. Особо обратите внимание на файлы .tds, объем которых может быть очень большим (несколько мегабайт).

Теперь несколько слов о выполняемом файле .exe и о файлах пакетов. В C++Builder можно разрабатывать прикладные программы двух видов – автономные выполняемые файлы .exe и программы с поддержкой пакетов (packages) времени выполнения. В последнем случае размер выполняемого файла существенно сокращается, но зато вы должны поставлять пользователю не только выполняемый модуль, но и файлы поддерживающих его пакетов. Во всяком случае, во время отладки, имеет смысл включать поддержку пакетов времени выполнения. 

Это существенно сократит размеры выполняемых файлов и сбережет вам немало дискового пространства.



	МЕТОДИКА РЕШЕНИЯ ЗАДАЧИ



Разобьем поставленную перед нами задачу на отдельные подзадачи: 

Создание меню программы.

Вывод на экран справки, содержащей руководство по управлению и информацию об авторе.



	Описание работы программы



Программа содержит в своем составе все необходимые пакеты для работы независимо от C++Buildera. Запуск производится по открытию файла TeRAn.exe Сразу после этого без промедления открывается главное окно программы (см. рисунок 1)





Рисунок 1 - Главное окно приложения



В этом окне расположены основные средства управления программой.

Непосредственно в работе с текстом участвует форма «Справка», представленная на рисунке 2. Текст справки считывается из файла hlp, который всегда должен находится в одной папке вместе с исполняемым файлом TeRAn.exe





Рисунок 2 – Вспомогательная форма «Справка»





Рисунок 3 – Вспомогательная форма «О программе»



Из рисунка 1 видно, что на нашей главной форме приложения можно непосредственно редактировать текст документа, оформляя его по своему желанию необходимым образом. В верхней части программы находятся две панели: панель инструментов Panel1 и панель редактирования Panel2, на которых располагаются кнопки типа SpeedButton, с функциями, соответствующими техническому заданию. 


Руководство пользователя



Аппаратно-системные требования

Минимальные системные требования:

IBM PC: MS Windows 98 и выше;

процессор Pentium 2 – 400МГц;

64 Мб ОЗУ;

SVGA – карта (800х600, 65536 цветов);

Клавиатура;

Мышь

Состав пакета

В состав пользовательского пакета входит всего 2 файла:

TeRAn.exe – исполняемый файл.

hlp – файл справки, который при необходимости, можно сделать встроенным.

Все файлы должны лежать в одной папке и запускаться оттуда.

Руководство пользователя

Данная программа представляет собой текстовый редактор, предназначенный для набора, редактирования и форматирования текста. Сначала необходимо скопировать все файлы, входящие в программный пакет на жесткий диск (все файлы должны находиться в одной папке). Для начала работы с программой следует запустить файл TeRAn.exe, после чего появится сразу главная форма с полем для редактирования. Затем выбирайте нужные для вас действия, следуя всплывающим подсказкам, и подсказкам появляющимся в строке состояния.

Текст можно вводить как с клавиатуры, так и из файла.

Для того, чтобы прочитать руководство пользователя выберите пункт меню «? | Справка».

Для выхода из программы выберите пункт меню «Файл | Выход.

Для сохранности и успешной работы программы не рекомендуется вносить какие-либо изменения в файлы программного пакета, а также следует хранить эти файлы и запускать программу из одной папки.



		Недостатки и достоинства программы



У программы можно найти следующие достоинства: низкие системные и аппаратные требования, имеет простой алгоритм, по размеру значительно мала, приличная скорость работы. Программа не представляет сложности для пользователя и имеет практически все возможности редактирования текста.

Недостатком программы является отсутствие настроек параметров страницы. Нет предварительного просмотра для отправки на печать.

Также недостатком можно считать отсутствие выбора кодировки и отсутствие синтаксической подсветки.

Таким образом, у разработанной программы есть несколько способов дальнейшего усовершенствования, после которого программа бы избавилась от вышеописанных недостатков.


Заключение



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

В результате проделанной работы был повторен и использован при разработке программы пройденный материал по программированию в среде разработки C++Builder 6.

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

Достаточно интересно было работать над самой поставленной задачей. Во время работы был прочитан материал, связанный непосредственно с языком программирования С++.


Библиографический список



	Фаронов В.В., Программирование в Builder C++: Учебный курс. – СГб.: Питер, 2004.

	Архангельский А.Я., Тагин М.А. Приемы программирования в C++Builder 6 и 2006: Вычислительные задачи, работа с документами. – М:ЗАО «Издательство БИНОМ», 2007

	Архангельский А.Я. Справочное пособие по C++Builder 6 и 2006. Компоненты. - М:ЗАО «Издательство БИНОМ», 2006


Приложение



TeRAn.cpp

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

USEFORM("TeR.cpp", Form1);

USEFORM("Unit1.cpp", AboutBox);

USEFORM("Unit2.cpp", Form2);

//---------------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TForm1), &Form1);

Application->CreateForm(__classid(TForm2), &Form2);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (...)

{

try

{

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

//---------------------------------------------------------------------------

TeR.cpp

#include <vcl.h>

#pragma hdrstop

#include "TeR.h"

#include "Unit1.h"

#include "Unit2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "CSPIN"

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton4Click(TObject *Sender)

{

if (OpenDialog1->Execute())

RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);

StatusBar1->Panels->Items[0]->Text=(OpenDialog1->FileName);

SpeedButton4->Down=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton14Click(TObject *Sender)

{

if (ColorDialog1->Execute())

RichEdit1->SelAttributes->Color = ColorDialog1->Color;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)

{

if ( CSpinEdit1->Text != "" )

{

RichEdit1->SelAttributes->Size = CSpinEdit1->Value;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox1Change(TObject *Sender)

{

//Выбор шрифта

RichEdit1->SelAttributes->Name=ComboBox1->Items->Strings[ComboBox1 ->ItemIndex];

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton13Click(TObject *Sender)

{

//Полужирный



if (SpeedButton13->Down==true)

{

RichEdit1->SelAttributes->Style=TFontStyles()<< fsBold;

}

if (SpeedButton13->Down==false)

{

RichEdit1->SelAttributes->Style=TFontStyles();

}

if ((SpeedButton13->Down==true)&&(SpeedButton12->Down==true))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsBold<<fsItalic;

}

if ((SpeedButton13->Down==false)&&(SpeedButton12->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsItalic;

}

if ((SpeedButton13->Down)&&(SpeedButton11->Down))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsBold<<fsUnderline;

}

if ((SpeedButton13->Down==false)&&(SpeedButton11->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsUnderline;

}

if ((SpeedButton13->Down==true)&&(SpeedButton12->Down==true)&&(SpeedButton11->Down==true))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsBold<<fsItalic<<fsUnderline;

}

if ((SpeedButton13->Down==false)&&(SpeedButton12->Down==true)&&(SpeedButton11->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsItalic<<fsUnderline;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton12Click(TObject *Sender)

{

//курсив

if (SpeedButton12->Down==true)

{

RichEdit1->SelAttributes->Style=TFontStyles()<< fsItalic;

}

if (SpeedButton12->Down==false)

{

RichEdit1->SelAttributes->Style=TFontStyles();

}

if ((SpeedButton12->Down==true)&&(SpeedButton13->Down==true))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsBold<<fsItalic;

}

if ((SpeedButton12->Down==false)&&(SpeedButton13->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsBold;

}

if ((SpeedButton12->Down)&&(SpeedButton11->Down))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsItalic<<fsUnderline;

}

if ((SpeedButton12->Down==false)&&(SpeedButton11->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsUnderline;

}

if ((SpeedButton13->Down==true)&&(SpeedButton12->Down==true)&&(SpeedButton11->Down==true))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsBold<<fsItalic<<fsUnderline;

}

if ((SpeedButton13->Down==true)&&(SpeedButton12->Down==false)&&(SpeedButton11->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsBold<<fsUnderline;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton11Click(TObject *Sender)

{

if (SpeedButton11->Down==true)

{

RichEdit1->SelAttributes->Style=TFontStyles()<< fsUnderline;

}

if (SpeedButton11->Down==false)

{

RichEdit1->SelAttributes->Style=TFontStyles();

}

if ((SpeedButton11->Down==true)&&(SpeedButton13->Down==true))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsBold<<fsUnderline;

}

if ((SpeedButton11->Down==false)&&(SpeedButton13->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsBold;

}

if((SpeedButton11->Down==true)&&(SpeedButton12->Down==true))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsItalic<<fsUnderline;

}

if ((SpeedButton11->Down==false)&&(SpeedButton12->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsItalic;

}

if ((SpeedButton13->Down==true)&&(SpeedButton12->Down==true)&&(SpeedButton11->Down==true))

{

RichEdit1->SelAttributes->Style=TFontStyles()<<fsBold<<fsItalic<<fsUnderline;

}

if ((SpeedButton11->Down==false)&&(SpeedButton12->Down==true)&&(SpeedButton13->Down==true))

{

RichEdit1->SelAttributes->Style =TFontStyles()<<fsBold<<fsItalic;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton3Click(TObject *Sender)

{

if (SaveDialog1->Execute()) RichEdit1->Lines->SaveToFile(SaveDialog1->FileName);

StatusBar1->Panels->Items[0]->Text=SaveDialog1->FileName;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N5Click(TObject *Sender)

{

if (SaveDialog1->Execute()) RichEdit1->Lines->SaveToFile(SaveDialog1->FileName);

StatusBar1->Panels->Items[0]->Text=SaveDialog1->FileName;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)

{

RichEdit1->CopyToClipboard();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton6Click(TObject *Sender)

{

if (PrintDialog1->Execute()) RichEdit1->Print(" ");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N3Click(TObject *Sender)

{

if (OpenDialog1->Execute())

RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);

StatusBar1->Panels->Items[0]->Text=(OpenDialog1->FileName);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton7Click(TObject *Sender)

{

FindDialog1->Position = Point(RichEdit1->Left + RichEdit1->Width, RichEdit1->Top);

//FindDialog1->FindText=RichEdit1->SelText;

FindDialog1->Execute();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FindDialog1Find(TObject *Sender)

{

int FoundAt, StartPos, ToEnd;

if (RichEdit1->SelLength)

StartPos = RichEdit1->SelStart + RichEdit1->SelLength;

else

StartPos = 0;

ToEnd = RichEdit1->Text.Length() - StartPos;

FoundAt = RichEdit1->FindText(FindDialog1->FindText, StartPos, ToEnd, TSearchTypes()<< stMatchCase);

if (FoundAt != -1)

{

RichEdit1->SetFocus();

RichEdit1->SelStart = FoundAt;

RichEdit1->SelLength = FindDialog1->FindText.Length();

}



}

//---------------------------------------------------------------------------

void __fastcall TForm1::N9Click(TObject *Sender)

{



if (MessageBox(0,"Сохранить содержимое окна редактирования? ","Подтвердите сохранение",MB_YESNO)==IDYES)

if (SaveDialog1->Execute()) RichEdit1->Lines->SaveToFile(SaveDialog1->FileName);

Application->Terminate();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N16Click(TObject *Sender)

{

if (RichEdit1->Lines->Count>0)

{

if (MessageBox(0,"Сохранить содержимое окна редактирования? ","Подтвердите сохранение",MB_YESNO)==IDYES)

{

//N9Click(Sender);

}

}

RichEdit1->Clear();

StatusBar1->Panels->Items[0]->Text="Документ";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)

{

RichEdit1->CutToClipboard();

}

//---------------------------------------------------------------------------



void __fastcall TForm1::SpeedButton5Click(TObject *Sender)

{

RichEdit1->CopyToClipboard();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton9Click(TObject *Sender)

{

RichEdit1->PasteFromClipboard();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N20Click(TObject *Sender)

{

ReplaceDialog1->Execute();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender)

{

TReplaceDialog *dlg = (TReplaceDialog *)Sender;

int SelPos = RichEdit1->Lines->Text.Pos(dlg->FindText);

if (SelPos > 0)

{

RichEdit1->SelStart = SelPos - 1;

RichEdit1->SelLength = dlg->FindText.Length();

RichEdit1->SelText = dlg->ReplaceText;

}

else

MessageBeep(0);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N19Click(TObject *Sender)

{

FindDialog1->Position = Point(RichEdit1->Left + RichEdit1->Width, RichEdit1->Top);

FindDialog1->Execute(); 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N30Click(TObject *Sender)

{

if(FontDialog1->Execute())

{

RichEdit1->SelAttributes->Assign(FontDialog1->Font);

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N28Click(TObject *Sender)

{

Application->CreateForm(__classid(TAboutBox), &AboutBox);

AboutBox->ShowModal();

AboutBox->Free();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N7Click(TObject *Sender)

{

if (PrintDialog1->Execute()) RichEdit1->Print(" "); 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N24Click(TObject *Sender)

{

StatusBar1->Visible=! StatusBar1->Visible;

N24->Checked=! N24->Checked;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N22Click(TObject *Sender)

{

Panel1->Visible=! Panel1->Visible;

N22->Checked=! N22->Checked;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N23Click(TObject *Sender)

{

Panel2->Visible=! Panel2->Visible;

N23->Checked=! N23->Checked;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton16Click(TObject *Sender)

{

if(ColorDialog1->Execute())

{RichEdit1->Color=ColorDialog1->Color;} 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton17Click(TObject *Sender)

{

RichEdit1->Paragraph->Alignment=taLeftJustify; 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton18Click(TObject *Sender)

{

RichEdit1->Paragraph->Alignment=taCenter; 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton19Click(TObject *Sender)

{

if(SpeedButton11->Down==true)

{

RichEdit1->Paragraph->Numbering=nsBullet;

}

else 

{

RichEdit1->Paragraph->Numbering=nsNone;

} 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton15Click(TObject *Sender)

{

RichEdit1->Paragraph->Alignment=taRightJustify;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::CSpinEdit1KeyPress(TObject *Sender, char &Key)

{

if((Key!=VK_BACK)&&(Key!='9')&&(Key!='8')&&(Key!='7')&&(Key!='6'))

{

Set <char, '0','9'> Dig;

Dig << '0'<< '1'<< '2' << '3'<< '4' << '5'<< ' 6 '<< ' 7 '<< ' 8 '<< ' 9 ' ;

if ( ! Dig.Contains(Key)) { Key = 0; Beep () ;}

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormShow(TObject *Sender)

{

int i;

for (i=0; i<Screen->Fonts->Count; i++)

{

ComboBox1->Items->Add (Screen->Fonts->Strings[i] ) ;

}

CSpinEdit1->Value=RichEdit1->SelAttributes->Size;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RichEdit1MouseUp(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

if(RichEdit1->Paragraph->Numbering==nsNone)

{SpeedButton19->Down=false;}

if(RichEdit1->Paragraph->Numbering==nsBullet)

{SpeedButton19->Down=true;}

switch (RichEdit1->Paragraph->Alignment)

{case taLeftJustify: SpeedButton17->Down=true; break;

case taCenter: SpeedButton18->Down=true; break;

case taRightJustify: SpeedButton15->Down=true; break;}

if(RichEdit1->SelAttributes->Style==RichEdit1->SelAttributes->Style<<fsBold)

{SpeedButton13->Down=true;}

else{SpeedButton13->Down=false;}

if(RichEdit1->SelAttributes->Style==RichEdit1->SelAttributes->Style<<fsUnderline)

{SpeedButton11->Down=true;}

else{SpeedButton11->Down=false;}

if(RichEdit1->SelAttributes->Style==RichEdit1->SelAttributes->Style<<fsItalic)

{SpeedButton12->Down=true;}

else{SpeedButton12->Down=false;}

CSpinEdit1->Value=RichEdit1->SelAttributes->Size;

ComboBox1->ItemIndex = ComboBox1->Items->IndexOf(RichEdit1->SelAttributes->Name) ;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RichEdit1KeyUp(TObject *Sender, WORD &Key,

TShiftState Shift)

{

if(RichEdit1->Paragraph->Numbering==nsNone)

{SpeedButton19->Down=false;}

if(RichEdit1->Paragraph->Numbering==nsBullet)

{SpeedButton19->Down=true;}

switch (RichEdit1->Paragraph->Alignment)

{case taLeftJustify: SpeedButton17->Down=true; break;

case taCenter: SpeedButton18->Down=true; break;

case taRightJustify: SpeedButton15->Down=true; break;}

if(RichEdit1->SelAttributes->Style==RichEdit1->SelAttributes->Style<<fsBold)

{SpeedButton13->Down=true;}

else{SpeedButton13->Down=false;}

if(RichEdit1->SelAttributes->Style==RichEdit1->SelAttributes->Style<<fsUnderline)

{SpeedButton11->Down=true;}

else{SpeedButton11->Down=false;}

if(RichEdit1->SelAttributes->Style==RichEdit1->SelAttributes->Style<<fsItalic)

{SpeedButton12->Down=true;}

else{SpeedButton12->Down=false;}

CSpinEdit1->Value=RichEdit1->SelAttributes->Size;

ComboBox1->ItemIndex = ComboBox1->Items->IndexOf(RichEdit1->SelAttributes->Name) ; 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

RichEdit1->Clear(); 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

Action=caFree; 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)

{

if(RichEdit1->Modified)

{

int res=Application->MessageBox("Текст документа не сохранен. \n\n" "Сохранить документ в файле\n\n" "(Отмена - продолжение работы)", "Подтвердите завершение работы", MB_YESNOCANCEL+MB_ICONQUESTION);

switch(res)

{

case IDYES: N5Click(Sender); break;

case IDCANCEL: CanClose=false;

}

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::N26Click(TObject *Sender)

{

Application->CreateForm(__classid(TForm2), &Form2);

Form2->Memo1->Lines->LoadFromFile("hlp");

Form2->ShowModal();

Form2->Free();

}