Основы разработки электронного учебника

Введение



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

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

В первой главе пояснительной записки «Постановка задачи» описываются краткие требования к обучающим программам, производится краткий обзор и анализ существующих программно-педагогических средств, уточняется предмет обучения, его тема, описываются требования к интерфейсу.

Во второй главе «Вычислительная система» рассматривается характеристики аппаратного средства для корректной работы программного средства.

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

В четвертой главе «Программная реализация» описываются формы входных и выходных данных, функциональные решения (функции, их назначение и связь с элементами интерфейса), физическая структура (модули реализации) и взаимосвязь модулей, проведенное тестирование и его результаты.

В пятой главе «Описание применения» указываются назначение программы, область ее применения, системные требования, предъявляемые программе, а также приводится описание системы помощи.

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




1 Постановка задачи



1.1 Требования к обучающим программам



Применение представленного программно-педагогического средства предполагает знание основ алгоритмизации и программирования. Для изучения материалов, представленных в разрабатываемом электронном учебнике, необходимо наличие некоторых знаний о базовых принципах объектно-ориентированного программирования (абстракция, ограничение доступа, иерархия). Также пользователь для работы с данным программно-педагогическим средством должен иметь базовые знания по языку программирования C++. В частности, необходимо иметь некоторое представление о синтаксисе языка С++, его основных операторах и выражениях, базовых типах данных. Все это требуется для понимания представленных в излагаемом материале концепций и примеров.

Разрабатываемый программный продукт предназначен для индивидуального применения, то есть предполагает использование одним пользователем. Групповая работа с представленным электронным учебником может осуществляться путем использования каждым членом группы отдельного экземпляра программы.

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


1.2 Обзор и анализ существующих программно-педагогических средств



В настоящее время существует огромное число программно-педагогических средств по программированию на языке С++. Большинство из них представляют собой html-учебники. Однако во многих из существующих обучающих программ отсутствует возможность просмотра демонстрационных программ. Кроме того, преимущественно такие средства не являются узко специализированными, так как направлены на обучение программированию на языке C++ в целом.



1.3 Интерфейс



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




2 Вычислительная система



2.1 Аппаратные требования



Для нормального функционирования разработанного программного средства необходим персональный компьютер с операционной системой MS Windows NT/2000/XP. При этом минимальными аппаратными требованиями будет такая комплектация, при которой функционирование самой операционной системы будет осуществляться без сбоев и задержек.



2.2 Системные требования



Данное программное средство тестировалось на ОП Windows XP SP3, при следующем оснащении PC:

процессор - CPU Intel Celeron 1700 MHz;

Материнская плата – MB Giga-Byte 8PE800-RS2;

Видеокарта – SVGA GeForce MX5200-8x 128MB и SVGA GeForce 2 Ti -8x 64MB;

ОЗУ – DDR RAM 256MB PC-3200 Hynix/DDR400 + Samsung/DDR400 ;

Винчестер – Samsung 160Gb

Для нормального функционирования можно использовать PC со следующем оснащением:

процессор с частотой 200Mhz и выше;

минимальный объем оперативной памяти 32 Mb;

свободное место на диске 10 Mb;

операционная система Windows 9.x/2000/XP;

клавиатура, мышь.




2.3 Операционная система



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




3 Проектирование задачи



3.1 Описание классов



Так как при разработке программы используется интегрированная среда разработки Borland C++ Builder 6.0, то необходимо привести описание классов, использующихся при работе с компонентами библиотеки VCL — библиотекой визуальных компонент.

Класс TObject является базовым классом для всех прочих порождаемых классов. TObject инкапсулирует общее для всех объектов системы C++Builder функциональное поведение, а именно:

- способность конструктора создавать, а деструктора разрушать объект —экземпляр класса в динамической памяти. Конструктор TObject возвращает указатель на создаваемый объект.

- информацию RTTI об имени, типе производного объекта и его свойствах, которые объявлены как _published.

- поддержку обработки сообщений.

