Реферат: Разработка текстового редактора

Министерство образования Украины

Харьковскийгосударственный технический

университетрадиоэлектроники


Кафедра ПО ЭВМ

 

Курсовой проект по дисциплине:

«Основы программирования иалгоритмические языки»

Тема:

«Разработка текстового редактора»


Работу выполнил:

Ст. гр. ИСПР-99-2

Морашко Алексей

Руководитель:

 

Работа защищена с оценкой:


 

Комиссия:

 


Харьков, 2000 г.

                                                                 


ХГТУРЭ

/>/>/>/>/>Кафедра ПО ЭВМ

Задание

на курсовую работу по дисциплине «ОП и АЯ»

ст. гр. ИСПР-99-2 Морашко А.Г.

Тема: «Разработка текстового редактора в Borland C++Builder»

І        Разработать текстовый редактор, которыйимел бы такие возможности:

·    Открывать и сохранять текстовые файлы типаTXT или RTF

·    Возможности редактирования текста

·    Простой и удобный интерфейс

ІІ       Константы. Их синтаксис и применение.

Дата  выдачи задания:                                                                    Дата защиты:

Студент:Морашко А.Г.

Руководитель:


/>/>/>/>/>/>Реферат

Данная работа содержит 30 страниц, включаяприложение; 5 иллюстраций.

Цель работы: создать, используя систему программирования C++Builder, текстовый редактор.

Объект исследования: текстовый редактор, разработанный в C++Builder, умеющий редактировать файлытипа TXT и RTF. Вперспективе планируется редактирование формата документов типа DOC.

Ключевые слова:

C++BUILDER, ТЕКСТОВЫЙ РЕДАКТОР,КОНСТАНЫ, ФОРМАТ ТЕКСТОВЫХ ФАЙЛОВ, ХАРАКТЕРИСТИКИ


/>/>Содержание

Реферат. 3

Содержание. 4

Введение. 5

1 Описание программы… 6

1.1       Основные характеристики. 6

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

2.1       Константы… 14

2.1.1        Целые Константы… 14

2.1.2        Константы с Плавающей Точкой. 15

2.1.3        Символьные Константы… 15

2.1.4        Строки. 16

2.1.5        Ноль. 17

2.1.6        Const 18

2.1.7        Перечисления. 19

Перечень ссылок. 21

Приложение А… 22


Введение

Нескольколет назад исследователи заметили, что программисты в течение определенноговремени пишут и отлаживают  приблизительно одинаковый по объему код, независимоот используемого языка программирования. Объем работы примерно тот же, норезультаты разные. Написание 100 строк на С требует столько же затрат, сколькои 100 строк кода на ассемблере, но возможности кода на С гораздо шире. Понявэто, исследователи начали разрабатывать языки высокого уровня, которыеувеличивали бы потенциал отдельного программиста, сокращая тем самым строки истоимость разработки проектов.

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

Объектно-ориентированноепрограммирование – это методология, которая концентрируется больше на связяхмежду объектами, чем на деталях реализации. Данные связи обычно развиваются попринципу деревьев, при этом новые типы объектов образуются уже из существующих.Сокрытие реализации объекта ведет к тому, что пользователя больше волнует связьс остальными объектами, чем поведение объекта. Данное отличие очень важно, посколькуоно означает принципиальный отказ от «императивных» языков (таких как С), вкоторых функции и вызовы функций составляют основу деятельности.

В С++некоторые объекты являются частью самого языка. Но в целом задача созданияновых объектов ложится на пользователя. В C++Builder имеется множество типов объектов, но реальноеиспользование языка требует  создания новых типов. Эффективность ООПпроявляется только при создании и применении групп связанных между собойобъектов. Такие группы называют иерархиями классов. Развитие этих иерархийклассов является основой деятельности в ООП.

 C++Builder являетсяобъектно-ориентированным языком программирования и на примере созданиятекстового редактора я хочу продемонстрировать всю мощь и быстроту визуального,объектно-ориентированного программирования.


/>/>/>/>1Описание программы/>/>/>/>1.1     Основные характеристики

            Рассматриваемая программа имеетвозможность редактирования текстовых файлов типа TXT и RTF, атакже им подобные.

