Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Diploma Prokopenko / 003 Раздел 3.docx
Скачиваний:
16
Добавлен:
06.06.2015
Размер:
1.46 Mб
Скачать
      1. Использование наследования

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

Для этого потребуется создать класс «Накладная», который будет являться родительским по отношению к соответствующим классам накладных «Расходная» и «Приходная». Этот класс будет иметь общий набор атрибутов.

Для осуществления соответствующих изменений, следует использовать кнопку «Generalization», расположенную на панели инструментов редактора.

Далее устанавливается связь между классами, то есть ассоциация. Для этого будет использоваться «Undirectional association».

Рисунок 3.2 ­ Общий вид спецификации ассоциации между «Расходной накладной» и «Контрагентом»

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

Рисунок 3.3 ­ Детальный вид роли «А» спецификации ассоциации между «Расходной накладной» и «Контрагентом»

По конкретной накладной может быть выписано несколько товаров и конкретный товар может быть выписан по нескольким накладным.

Рисунок 3.4 ­ Детальный вид роли «В» спецификации ассоциации между «Расходной накладной» и «Контрагентом»

      1. Доработка модели

Для завершения создания модели осталось только создать классы-ассоциации. По своей сути они напоминают связующие таблицы в реляционных БД для реализации отношения «*-*». Так при реализации связи между классами «Расходная накладная» и «Товар» без класса-ассоциации нельзя увидеть, сколько товара, и по какой цене вносится в накладную. Для того, что бы закрепить за ассоциацией класс-ассоциацию следует создать новый класс и воспользоваться кнопкой «Association Class».

Рисунок 3.5 ­ Общий вид диаграммы классов для поставленной задачи

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

    1. Процесс создания приложения

В редакторе модели Bold следует импортировать модель, используя «Import via Link». При верном построении модели, она будет успешно импортирована в Bold и дерево объектов в левой части экрана обновится, позволяя вносить изменения в импортированную модель.

Рисунок 3.6 ­ Вид импортированной модели из Rational Rose в Bold UML Modeler, вкладка Classes

Рисунок 1. Вид импортированной модели из Rational Rose в Bold UML Modeler, вкладка Associations

Для расходной и приходной накладных заданы атрибуты «На кого» и «От кого». Значениями этих атрибутов должны быть реквизиты соответствующего контрагента.

Выбрав в дереве объектов атрибут «На кого» класса «Расходная накладная», надо поставить для него отметку «Derived» (Производный) и задать «Derivation OCL».

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

Рисунок 3.7 ­ Просмотр атрибута «На кого» класса «Расходная накладная»

Рисунок 3.8 ­ Окно редактора OCL-выражений для атрибута «На кого» класса «Расходная накладная»

Для реализации GUI создадим вначале макет формы, которая состоит из четырёх панелей (TPanel), разделителей (TSplitter), панели инструментов (ToolBar), пары кнопок (TBitBtn) и списка действий (TActionList).

Рисунок 3.9 ­ Макет главной формы

Также следует создать DataModule, который будет содержать такие невизуальные компоненты:

  • BoldModel ­ компонент, обеспечивающий хранение модели;

  • BoldSystemHandle ­ основной компонент-дескриптор объектного пространства;

  • BoldSystemTypeInfoHandle ­ основной компонент-дескриптор типов модели;

  • BoldPersistenceHandleFileXML;

  • BoldUMLRoseLink ­ предназначен для связи с моделью Rational Rose.

Рисунок 3.10 ­ Вид модуля данных с компонентами Bold

Рисунок 3.11 ­ Настройка свойств компонентов Bold, схема их взаимодействия

В случае использования в качестве уровня данных базы данных, следует лишь изменить наполнение модуля данных, добавив BoldPersistenceHandleDB, BoldDatabaseAdapter, а также сам компонент, представляющий базу данных – Database.

Рисунок 3.12 ­ Диаграмма настройки свойств компонентов модуля данных в случае использования базы данных