Большинство этих методов предназначены для внутреннего использования средой C++Builder. Поэтому все компоненты должны порождаться непосредственно от класса TComponent или от его потомков. TComponent, будучи в свою очередь потомком TObject, наследует его члены, методы и свойства.

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

Класс TPersistent непосредственно произведен от TObject. Этот абстрактный класс не определяет никаких специальных свойств или событий, однако его производные приобретают особые способности присваивания и поточности.

TPersistent определяет ряд поточных методов, используемых разработчиками компонент, которые могут быть перегружены производными компонентами:

- Assign позволяет присваивать значения свойствам.

- AssignTo позволяет присваивать содержимое одного объекта другому (например, как делает это производный от TPersistent класс TClipboard).

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

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

- перенос на форму из Палитры компонент и манипуляции в окне Редактора форм.

- способность владения и обслуживания других компонент.

-специальные характеристики поточности, с которыми может манипулировать Инспектор объектов на этапе проектирования.

- возможность манипулирования некоторыми невидимыми компонентами на стадии проектирования.

Класс TComponent определяет ряд особых свойств:

- Owner — ссылается на владельца компоненты.

- ComponentCount — число компонент в перечне, которыми владеет данная компонента.

- Componentlndex — индекс компоненты в перечне, начиная с 0.

- Components — Свойство, содержащее перечень компонент, которыми владеет данная компонента.

- ComponentState — текущее состояние компоненты.

- ComponentStyle — стиль, определяющий поведение компоненты.

- Name — имя компоненты.

- Tag — свойство типа int, которое не имеет предопределенного значения и может содержать любые данные или указатели, по усмотрению программиста.

Класс TComponent определяет ряд методов, которые придают объекту право владения другими компонентами и возможность доступа к ним посредством Инспектора объектов:

- Destroying и DestroyComponents устанавливают атрибуты данной компоненты и компонент, которыми она владеет, в состояние, указывающее на то, что они подлежат уничтожению.

- HasParent возвращает булево значение, указывающее на наличие родителя компоненты. Обращаться к этому методу следует до ссылок к родителю данной компоненты.

- InsertComponent добавляет компоненту, передаваемую в качестве параметра, к перечню компонент, которыми владеет данная компонента, а RemoveComponent удаляет компоненту из этого перечня.

- FindComponent возвращает указатель экземпляра компоненты, о которой известно только имя, но неизвестна ссылка на владельца

Класс TControl определяет общие для видимых компонент члены данных, методы и события.

Поскольку элементы TControl обладают способностью отображать себя, некоторые его свойства оперируют с положением, размером и видом объекта (Top, Left, Width, Height и Cursor, Hint), а другие свойства относятся к параметрам области клиента (ClientRect, ClientWidth и ClientHeight).

TControl также вводит свойства, устанавливающие видимость, доступность, цвет и шрифт элементов управления (Visible, Enabled, Color и Font). Свойства Text и Caption обеспечивают установку редактируемых текстов и названий.

Наличие свойства Parent (Родитель), содержащего соответствующую ссылку, обусловлено возможностью класса TControl иметь родителя. Этот родитель может быть производным от TWinControl, поскольку родители обязаны быть оконными элементами управления.

TControl содержит ряд событий, возникающих при манипуляциях мышью над, видимыми элементами управления (OnClick, OnDblClick, OnMouseDown, OnMouseMove, OnMouseUp, OnDragOver, OnDragDrop и OnEndDrag).

Большинство компонент являются производными от TWinControl или TGraphicControl. Эти базовые классы рассматриваются ниже.

Класс TWinControl инкапсулирует оконные элементы управления с дескрипторами. Некоторые производные от TWinControl (компоненты TEdit, TListBox и TComboBox) инкапсулируют стандартные элементы управления Windows — поля редактирования, простые и комбинированные списки и т.д. Поэтому программисту не придется манипулировать с ними посредством стандартных функций Windows API, а пользоваться свойствами и методами, предоставляемыми самими компонентами.

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

- Brush. Управляет цветом и орнаментом канвы, используемой при заливке графических фигур и фона.

- Controls. Содержит список элементов управления, для которых TWinControl является родителем.