Программа представляетсобой EXE файл; программа умеет открывать исохранять текстовые файлы, редактировать их, изменять шрифт и размер текста,имеет поиск и замену текста. Описание функций и клавиш будет приведено ниже.

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

         Выполняемый файл называется WORD.EXE.После его запуска на экране появляется окно, показанное на Рисунок 1. 1

/>

Рисунок 1. 1 –  Окно программы,возникающее после запуска

После того как программа запуститсяее можно использовать.

Кнопкипанели управления

/> -создание новогодокумента.

/> - открытие документа

/> - сохранение документа

/> — вырезание выделенноготекста

/> - копирование выделенноготекста

/> - вставка текста из буфераобмена

/> - отмена последнегодействия

/> - поиск в тексте

/> - замена в тексте

/> - печать документа

/> - выбор шрифта для выделенноготекста

/>   - изменение размеравыбранного текста

/> - полужирный шрифт

/> - курсивный шрифт

/> - подчеркнутый шрифт

/> - равнение текста полевому краю

/> - равнение текста поцентру

/> - равнение текста поправому краю

/> - маркировка выделенногоабзаца

 

Работас документами

 

Создание нового документа

1.  В меню Файл выберитекоманду Новый.

2.  Начните ввод текста.

Чтобы сохранить новый файл, выберите в меню Файл команду Сохранить как и введите имя в поле Имя файла.

Сохранение измененного документа

В меню Файл выберите команду Сохранить.

Примечание

Чтобы сохранить существующий документ под другим именем, выберите команду Сохранить как и введите новое имя в поле Имя файла.

Открытие документа

1.  В меню Файл выберитекоманду Открыть.

/>

Рисунок 1.2 – Окно открытия файла.

2.  В открывшемся окне (рис 1.2), вполе со списком Папка выберите диск, содержащий документ, которыйследует открыть.

3.  Дважды щелкните папку, содержащуюнужный документ.

4.  Выберите документ и нажмите кнопкуОткрыть.

Примечания

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

Настройка окна MAGWord

 

Вывод на экран или скрытие линейки

В меню Вид выберите команду Линейка.

Если слева от этойкоманды в меню стоит метка, линейка находится на экране.

Вывод на экран или скрытие панелиинструментов

В меню Вид выберите команду Панельинструментов.

Если слева от этой команды в меню стоитметка, панель инструментов находится на экране.

Примечания

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

 

Работа с текстом

 

Отмена последнего действия

В меню Правка выберите команду Отменить.

Удаление текста

1.  Выделите текст, который следуетудалить.

2.  Чтобы переместить текст в другуючасть документа, выберите в меню Правка команду Вырезать.

Чтобы простоудалить текст из документа, нажмите клавишу DELETE.

Примечания

Чтобы снять выделение, щелкните любое место в документе. Чтобы отменить удаление, выберите в меню Правка команду Отменить. Чтобы выделить для удаления весь текст в документе нажмите Ctrl+A.

Поиск текста

1.  В документе щелкните место, скоторого следует начать поиск текста.

2.  В меню Правка выберитекоманду Поиск. В появившемся окне (Рисунок 1.3) установить параметрыпоиска.

3.  В поле Образец введитеобразец текста для поиска и нажмите кнопку Найти далее.

/>

Рисунок 1.3 – Окно поиска текста

4.  Чтобы найти следующие вхожденияискомого текста, нажимайте кнопку Найти далее.

Примечания

·    Для поиска и замены текставыберите в меню Правка команду Заменить.

Поиск и замена текста

1.  В меню Правка выберитекоманду Заменить.

2.  В поле Образец введитеобразец текста для поиска и замены.

3.  В поле Заменить на введитеновый текст.

Примечания

Чтобы заменить все вхождения искомого текста, нажмите кнопку Заменить все. Чтобы заменять каждое вхождение образца по отдельности, нажимайте кнопку Найти далее, а затем кнопку Заменить.

Форматирование текста

Создание маркированного списка

1.  Щелкните место в документе, скоторого следует начать маркированный список.

2.  В меню Формат выберитекоманду Маркер, а затем начинайте ввод текста. При каждом нажатииклавиши ENTER на следующей строке будет появляться новый маркер.

3.  Чтобы завершить маркированныйсписок, выберите команду Маркер еще раз.

Изменение шрифта, начертания и размерасимволов