Далее с помощью компонента TActionList следует добавить стандартные действия Bold: BoldActivateSystemAction, BoldUpdateDBAction.

Рисунок 3.13 ­ Стандартный набор действий классов с подключёнными действиями от компонентов Bold

Рисунок 3.14 ­ Вид списка действий с добавленными стандартными действия Bold

Выполнение этих действий следует поручить соответственным кнопкам, которые были добавлены на форму. Теперь на Panel1 следует разместить два элемента управления: BoldGrid и BoldNavigator. Эти элементы управления будут использоваться для отображения списка контрагентов и у правления им. Для подключения источника данных используется компонент TBoldListHandle. Этот компонент является своеобразным аналогом компонента TDataSet в традиционных Delphi приложениях. Настройка его достаточно проста: свойству RootHandle присваивается значение BoldSystemHandle (который был добавлен вначале разработки проекта). А значение свойства Expression вводится в редакторе OCL (вызывается двойным щелчком). Сначала нужно выбрать имя класса ­ Kontragent, а затем добавить выражение .AllInstancess (все элементы списка). В нижней части редактора должно появиться сообщение следующего содержания: «Syntax is OK. Current type is: Collection (Kontragent) ».

Оно предоставляет информацию о том, что выражение синтаксически правильно и показывает выходной тип ­ набор элементов класса Kontragent. Теперь следует подключить компонент BoldGrid к источнику данных. Для этого свойство BoldHandle должно ссылаться на BoldListHandle. Теперь в контекстном меню BoldGrid необходимо последовательно выбрать пункты «Clear All Columns» и «Create Default Columns». Появившиеся столбцы BoldGrid будут соответствовать атрибутам класса Kontragent. Далее подключается и BoldNavigator. Запустив приложение и активировав систему нажатием соответствующей кнопки, можно убедиться в том, что теперь появилась возможность управлять списком контрагентов. Перед выходом изменения сохраняются, если вызвать BoldUpdateDBAction. Если этого не сделать, то при закрытии приложения выводится соответствующее уведомление.

Аналогичным образом настраивается и список товаров на Panel4. На Panel3 размещается страничный переключатель с двумя вкладками ­ “расходные” и ”приходные”, но так как интересует не полный список накладных, а накладные для конкретного контрагента, то свойство RootHandle соответствующего BoldListHandle следует настроить на BoldListHandle контрагента. Таким образом, создаётся цепочка дескрипторов. Выражение (Expression) для BoldListHandle накладных задаётся так: «rashodnaya».

Указывается роль для контрагента. На выходе (сообщение в нижней части редактора OCL выражений) будет список расходных накладных, выписанных для контрагента (Current type is: Collection (Rashodnaya_nakladnaya)). Таким же образом настраивается и второй Grid на закладке. В нем будет отображаться детализация расходной, т. е. сколько товара и по какой цене отпускается. К каждому BoldListHandle подключается BoldGrid (редактируя свойство BoldHandle). Для тех Handle’ов, которые отвечают за классы Товар, Расходная Накладная, Приходная Накладная и Контрагент следует подключить ещё и BoldNavigator. Для того чтобы иметь возможность добавлять товар в накладные, необходимо использовать автоформы ­ специальные формы, которые генерируются автоматически и содержат в себе детальную информацию об объекте, также они поддерживают интерфейс drag-and-drop. Автоформы инициализируются по умолчанию при двойном щелчке на некоторых визуальных MDA-компонентах. Для использования автоформ необходимо в разделе Uses модуля формы прописать модуль BoldAFPDefault. Использование автоформ позволяет легко осуществлять навигацию по модели.

Форма «Расходная накладная» отображает не только все атрибуты выбранной расходной накладной, но и все связанные с ней объекты ­ перечень товаров и расшифровку расходной. Если необходимо добавить товар в расходную накладную, то достаточно просто перетащить нужный объект из списка товаров (справа внизу на главной форме приложения) на вкладку «товар», а затем перейти на вкладку «Расшифровка расходной» и указать количество и цену товара.