- ControlCount. Содержит число элементов управления, для которых TWinControl является родителем.

- Ctl3d. Определяет, требуется ли трехмерное отображение компоненты.

- Handle. Ссылается на оконный дескриптор объекта Windows, который инкапсулирует TWinControl. Это свойство передается тем стандартным функциям Windows API, которые принимают дескриптор как параметр.

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

- Showing. Указывает, видима или невидима компонента.

- TabStop. Указывает, можно ли использовать клавишу табуляции для выбора нужной компоненты.

- TabOrder. Определяет позиции табулятора выбора компонент.

Методы TWinControl главным образом ориентированы на разработчиков компонент и предназначены для управления фокусом, получения статусной информации, диспетчеризации сообщений и позиционирования:

- Broadcast используется для рассылки сообщений всем потомкам TWinControl.

- CanFocus возвращает булево значение, которое определяет, может ли TWinControl принять фокус ввода. Например, компонента не сможет принять фокус, если ее свойство Visible имеет значение false.

- ContainsControl определяет, содержится ли данный элемент управления внутри класса TWinControl. Этот метод не сообщает о том, является ли данный элемент потомком по отношению к TWinControl. Например, внешний класс TWinControl может быть родителем другого элемента, и эта родительская преемственность может продолжаться далее. Однако, все внутренние элементы содержатся во внешнем классе TWinControl.

- ContrblAtPos возвращает ссылку на потомка, если элемент управления заключен в заданных координатах области клиента родителя. Таким образом можно найти относительное положение потомка по отношению к родителю.

- DisableAlign и EnableAlign используются для временного запрещения или разрешения выравнивания компонент внутри TWinControl.

- Focused возвращает значение true, если TWinControl находится в фокусе ввода, т.е. является активным элементом формы, на которой он размещен.

- HandleAllocated возвращает значение true, если элемент управления имеет оконный дескриптор. HandleNeeded создает новый дескриптор, если он еще не был создан. Аналогичное действие выполняется автоматически при прямом обращении к свойству Handle.

- InsertControl добавляет элемент управления к свойству Controls (типа массив), делая TWinControl своим родителем. Лучший способ добавить потомка во время работы программы - просто присвоить ссылку на родителя свойству Parent. RemoveControl удаляет элемент управления из Controls.

- Invalidate и Repaint выполняют перерисовку компоненты.

- SetBounds устанавливает свойства границ компоненты (Left, Top, Width, Height) для TWinControl. Прямое изменение каждого из указанных свойств менее эффективно, поскольку всякий раз сопряжено с перерисовкой

- SetFocus активизирует TWinControl.

TWinControl имеет события, вызываемые взаимодействием с клавиатурой и изменением фокуса (OnKeyDown, OnKey Press, OnKeyUp, OnEnter и OnExif).

Разрабатываемые компоненты редко происходят непосредственно от TWinControl. Лучше производить новые компоненты от общего класса TCustomControl, который предоставляет канву для рисования и обрабатывает сообщение WM_PAINT, или от некоторых более специализированных классов (TButtonControl, TCustomComboBox, TCustomEdit или TCustomListBox).

Производные от абстрактного класса TGraphicControl, в отличие от TWinControl, не имеют оконного дескриптора, не могут принять фокус ввода и не могут являться родителями других элементов управления.

Производные TGraphicControl используются в тех ситуациях, когда необходимо отобразить на форме текст или графику, не обращаясь к функциональным возможностям обычных оконных элементов управления. Имеются следующие достоинства такого подхода. Во-первых, TGraphicControl не пользуется системными ресурсами Windows, так как не требует оконного дескриптора. Во-вторых, метод рисования TGraphicControl исполняются немного быстрее за счет того, что перерисовка компоненты не связана с диспетчеризацией сообщений Windows, а реализуется процессом рисования, заложенным в родителе данного элемента.

Производные TGraphicControl имеют обработчики событий, вызываемые манипуляциями с мышью.

TGraphicControl возлагает на пользователя операции перерисовки. Этот класс содержит свойство Canvas (Канва), которое обеспечивает доступ к отведенной для рисования поверхности, и виртуальный метод Paint, который вызывается в ответ на сообщение WM_PAINT, принимаемое родительским элементом управления.