1.  Выделите текст, формат которогоследует изменить.

2.  В меню Правка выберитекоманду Шрифт. Откроется диалоговое окно показанное на рисунке 1.4.

/>

Рисунок 1.4 – Окно выбора шрифта.

3.  Выберите нужные параметры инажмите кнопку применить.

Примечания

Чтобы задать шрифт для оформления нового текста, измените его до начала ввода текста. Чтобы изменить шрифт всего документа, нажмите Ctrl+A, а затем в меню Правка выберите Шрифт.

 

Форматирование абзаца

1.  Щелкните любое место внутриабзаца, который требуется отформатировать.

2.  На панели инструментов щелкните поодной из кнопок выравнивания текста и задайте параметры отступа с помощьюлинейки.

Печать

 

Смена принтера и изменение параметровпечати

1.  Чтобы сменить принтер, нажмитекнопку Печать. Откроется диалоговое окно показанное на рисунке 1.5.Выберите имя принтера в поле со списком Имя.

/>

Рисунок 1.5 — Диалоговое окно печати документа.

2.  Чтобы начать печать щелкните покнопке OK.


 

/>/>2.1    Константы 

C++дает возможность записи значений основных типов: символьных констант, целыхконстант и констант с плавающей точкой. Кроме того, ноль (0) можетиспользоваться как константа любого указательного типа, и символьные строкиявляются константами типа char[]. Можно также задавать символические константы.Символическая константа — это имя, значение которого не может быть изменено вего области видимости. В C++ имеется три вида символических констант: (1)любому значению любого типа можно дать имя и использовать его как константу,добавив к его описанию ключевое слово const; (2) множество целых констант можетбыть определено как перечисление; и (3) любое имя вектора или функции являетсяконстантой.

/>/>2.1.1  Целые Константы

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

  0    1234    976    12345678901234567890

Десятичная константа имеет тип int, при условии, чтоона влезает в int, в противном случае ее тип long. Компилятор долженпредупреждать о константах, которые слишком длинны для представления в машине.Константа, которая начинается нулем за которым идет x (0x), являетсяшестнадцатеричным числом (с основанием 16), а константа, которая начинаетсянулем за которым идет цифра, является восьмеричным числом (с основанием 8). Вотпримеры восьмеричных констант:

  0        02        077        0123


их десятичные эквиваленты — это 0, 2, 63, 83. В шестнадцатеричной записи этиконстанты выглядят так:

 

  0x0      0x2       0x3f       0x53


Буквы a, b, c, d, e и f, или их эквиваленты в верхнем регистре, используютсядля представления чисел 10, 11. 12, 13, 14 и 15, соответственно. Восьмеричная ишестнадцатеричная записи наиболее полезны для записи набора битов; применениеэтих записей для выражения обычных чисел может привести к неожиданностям.Например, на машине, где int представляется как двоичное дополнительноешестнадцатеричное целое, 0xffff является отрицательным десятичным числом -1;если бы для представления целого использовалось большее число битов, то онобыло бы числом 65535.

/>/>2.1.2  Константы с ПлавающейТочкой

Константыс плавающей точкой имеют тип double. Как и в предыдущем случае, компилятордолжен предупреждать о константах с плавающей точкой, которые слишком велики,чтобы их можно было представить. Вот некоторые константы с плавающей точкой:

  1.23    .23      0.23     1.    1.0     1.2e10    1.23e-15

Заметьте, что в середине константы с плавающей точкойне может встречаться пробел. Например, 65.43 e-21 является не константой сплавающей точкой, а четырьмя отдельными лексическими символами (лексемами):

  65.43    e    -    21


и вызовет синтаксическую ошибку.

Если вы хотите иметь константу с плавающей точкой типаfloat, вы можете определить ее так:

  const float pi = 3.14159265;

 

/>/>2.1.3  Символьные Константы

