На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > Model Maker , статья
      Model Maker


      Система Model Maker обладает очень богатой функциональностью. Одно её сокращённое описание может занять сотни страниц. Однако в реальной работе программист обычно использует небольшой процент всех возможностей системы. Поэтому я вас познакомлю с системой Model Maker, реализовав в Delphi небольшой конкретный проект.

      Запуск системы Model Maker


      Система Model Maker может быть запущена разными способами. Это можно сделать через стандартное меню Windows –система Model Maker поставляется как самостоятельное решение. Однако наиболее удобный и эффективный способ эксплуатации Model Maker состоит в запуске этой UML – системы непосредственно из Delphi . Это выполняется командой Model Maker -> Run Model Maker главного меню Delphi .

      Основной экран системы Model Maker


      Основной экран системы Model Maker разбит на несколько основных разделов. Верхняя часть традиционно отводится под главное меню и панель быстрых кнопок.
      В левом верхнем углу располагается Просмотрщик классов (Classes view) . Он позволяет быстро переключатся между описаниями классов и интерфейсов (панель Classes), связанных с ними модулей Delphi (панель Units) и диаграмм (панель Diagrams).
      Обработка всех доступных элементов в данном Просмотрщике может вестись в двух визуальных режимах. Первый представляет структуру элементов в виде дерева (команда локального меню Display as tree(Представить в виде дерева)), а второй в виде списка (команда Display as list(Представить в виде списка)). В большинстве случаев первый вариант предпочтительнее, и в дальнейшем подразумевается, что используется именно режим представления в виде дерева.
      Ниже этого Просмотрщика расположен Просмотрщик интерфейса классов.
      Он даёт возможность определять и редактировать новые свойства, методы и события класса, настраивая средства их просмотра.
      В правой части экрана находится главное окно программы. Оно состоит из ряда панелей:
      Implementation(Реализация) – содержит программную реализацию описываемых классов;
      Unit Code (Код модуля) – позволяет выполнять навигацию по модулю Delphi и просматривать доступные процедуры;
      Diagram Editor (Редактор диаграмм) – визуальный построитель UML – диаграмм;
      Macros (Макросы) – предназначен для описания макросов, выполняющих автоматическое документирование исходных текстов;
      Patterns (Шаблоны) – даёт возможность работать с шаблонами проектирования – набором готовых функциональных решений, широко используемых в ряде методологий разработки программного обеспечения;
      Difference (Различия) – формирует подробные различия между элементами проекта (модулями кода);
      Events (События) – позволяет хранить и редактировать события проекта;

      Модель Model Maker


      Система Model Maker реально не представляет возможность изменения исходного текста программы напрямую. Она хранит модель проекта в едином внутреннем формате. Возможности, предоставляемые визуальной оболочкой Model Maker и различными Просмотрщиками, просто представляют различные аспекты этой модели. Пользователь Model Maker работает с файлом с расширением .mpb (Model Maker Project Bundles), который хранит всю структуру модели системы. При этом файл не содержит исходный код приложения, а только высокоуровневое представление системы, преимущественно в виде UML – диаграмм. Генерация исходного кода на основе этой модели может происходить как автоматически (с заданной пользователем периодичностью), так и вручную, при выполнении команды Model Maker Generate. Такой исходный код в свою очередь не содержит данных о связанных с ним конкретных моделях Model Maker (хотя их можно получить на основе этого кода автоматически), поэтому разработчику нужно самостоятельно следить за сопровождением проектов Delphi и Model Maker .

      Создание нового проекта Model Maker


      Рассмотрим пример создания нового компонента с использованием системы Model Maker . Сравнение двух подходов – с помощью стандартных возможностей Delphi и в визуальном построителе Model Maker – наглядно покажет преимущество нового подхода.
      Работа с системой Model Maker начинается с формирования нового проекта. Для этого надо дать команду на его создание. Таких команд в Model Maker несколько. Команда File->New(Файл -> Новый) создаёт пустой проект, который позволяет добавлять новые классы, основываясь на базовом классе Delphi TObject . Команда File->New Default (Файл - > Новый по умолчанию) дополнительно добавляет к проекту стандартные классы TPersistent, TObject, TStreame и ряд других. Команда File - > New From Template (Файл -> Новый на основе шаблона) создаёт проект, в котором иерархия классов берутся из ранее созданного Model Maker – проекта.
      В нашем случае дадим команду File->New From Default. В Просмотрщике классов будет доступна иерархия классов.
      Добавим в дерево пока неописанный в нашем проекте, но существующий в Delphi класс TCustomLabel. Он является наследником класса TComponent, поэтому выделим в диаграмме класс TComponent добавим ему нового наследника. Это можно сделать командой Add Descendant (Добавление наследника) локального меню или нажатием клавиши INS . Назовём новый класс TCustomLabel.
      Иерархия классов Delphi довольно сложна, и не всегда удаётся быстро и корректно добавить в дерево классов новый класс с учётом правильной цепочки наследования. Если в описании иерархии используются существующие классы Delphi (не важно, стандартные или пользовательские), описание и реализацию которых в рамках данной модели вводить не надо, Model Maker допускает их наличие в проекте в виде реально не описываемых, так называемых «замороженных позиций»(placeholder). Чтобы сделать TCustomLabel замороженным, надо дать команду локального меню Edit Class на редактирование класса или дважды щёлкнуть на его название кнопкой мыши. В диалоговом окне надо включить флажок placeholder:
      Значок слева от названия замороженных классов обводится пунктиром. На данный момент все классы нашего проекта заморожены.
      Теперь таким же способом добавим к TCustomLabel описание нового, создаваемого класса TMyLabel, наследника TCustomLabel. Только, конечно, не надо помечать его как замороженный, так как именно этот класс мы будем далее определять.
      Как мы помним из первоначального примера создания TMyLabel вручную, новому классу надо добавить новые свойства и методы для считывания значений этих свойств и указания новых значений. Работа с интерфейсом класса выполняется в Просмотрщике интерфейса классов.
      Выполним добавление свойства Caption. Для этого надо нажать кнопку Add Property (Добавить свойство) Просмотрщик интерфейса. В диалоговом окне укажем:
      В названии свойства (Name) – Caption
      В названии типа (Data Type Name) – TCaption. В нашей иерархии данного типа нет, поэтому предварительно в группе переключателей типов Data type выберем значение User Defined (определяемое пользователем). При этом станет доступной нижняя часть окна. В поле Data Type Name введём строку TCaption;
      Видимость (Visibility) – publishied.
      Так как данное свойство Caption наследуется от класса TCustomLabel (там оно скрыто), то функции считывания и задания его значения можно не создавать – достаточно указать его видимость в нашем дочернем классе. Поэтому в группах Read Access (способ доступа к значению) и Write Access (способ записи значения) выберем переключатели None (нет). Перед этим обязательно включим флажок Property Override(перезаписать родительское свойство), потому что если наше свойство не является наследуемым, Model Maker потребует явного задания способов считывания и изменения его значений – переключатели None в группах Read Access и Write Access будут недоступны.
      Нажмём кнопку ОК. В Просмотрщике интерфейса появится свойство Caption.
      Теперь добавим новое свойство FontColor. Оно также будет иметь видимость publishied и, конечно, должно описываться с выключенным флажком Property Override, так как является оригинальным. Тип данного свойства – определяемое пользователем значение TColor.
      В группе Read Access вместо выставленного для свойства Caption по умолчанию значения Field (поле, подразумевающее доступ к значению через private – свойство с префиксом F) укажем Method(Метод). Model Maker в соответствии с требованиями Delphi автоматически сгенерирует название такого метода (GetFontColor). Выполним аналогичные действия для группы Write Access (метод записи), описав метод SetFontColor. Параметры последнего метода задаётся в списке Write Parametr (Параметр для метода изменения значения) в левой нижней части окна. По умолчанию здесь задано Value, изменим его на AValue.
      Кроме того, мы хотим получить доступ к данному полю внутри реализации класса также через private – свойство FFontColor. Для того чтобы оно было добавлено к уже сформированным методам считывания и изменения значения, включим флажок State Field (Статическое поле)
      Нажмём кнопку ОК. В Просмотрщике интерфейса появится новое свойство FontColor с зелёным значком, и private – свойство FFontColor с синим значком.
      На данном этапе можно сохранить проект, выполнив команду File->Save.
      Теперь требуется подготовить программную реализацию двух данных методов. Для этого выберем в Просмотрщике интерфейса метод GetFontColor и дадим команду View->Implementation(Просмотр реализация) главного меню или перейдём с помощью мышки на вкладку Implementation главного окна Model Maker
      Подготовка программной реализации некоего метода в Model Maker существенно отличается от приёмов, используемых в редакторе Delphi. Это связано с тем, что Model Maker накладывает очень строгие формальные требования к описанию исходного кода, так как возможные человеческие ошибки могут вызвать внутренние противоречия в описываемой системе и заведут Model Maker в тупик.
      Ввод команд в редактор Model Maker осуществляется построчно. Сначала разработчик выбирает строку (новую или существующую) текущей реализации (небольшое окно с полным текстом на Паскале расположено в нижней левой части главного окна). Затем вводит текст в правой части окна и нажимает кнопку Save code панели быстрых кнопок
      При этом Model Maker исходно создаёт всё описание текущего реализуемого метода и автоматически добавляет начальное и конечное ключевые слова begin/end.
      В нашем случае достаточно ввести одну строку состоящую из одного оператора
      Result := FFontColor
      И нажать на кнопку Save Code.
      Точно таким же способом зададим реализацию метода SetFontColor:
      ExpandedWrap disabled
        FFontColor := AValue

      В заключении добавим компоненту TMyLabel переопределяемый метод Paint(кнопка -Add Method). Его надо поместить как Protected, установить переключатель Override в группе Method binding kind (Метод связывания) и включить флажок Call inherited, чтобы вызвать метод перерисовки компонента – родителя. Этот вызов будет помечен в окне исходного текста в виде красно-белого значка(в отличие от зелёного значка пользовательского кода).
      Следом за этим вызовом добавим оператор задания нового цвета. Для этого нажмём кнопку Add section и введём следующий код:
      ExpandedWrap disabled
        Font.Color:= FFontColor;
      В первоначальном примере обращение к родительскому методу Paint выполнялось после данного оператора. Однако Model Maker позволит вводить новые разделы только после автоматически сгенерированного обращения inherited Paint;Чтобы поменять разделы местами (в нашем случае, чтобы переместить красно-белый раздел вниз), их надо выделить и дать команду Move Section Down локального меню. Наконец добавим классу TMyLabel новое событие, нажав на кнопку Add Event. Назовём его OnFontChange. В Просмотрщике интерфейса можно увидеть, как в дополнение к событию OnFontChange появилась private – переменная FOnFontChange типа TNotifyEvent.
      Теперь дополним реализацию метода SetFontColor до следующего текста:
      ExpandedWrap disabled
        FFontColor:=AValue;
        Reapint;

      ExpandedWrap disabled
        If Assigned(FOnFontChange) then OnFontChange(self);
      На этом всю работу по подготовке нового класса Delphi можно считать, законченной. Осталось сгенерировать завершенный Delphi – модуль и выполнить установку нового компонента.

      Генерация модуля в системе Model Maker

      Для создания нового модуля перейдём на панель Units Просмотрщика классов и нажмём кнопку Add
      В поле дополнительного имени каталога исходных текстов (Source path Alias) оставим значение <No alies> . В поле, где задаётся местоположение исходного файла (Relative Unit file name), укажем подходящие имя файла и каталог. В нижней части окна переместим с помощью кнопок – стрелок в правую часть название класса TMyLabel,подлежащее реализации. В крайней правой колонке VCL Page введём строку Model Maker Test.
      После нажатия кнопки ОК в правом окне Model Maker появится сгенерированный шаблон будущего Delphi – модуля, чтобы перейти к гнерации конечного Delphi кода, надо разблокировать генератор кода Model Maker (щелчком на кнопке Unlock code generation главной панели) и затем нажать кнопку Generate на панели Units Просмотрщика классов.
      Теперь перейдём в Delphi . Для этого достаточно нажать кнопку Locate In Delphi главного меню Model Maker . В Delphi откроется новый проект, и в редакторе появится готовый модуль.
      Добавим данный модуль к стандартному Application – проекту и выполним компиляцию дабы убедится нет ли ошибок, однако в нашем случае произойдёт ошибка. Компилятор укажет на строчку
      TMyLabel = class (TCustomLabel), и сообщит что класс TCustomLabel в программе не объявлен. Действительно, его описание хранится в модуле StdCtrls, который не указан в списке подключаемых модулей, сгенерированных Model Maker .
      Данное изменение можно внести в редакторе Delphi,однако это будет неправильно с методологической точки зрения :) . Поэтому вернёмся в Model Maker и на панели Unit code главного окна добавим в список подключаемых модулей название StdCtrls, выполним команду save code, после чего сохраним проект и повторно выполним кодогенерацию. На этом создание нового класса - компонента закончено. Его установку можно произвести обычным способом. Статья составлена по книги С. Бобровского "Delphi 7"
      Сообщение отредактировано: rikitikitavi -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0430 ]   [ 16 queries used ]   [ Generated: 16.04.24, 04:25 GMT ]