Кроме того, при работе с формами, содержанием, браузерами, панелями, кнопками, рамками и надписями используются соответственно классы TForm, TTreeView, TCppWebBrowser, TPanel, TBitBtn, TBevel и TLabel.



3.2 Иерархия классов



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





Рисунок 1 — Иерархия классов



3.3 Выбор и обоснование инструментов разработки



В качестве инструментального средства реализации разрабатываемого программного продукта была выбрана интегрированная среда разработки Borland C++ Builder 6.0.

Выбор данного инструментального средства не случаен и основан на том, что данная ИСР имеет ряд достоинств. Основные преимущества Borland C++ Builder по сравнению с другими средствами разработки приложений:

- Быстрота разработки приложения.

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

- Невысокие требования разработанного приложения к ресурсам компьютера.

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

- Возможность модернизации среды разработки за счет встраивания в нее новых компонент, инструментов, экспертов

- Удачная проработка иерархии объектов

- Использование для написания кода одного из самых популярных языков программирования С++.




4 Программная реализация



4.1 Формы входных и выходных данных



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

Выходными данными представленного электронного учебника являются экранные формы с отображением на них лекционных материалов.



4.2 Функциональные решения



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

При запуске программы создается вступительная форма (Form1), которая показывает приглашение к запуску главной формы. При нажатии кнопки "Запуск учебника" (TForm1::SpeedButton1Click) запускается главная форма (Form2). На ней изображено иерархическая структура разделов, и поле для отображения теории.

Для выбора определенного раздела следует сделать двойное нажатие на интересующее название раздела после чего вызывается функция TForm2::TreeView1DblClick. Данная функция в зависимости от того, какая тема выбрана в содержании, автоматически формирует путь к файлу с темой (dat-документу), загружает его в окно браузера тем.

Для перехода к предыдущему или следующему разделу предусмотрены кнопки "Предыдущая", "Следующая" при нажатии которых вызывается событие TForm2::SpeedButton2Click и TForm2::SpeedButton3Click соответственно.

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

Для изменения шрифта следует выбрать Опции -> Шрифт после чего запускается стандартное окно выбора шрифта FontDialog в котором можно выбрать шрифт, стиль, размер, видоизменение и цвет текста отображаемого на главной форме.

Для поиска следует выбрать Опции -> Поиск после чего запускается стандартное окно поиска FindDialog в котором можно задать текст для поиска (поиск осуществляется в открытом в данный момент разделе).

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

Сохранение осуществляется путём выбора нужной темы(отобразить на экране) и нажать в правом нижнем углу кнопку сохранить. Далее выбрать путь сохранения файла.

При закрытии главной формы вызывается событие TForm2::FormClose, которое вызывает функцию Application->Terminate().



4.3 Модули реализации



В разработанный проект входят одиннадцать модулей – файл проекта (головная программа – файл Project1.cpp), заголовочный файл пригласительной формы (описание класса TForm1— файл Unit1.h), файл с реализацией функций-членов класса TForm1 (файл Unit1.cpp),заголовочный файл главной формы (описание класса TForm2— файл Unit2.h), файл с реализацией функций-членов класса TForm2 (файл Unit2.cpp), заголовочный файл формы об авторе (описание класса TForm3— файл Unit3.h), файл с реализацией функций-членов класса TForm3 (файл Unit3.cpp), заголовочный файл формы о программе (описание класса TForm4— файл Unit4.h), файл с реализацией функций-членов класса TForm4 (файл Unit4.cpp).



4.4 Взаимосвязь модулей



Наиболее распространенная связь, которая может существовать между двумя модулями, - компиляционная зависимость. В C++ такая зависимость указывается директивой #include (файл Form2.cpp содержит директиву #include ко всем модулям программы)



4.5 Тестирование



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




5 Описание применения



5.1 Назначение программы



Данная программа представляет собой программно-педагогическое средство и предназначена для изучения материалов по предмету C++.



5.2 Область применения



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