Хотяв C++ и нет отдельного символьного типа данных, точнее, символ может хранитьсяв целом типе, в нем для символов имеется специальная и удобная запись. Символьнаяконстанта — это символ, заключенный в одинарные кавычки; например, 'a' или '0'.Такие символьные константы в действительности являются символическимиконстантами для целого значения символов в наборе символов той машины, накоторой будет выполняться программа (который не обязательно совпадает с наборомсимволов, применяемом на том компьютере, где программа компилируется). Поэтому,если вы выполняетесь на машине, использующей набор символов ASCII, то значением'0' будет 48, но если ваша машина использует EBCDIC, то оно будет 240.Употребление символьных констант вместо десятичной записи делает программуболее переносимой. Несколько символов также имеют стандартные имена, в которыхобратная косая \ используется как escape-символ:

'\b' возврат назад '\f' перевод формата '\n' новая строка '\r' возврат каретки '\t' горизонтальная табуляция '\v' вертикальная табуляция '\\' обратная косая (обратный слэш) '\'' одинарная кавычка '\"' двойная кавычка '\0' null, пустой символ, целое значение 0


Вопреки их внешнему виду каждое является одним символом. Можно такжепредставлять символ одно-, дву- или трехзначным восьмеричным числом (символ \,за которым идут восьмеричные цифры), или одно-, дву- или трехзначнымшестнадцатеричным числом (\x, за которым идут шестнадцатеричные цифры).Например:

  '\6'      '\x6'        6        ASCII ack

  '\60'     '\x30'       48       ASCII '0'

  '\137'    '\x05f'      95       ASCII '_'


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

/>/>2.1.4  Строки

Строковаяконстанта — это последовательность символов, заключенная в двойные кавычки:

  «это строка»


Каждая строковая константа содержит на один символ больше, чем кажется; все онизаканчиваются пустым символом '\0' со значением 0. Например:

  sizeof(«asdf»)==5;


Строка имеет тип «вектор из соответствующего числа символов», поэтому«asdf» имеет тип char[5]. Пустая строка записывается "" (иимеет тип char[1]). Заметьте, что для каждой строки s strlen(s)==sizeof(s)-1,поскольку strlen() не учитывает завершающий 0. Соглашение о представлениинеграфических символов с обратной косой можно использовать также и внутристроки. Это дает возможность представлять в строке двойные кавычки иescape-символ \. Самым обычным символом этого рода является, безусловно, символновой строки '\n'. Например:

  cout << «гудок в конце сообщения\007\n»


где 7 — значение ASKII символа bel (звонок). В строке невозможно иметь «настоящую»новую строку:

  «это не строка,

  а синтаксическая ошибка»


Однако в строке может стоять обратная косая, сразу после которой идет новаястрока; и то, и другое будет проигнорировано. Например:

  cout << «здесь все \

  ok»


напечатает

  здесь все ok


Новая строка, перед которой идет escape (обратная косая), не приводит к появлениюв строке новой строки, это просто договоренность о записи. В строке можно иметьпустой символ, но большинство программ не будет предполагать, что есть символыпосле него. Например, строка «asdf\000hjkl» будет рассматриватьсястандартными функциями, вроде strcpy() и strlen(), как «asdf».

Вставляя численную константу в строку с помощьювосьмеричной или шестнадцатеричной записи благоразумно всегда использоватьчисло из трех цифр. Читать запись достаточно трудно и без необходимости беспокоитьсяо том, является ли символ после константы цифрой или нет. Разберите эти примеры:

  char v1[] = «a\x0fah\0129»;    // 'a' '\xfa' 'h' '\12' '9'

  char v2[] = «a\xfah\129»;      // 'a' '\xfa' 'h' '\12' '9'

  char v3[] = «a\xfad\127»;      // 'a' '\xfad' '\127'


Имейте в виду, что двузначной шестнадцатеричной записи на машинах с 9-битовымбайтом будет недостаточно.

/>/>2.1.5  Ноль

Ноль(0) можно употреблять как константу любого целого, плавающего или указательноготипа. Никакой объект не размещается по адресу 0. Тип нуля определяется контекстом.Обычно (но не обязательно) он представляется набором битов все-нули соответствующейдлины.

/>/>2.1.6  Const

Ключевоеслово const может добавляться к описанию объекта, чтобы сделать этот объектконстантой, а не переменной. Например:

  const int model = 145;

  const int v[] = { 1, 2, 3, 4 };


Поскольку константе ничего нельзя присвоить, она должна быть инициализирована.Описание чего-нибудь как const гарантирует, что его значение не изменится вобласти видимости:

  model = 145;        // ошибка

  model++;            // ошибка


Заметьте, что const изменяет тип, то есть ограничивает способ использованияобъекта, вместо того, чтобы задавать способ размещения константы. Поэтомунапример вполне разумно, а иногда и полезно, описывать функцию как возвращающуюconst:

  const char* peek(int i)

  {

      return private[i];

  }


Функцию вроде этой можно было бы использовать для того, чтобы даватькому-нибудь читать строку, которая не может быть затерта или переписана (этимкем-то). С другой стороны, компилятор может несколькими путями воспользоватьсятем, что объект является константой (конечно, в зависимости от того, насколькоон сообразителен). Самое очевидное — это то, что для константы не требуетсявыделять память, поскольку компилятор знает ее значение. Кроме того,инициализатор константы часто (но не всегда) является константным выражением,то есть он может быть вычислен на стадии компиляции. Однако для вектораконстант обычно приходится выделять память, поскольку компилятор в общем случаене может вычислить, на какие элементы вектора сделаны ссылки в выражениях.Однако на многих машинах даже в этом случае может достигаться повышение эффективностипутем размещения векторов констант в память, доступную только для чтения. Использованиеуказателя вовлекает два объекта: сам указатель и указываемый объект. Снабжениеописания указателя «префиксом» const делает объект, но не самуказатель, константой. Например:

  const char* pc = «asdf»;    // указатель на константу

  pc[3] = 'a';                // ошибка

  pc = «ghjk»;                // ok


Чтобы описать сам указатель, а не указываемый объект, как константный,используется операция const*. Например:

  char *const cp = «asdf»;    // константный указатель

  cp[3] = 'a';                // ok

  cp = «ghjk»;                // ошибка


Чтобы сделать константами оба объекта, их оба нужно описать const. Например:

  const char *const cpc = «asdf»;    // const указатель на const

  cpc[3] = 'a';                      // ошибка

  cpc = «ghjk»;                      // ошибка


Объект, являющийся константой при доступе к нему через один указатель, можетбыть переменной, когда доступ осуществляется другими путями. Это в частностиполезно для параметров функции. Посредством описания параметра указателя какconst функции запрещается изменять объект, на который он указывает. Например:

  char* strcpy(char* p, const char* q); // не может изменить q


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

  int a = 1;

  const c = 2;

  const* p1 = &c;    // ok

  const* p2 = &a;    // ok

  int* p3 = &c;      // ошибка

  *p3 = 7;           // меняет значение c


Как обычно, если тип в описании опущен, то он предполагается int.

/>/>2.1.7  Перечисления

Естьдругой метод определения целых констант, который иногда более удобен, чем применениеconst. Например:

  enum { ASM, AUTO, BREAK };


определяет три целых константы, называемы перечислителями, и присваивает имзначения. Поскольку значения перечислителей по умолчанию присваиваются начинаяс 0 в порядке возрастания, это эквивалентно записи:

  const ASM = 0;

  const AUTO = 1;

  const BREAK = 2;


Перечисление может быть именованным. Например:

  enum keyword { ASM, AUTO, BREAK };


Имя перечисления становится синонимом int, а не новым типом. Описаниепеременной keyword, а не просто int, может дать как программисту, так икомпилятору подсказку о том, что использование преднамеренное. Например:

  keyword key;

 

  switch (key) {

  case ASM:

      // что-то делает

      break;

  case BREAK:

      // что-то делает

      break;

  }


побуждает компилятор выдать предупреждение, поскольку только два значенияkeyword из трех используются. Можно также задавать значения перечислителейявно. Например:

  enum int16 {

      sign=0100000,               // знак

      most_significant=040000,    // самый значимый

      least_significant=1         // наименее значимый

  };


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


/>/>Перечень ссылок

1.       ГербертШилдт, Самоучитель С++, 3-е издание: BHV – Санкт-Петербург, 1998. – 688 с.

2.       РубенкингН. Программирование в Delphi для «чайников». 2-е издание – К.:«Диалектика», 1996. – 368 с.

3.       ФароновВ.В. Delphi 4. Учебный курс.-М.:«Нолидж», 1999.-464 с.


Приложение А

#include <vcl.h>

#pragma hdrstop

#include «About.h»

#include «AlexWord.h»

#include «LogoStrs.h»