5.3 Система помощи



В программе реализована всплывающая справка.




Заключение



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

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

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

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




Список использованных источников



1. Либерти, Джесс. Освой самостоятельно С++ за 21 день: 3-е изд, пер. с англ.: Уч. пос. — М.: Издательский дом «Вильямс», 2000. — 816 с.: ил. — Парал. тит. англ.

2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. 2-е изд.: Пер. с англ. – М.: Издательство Бином, СПб.: Невский диалект, 1999.

3. Прата Стивен. Язык программирования C++. Лекции и упражнения.Учебник.: Пер. с англ. – М.: Издательство Диасофт, 2004.




Приложение А Текст программы



//файл с головной программой Project1.cpp

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



#include <vcl.h>

#pragma hdrstop

USEFORM("Unit1.cpp", Form1);

USEFORM("Unit2.cpp", Form2);

USEFORM("Unit3.cpp", Form3);

USEFORM("Unit4.cpp", Form4);

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

#include "Unit1.h"

HRGN Rgn;

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

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

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

Application->CreateForm(__classid(TForm3), &Form3);

Application->CreateForm(__classid(TForm4), &Form4);

{

Rgn=CreateEllipticRgn(0,0,Form1->Width,Form1->Height);

SetWindowRgn(Form1->Handle,Rgn,True);

}

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

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

return 0;

}

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







// Заголовочный файл Unit1.H с объявлением класса формы Form1

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

#ifndef Unit1H

#define Unit1H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Menus.hpp>

#include <Buttons.hpp>

#include <ExtCtrls.hpp>

#include <ImgList.hpp>

#include <jpeg.hpp>

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

class TForm1 : public TForm

{

__published:// IDE-managed Components

TSpeedButton *SpeedButton1;

TSpeedButton *SpeedButton2;

TImage *logo;

void __fastcall SpeedButton1Click(TObject *Sender);

void __fastcall SpeedButton2Click(TObject *Sender);

void __fastcall SpeedButton1MouseMove(TObject *Sender,

TShiftState Shift, int X, int Y);

void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,

int X, int Y);

void __fastcall SpeedButton2MouseMove(TObject *Sender,

TShiftState Shift, int X, int Y);

private:// User declarations

public:// User declarations

__fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif



// Заголовочный файл Unit2.H с объявлением класса главной формы Form2

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

#ifndef Unit2H

#define Unit2H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Buttons.hpp>

#include <Menus.hpp>

#include <ComCtrls.hpp>

#include <Dialogs.hpp>

#include <ImgList.hpp>

#include <ExtCtrls.hpp>

#include <ToolWin.hpp>

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

class TForm2 : public TForm

{

__published:// IDE-managed Components

TMainMenu *MainMenu1;

TMenuItem *N1;

TMenuItem *N2;

TMenuItem *N3;

TMenuItem *N4;

TSpeedButton *SpeedButton1;

TTreeView *TreeView1;

TMemo *Memo1;

TMenuItem *N5;

TMenuItem *N6;

TFontDialog *FontDialog1;

TSpeedButton *SpeedButton2;

TSpeedButton *SpeedButton3;

TFindDialog *FindDialog1;

TMenuItem *N7;

TMenuItem *N9;

TSpeedButton *SpeedButton4;

TSaveDialog *SaveDialog1;

void __fastcall SpeedButton1Click(TObject *Sender);

void __fastcall TreeView1DblClick(TObject *Sender);

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

void __fastcall N6Click(TObject *Sender);

void __fastcall SpeedButton3Click(TObject *Sender);

void __fastcall SpeedButton2Click(TObject *Sender);

void __fastcall TreeView1KeyDown(TObject *Sender, WORD &Key,

TShiftState Shift);

void __fastcall Memo1KeyDown(TObject *Sender, WORD &Key,

TShiftState Shift);

void __fastcall N4Click(TObject *Sender);

void __fastcall N3Click(TObject *Sender);

void __fastcall N7Click(TObject *Sender);

void __fastcall FindDialog1Find(TObject *Sender);

void __fastcall N9Click(TObject *Sender);

void __fastcall SpeedButton4Click(TObject *Sender);

private:// User declarations

public:// User declarations

__fastcall TForm2(TComponent* Owner);

};

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