const float RulerAdj = 4.0/3.0;

const int GutterWid = 6;

#pragma link «CGRID»

#pragma resource "*.dfm"

TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent *Owner)

: TForm(Owner)

{

}

void __fastcallTForm1::RichEdit1SelectionChange(TObject *Sender)

{

    char sizebuf[6];

try {

FUpdating = True;

ComboBox1->Text =RichEdit1->SelAttributes->Name;

FirstInd->Left =int(RichEdit1->Paragraph->FirstIndent*RulerAdj)-4+GutterWid;

LeftInd->Left  =int((RichEdit1->Paragraph->LeftIndent+

RichEdit1->Paragraph->FirstIndent)*RulerAdj)-4+GutterWid;

RightInd->Left =Ruler->ClientWidth-6-int(

(RichEdit1->Paragraph->RightIndent+GutterWid)*RulerAdj);

if(CurrText()->Style==CurrText()->Style  >> fsItalic)

 ToolButton17->Down=false;

 else ToolButton17->Down=true;

if(CurrText()->Style==CurrText()->Style  >> fsBold)

 ToolButton15->Down=false;

 else ToolButton15->Down=true;

if(CurrText()->Style==CurrText()->Style  >> fsUnderline)

 ToolButton3->Down=false;

 else ToolButton3->Down=true;

Edit2->Text =itoa(RichEdit1->SelAttributes->Size, sizebuf, 10);

if (RichEdit1->Paragraph->Alignment ==taLeftJustify)

LeftAlign->Down=true;

else LeftAlign->Down=false;

if (RichEdit1->Paragraph->Alignment ==taCenter)

CenterAlign->Down=true;

else CenterAlign->Down=false;

if (RichEdit1->Paragraph->Alignment ==taRightJustify)

RightAlign->Down=true;

else RightAlign->Down=false;

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

ToolButton14->Down=true;

else ToolButton14->Down=false;

                    }

     catch (...) {

       FUpdating = False;

                 }

     FUpdating = False;

 }

TTextAttributes *__fastcallTForm1::CurrText(void)

{

    return RichEdit1->SelAttributes;

}

void __fastcallTForm1::FileNew1Execute(TObject *Sender)

{

FFileName = LoadStr(sUntitled);

RichEdit1->Lines->Clear();

RichEdit1->Modified = false;

}

void __fastcallTForm1::FileOpen1Execute(TObject *Sender)

{

   if (OpenDialog->Execute())

{

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

      FFileName = OpenDialog->FileName;

      RichEdit1->SetFocus();

      RichEdit1->Modified = false;

     RichEdit1->ReadOnly =OpenDialog->Options.Contains(ofReadOnly);

                Form1->Caption =OpenDialog->FileName;

}

}

void __fastcallTForm1::FileSave1Execute(TObject *Sender)

{

if (FFileName == LoadStr(sUntitled))

           {

        FileSaveAs1Execute(Sender);

        Form1->Caption =SaveDialog->FileName; }

else

{

     RichEdit1->Lines->SaveToFile(FFileName);

     RichEdit1->Modified = false;     }

}

void __fastcallTForm1::FileSaveAs1Execute(TObject *Sender)

{

String str;

TVarRec vrs[1];

if (SaveDialog->Execute())

{

      if(FileExists(SaveDialog->FileName))

      {

         str = FmtLoadStr(sOverwrite,OPENARRAY(TVarRec, (SaveDialog->FileName)));

         if (MessageDlg(str, mtConfirmation,TMsgDlgButtons() << mbYes << mbNo <<

          mbCancel, 0) != IDYES)

         return;

      }

      RichEdit1->Lines->SaveToFile(SaveDialog->FileName);

      FFileName = SaveDialog->FileName;

      RichEdit1->Modified = false;

}

}

void __fastcall TForm1::CheckFileSave(void)

{

if ( RichEdit1->Modified ) {

        switch(MessageBox(Handle, «SaveChanges?»,

         «Confirmation»,MB_YESNOCANCEL | MB_ICONQUESTION))

        {  case ID_YES   :FileSave1Execute(this);

           case ID_CANCEL: Abort();

        }

     }

}

void __fastcallTForm1::FileExit1Execute(TObject *Sender)

{

Close();

}

void __fastcallTForm1::HelpAbout1Execute(TObject *Sender)

{

AboutBox->ShowModal();

}

void __fastcall TForm1::UndoClick(TObject*Sender)

{

if ( RichEdit1->HandleAllocated() )

        SendMessage(RichEdit1->Handle,EM_UNDO, 0, 0);

}

void __fastcall TForm1::PrintClick(TObject*Sender)

{

if (PrintDialog1->Execute())RichEdit1->Print(OpenDialog->FileName);

}

void __fastcallTForm1::Print_SetupClick(TObject *Sender)

{

PrinterSetupDialog1->Execute();

}

void __fastcall TForm1::FindClick(TObject*Sender)

{

  FindDialog1->FindText =RichEdit1->SelText;

    FindDialog1->Execute();

      }

void __fastcallTForm1::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 __fastcallTForm1::ReplaceDialog1Replace(TObject *Sender)

{

    if (RichEdit1->SelLength == 0)

        FindDialog1Find(Sender);

    else

    {

        RichEdit1->SelText =  ReplaceDialog1->ReplaceText;

        FindDialog1Find(Sender);

    }

    if(ReplaceDialog1->Options.Contains(frReplaceAll))

        while (RichEdit1->SelLength !=0)

            ReplaceDialog1Replace(Sender);

}

void __fastcall TForm1::ReplaceClick(TObject *Sender)

{

ReplaceDialog1->Execute();

}

void __fastcall TForm1::N5Click(TObject*Sender)

{

FontDialog1->Options <<fdApplyButton;

 FontDialog1->Execute();

}

void __fastcallTForm1::FontDialog1Apply(TObject *Sender, HWND Wnd)

{

if (ActiveControl->ClassNameIs(«TEdit»))

   ((TEdit*)ActiveControl)->Font->Assign(FontDialog1->Font);

  else if(ActiveControl->ClassNameIs(«TRichEdit»))

    ((TRichEdit*)ActiveControl)->SelAttributes->Assign(FontDialog1->Font);

  else

    MessageBeep(0);

}

void __fastcall TForm1::prClick(TObject*Sender)

{

ToolButton8->Visible=false;

}

void __fastcall TForm1::rp1Click(TObject*Sender)

{

ToolButton8->Visible=true;

}

void __fastcallTForm1::CenterAlignClick(TObject *Sender)

{

  RichEdit1->Paragraph->Alignment =taCenter;

}

void __fastcallTForm1::LeftAlignClick(TObject *Sender)

{

 RichEdit1->Paragraph->Alignment =taLeftJustify;

}

void __fastcallTForm1::RightAlignClick(TObject *Sender)

{

  RichEdit1->Paragraph->Alignment =taRightJustify;

}

void __fastcall TForm1::SetupRuler(void)

{    int iCtr = 1;

     char sTmp[201];

     while (iCtr < 200) {

       sTmp[iCtr] = 9;

       iCtr++;

       sTmp[iCtr] = '|';

       iCtr++;

     }

     Ruler->Caption = (AnsiString)sTmp;

}

void __fastcall TForm1::FormCreate(TObject*Sender)

{

 OpenDialog->InitialDir =ExtractFilePath(ParamStr(0));

 SaveDialog->InitialDir =OpenDialog->InitialDir;

 SetupRuler();

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

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

  RichEdit1->SelStart = 0;

}

void __fastcallTForm1::ToolButton14Click(TObject *Sender)

{

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

   RichEdit1->Paragraph->Numbering =TNumberingStyle(nsNone);

 else

   RichEdit1->Paragraph->Numbering =TNumberingStyle(nsBullet);

}

void __fastcallTForm1::ComboBox1Change(TObject *Sender)

{

   TCharsetObject* ChasrsetObject;

   if ( !FUpdating ){

   ChasrsetObject =(TCharsetObject*)ComboBox1->Items->Objects[ComboBox1->ItemIndex];

   CurrText()->Name =ComboBox1->Items->Strings[ComboBox1->ItemIndex];

}

}

void __fastcallTForm1::ToolButton15Click(TObject *Sender)

{

 if (CurrText()->Style ==CurrText()->Style >> fsBold)

     CurrText()->Style =CurrText()->Style << fsBold;

  else

     CurrText()->Style =CurrText()->Style >> fsBold;

}