extern PACKAGE TForm2 *Form2;

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

#endif



// Заголовочный файл Unit3.H с объявлением класса формы Form3

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



#ifndef Unit3H

#define Unit3H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

#include <ImgList.hpp>

#include <Buttons.hpp>

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

class TForm3 : public TForm

{

__published:// IDE-managed Components

TSpeedButton *SpeedButton1;

TLabel *Label1;

TLabel *Label2;

TLabel *Label3;

TLabel *Label4;

void __fastcall SpeedButton1Click(TObject *Sender);

private:// User declarations

public:// User declarations

__fastcall TForm3(TComponent* Owner);

};

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

extern PACKAGE TForm3 *Form3;

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

#endif



// Заголовочный файл Unit4.H с объявлением класса формы Form4

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

#ifndef Unit4H

#define Unit4H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

#include <ImgList.hpp>

#include <Buttons.hpp>

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

class TForm4 : public TForm

{

__published:// IDE-managed Components

TSpeedButton *SpeedButton1;

TLabel *Label1;

TLabel *Label2;

TLabel *Label3;

TLabel *Label4;

TLabel *Label5;

void __fastcall SpeedButton1Click(TObject *Sender);

private:// User declarations

public:// User declarations

__fastcall TForm4(TComponent* Owner);

};

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

extern PACKAGE TForm4 *Form4;

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

#endif



// Файл Unit1.cpp для формы Form1

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

#include <vcl.h>

#pragma hdrstop



#include "Unit1.h"

#include "Unit2.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int c,c1;

bool fl,fl2;



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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

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



void __fastcall TForm1::SpeedButton1Click(TObject *Sender)

{

Form2->Visible=true;

Form1->Visible=false;

}

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



void __fastcall TForm1::SpeedButton2Click(TObject *Sender)

{

Application->Terminate();

}

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





void __fastcall TForm1::SpeedButton1MouseMove(TObject *Sender,

TShiftState Shift, int X, int Y)

{

fl=true;

}

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



void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,

int X, int Y)

{

fl=false;

}

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



void __fastcall TForm1::SpeedButton2MouseMove(TObject *Sender,

TShiftState Shift, int X, int Y)

{

Form1->Repaint();

}

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



// Файл Unit2.cpp для главной формы Form2

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



#include <vcl.h>

#pragma hdrstop

#include "Unit2.h"

#include "Unit1.h"

#include "Unit3.h"

#include "Unit4.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

int i=0;

bool fg1,fg2;

int v1,v2,c2;

int SelPos;

AnsiString a;

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

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

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





void __fastcall TForm2::SpeedButton1Click(TObject *Sender)

{

Application->Terminate();





}

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





void __fastcall TForm2::TreeView1DblClick(TObject *Sender)