void __fastcallTForm1::ToolButton17Click(TObject *Sender)

{

  if (CurrText()->Style==CurrText()->Style  >> fsItalic)

     CurrText()->Style =CurrText()->Style << fsItalic;

  else

     CurrText()->Style =CurrText()->Style >> fsItalic;

}

void __fastcall TForm1::Edit2Change(TObject*Sender)

{

  int fontsize =atoi(Edit2->Text.c_str());

     if ((!FUpdating) &&  (fontsize))

     {

      CurrText()->Size =atoi(Edit2->Text.c_str());

     }

}

void __fastcallTForm1::ToolButton3Click(TObject *Sender)

{

 if (CurrText()->Style==CurrText()->Style  >> fsUnderline)

     CurrText()->Style =CurrText()->Style << fsUnderline;

  else

     CurrText()->Style =CurrText()->Style >> fsUnderline;

}

void __fastcallTForm1::FirstIndMouseDown(TObject *Sender,

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

{

TLabel * oTmpLabel = (TLabel *)Sender;

     FDragOfs = oTmpLabel->Width / 2;

     oTmpLabel->Left =oTmpLabel->Left+X-FDragOfs;

     FDragging = True;       

}

void __fastcall TForm1::FirstIndMouseUp(TObject*Sender,

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

{

FDragging = False;

     RichEdit1->Paragraph->FirstIndent= int((FirstInd->Left+FDragOfs-GutterWid) / RulerAdj);

     LeftIndMouseUp(Sender, Button, Shift, X,Y);       

}

void __fastcallTForm1::LeftIndMouseUp(TObject *Sender,

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

{

FDragging = False;

     RichEdit1->Paragraph->LeftIndent =int((LeftInd->Left+FDragOfs-GutterWid)/

               RulerAdj)-RichEdit1->Paragraph->FirstIndent;

     RichEdit1SelectionChange(Sender);

}

void __fastcallTForm1::FirstIndMouseMove(TObject *Sender,

      TShiftState Shift, int X, int Y)

{

if (FDragging) {

        TLabel * oTmpLabel = (TLabel*)Sender;

        oTmpLabel->Left = oTmpLabel->Left+X-FDragOfs;       

}  

}

void __fastcallTForm1::RightIndMouseUp(TObject *Sender,

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

{

FDragging = False;

     RichEdit1->Paragraph->RightIndent=

         int((Ruler->ClientWidth-RightInd->Left+FDragOfs-2)/

         RulerAdj)-2*GutterWid;

     RichEdit1SelectionChange(Sender);

}

void __fastcall TForm1::RulerResize(TObject*Sender)

{

RulerLine->Width =(int)Ruler->ClientWidth — (RulerLine->Left*2);       

}

void __fastcall TForm1::FormPaint(TObject*Sender)

{

TRect Rct = Rect(GutterWid, 0,RichEdit1->ClientWidth-GutterWid,

                               ClientHeight);

     SendMessage(RichEdit1->Handle,EM_SETRECT, 0, long(&Rct));;

}

void __fastcall TForm1::FormResize(TObject*Sender)

{

 RichEdit1SelectionChange(Sender);

}

void __fastcall TForm1::FormActivate(TObject*Sender)

{

FileNew1Execute(Sender);

RichEdit1->SetFocus();

}

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

{

try{

      CheckFileSave();

    }

     catch (...) {

      CanClose = False;

    }

}

void __fastcall TForm1::NRulerClick(TObject*Sender)

{

 if (Ruler->Visible==false)

 {

   Ruler->Visible=true;

   NRuler->Checked=true;}

 else {Ruler->Visible=false;NRuler->Checked=false;

 }

}

void __fastcall TForm1::NPanelClick(TObject*Sender)

{

if (Panel1->Visible==false)

 {

  Panel1->Visible=true;

  NPanel->Checked=true;

 }

else {Panel1->Visible=false;

 NPanel->Checked=false;

 }

}

void __fastcall TForm1::NBarClick(TObject*Sender)

{

if (StatusBar->Visible==false)

 {StatusBar->Visible=true;

 NBar->Checked=true;}

 else { StatusBar->Visible=false;

 NBar->Checked=false;

 }

}

еще рефераты
Еще работы по информатике, программированию