{

if (Form2->TreeView1->Selected->AbsoluteIndex==1)

{Form2->Memo1->Lines->LoadFromFile("pages/1.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==2)

{Form2->Memo1->Lines->LoadFromFile("pages/2.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==3)

{Form2->Memo1->Lines->LoadFromFile("pages/3.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==4)

{Form2->Memo1->Lines->LoadFromFile("pages/4.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==5)

{Form2->Memo1->Lines->LoadFromFile("pages/5.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==6)

{Form2->Memo1->Lines->LoadFromFile("pages/6.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==7)

{Form2->Memo1->Lines->LoadFromFile("pages/7.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==8)

{Form2->Memo1->Lines->LoadFromFile("pages/8.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==9)

{Form2->Memo1->Lines->LoadFromFile("pages/9.dat");

a=Form2->Memo1->Lines->Text;

};

if (Form2->TreeView1->Selected->AbsoluteIndex==10)

{Form2->Memo1->Lines->LoadFromFile("pages/10.dat");

a=Form2->Memo1->Lines->Text;

};

…………………………………………………………

}

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



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

{

Application->Terminate();

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

void __fastcall TForm2::N6Click(TObject *Sender)

{ if (FontDialog1->Execute())

{Form2->Memo1->Font=Form2->FontDialog1->Font;

Form2->TreeView1->Font=Form2->FontDialog1->Font;

}

}

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



void __fastcall TForm2::SpeedButton3Click(TObject *Sender)

{

int z=Form2->TreeView1->Items->Owner->Selected->SelectedIndex;

if (z<Form2->TreeView1->Items->Count-1){

Form2->TreeView1->Items->Item[z+1]->Selected=true;

Form2->TreeView1->OnDblClick(Sender); }

}

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



void __fastcall TForm2::SpeedButton2Click(TObject *Sender)

{

int z=Form2->TreeView1->Items->Owner->Selected->SelectedIndex;

if (z>0){

Form2->TreeView1->Items->Item[z-1]->Selected=true;

Form2->TreeView1->OnDblClick(Sender);}

}

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



void __fastcall TForm2::TreeView1KeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

{

if (Key==VK_RETURN){Form2->SpeedButton3->OnClick(Sender);}

}

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



void __fastcall TForm2::Memo1KeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

{

if (Key==VK_RETURN){Form2->SpeedButton3->OnClick(Sender);}

}

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





void __fastcall TForm2::N4Click(TObject *Sender)

{

Form3->Visible=true;

}

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





void __fastcall TForm2::N3Click(TObject *Sender)

{

Form4->Visible=true;

}

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

void __fastcall TForm2::N7Click(TObject *Sender)

{



Form2->FindDialog1->Execute();

}

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



void __fastcall TForm2::FindDialog1Find(TObject *Sender)

{AnsiString d;

for (i=0;i<Form2->FindDialog1->FindTextA.Length();i++)

{d=d+i;}

if (Form2->FindDialog1->Options.Contains(frFindNext)) {

SelPos=a.Pos(Form2->FindDialog1->FindTextA);

if (SelPos>0){

Memo1->SelStart=SelPos-1;

Memo1->SelLength=Form2->FindDialog1->FindTextA.Length();

a.Delete(SelPos,Form2->FindDialog1->FindTextA.Length());

a.Insert(d,SelPos);

}

else {

ShowMessage("Текст '"+Form2->FindDialog1->FindTextA+"' не найден");

a=Form2->Memo1->Lines->Text;}

Form2->SetFocus();

Form2->Memo1->SetFocus();}

}

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

void __fastcall TForm2::N9Click(TObject *Sender)

{

if (Form2->N9->Checked) {

Form2->N9->Checked=false;

Form2->SpeedButton1->ShowHint=false;

Form2->SpeedButton2->ShowHint=false;

Form2->SpeedButton3->ShowHint=false;

Form2->TreeView1->ShowHint=false;

}

else {Form2->N9->Checked=true;

Form2->SpeedButton1->ShowHint=true;

Form2->SpeedButton2->ShowHint=true;

Form2->SpeedButton3->ShowHint=true;

Form2->TreeView1->ShowHint=true;

}

}

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



void __fastcall TForm2::SpeedButton4Click(TObject *Sender)

{

if (SaveDialog1->Execute()) {

Memo1->Lines->SaveToFile(SaveDialog1->FileName);

}

ChDir(ExtractFilePath(Application->ExeName));

}

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



// Файл Unit3.cpp для формы Form3

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

#include <vcl.h>

#pragma hdrstop



#include "Unit3.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm3 *Form3;

int c3;

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

__fastcall TForm3::TForm3(TComponent* Owner)

: TForm(Owner)

{

}

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



void __fastcall TForm3::SpeedButton1Click(TObject *Sender)

{

Form3->Close();

}

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



Файл Unit4.cpp для формы Form4

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

#include <vcl.h>

#pragma hdrstop



#include "Unit4.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm4 *Form4;

int c4;

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

__fastcall TForm4::TForm4(TComponent* Owner)

: TForm(Owner)

{

}

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





void __fastcall TForm4::SpeedButton1Click(TObject *Sender)

{

Form4->Close();

}

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




Приложение Б

Диаграмма вариантов использования







2