Модульная архитектура Печать E-mail
Рейтинг: / 7
ХудшаяЛучшая 

Использование модулей в Delphi  

Модульный движок в Delphi

Скачать исходники программы

Скачать компонент appmodinfo

Скачать дистрибутив программы 

----------------------------------------------------

Данный материал предназначен в первую очередь для программистов, архитекторов имеющих некоторый опыт работы со RAD Delphi.

Приложение написано под Delphi7 , но я думаю что не  составит никакого труда портировать программу для других версий Delphi.

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

 

Базовая идея

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

 

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

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

 

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

главная форма 

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

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

Движок разрабатывался для среды разработки Delphi 7.

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

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

Установка и предварительные настройки

Движок разрабатывался под RAD Delphi 7.

Для работы с модульным движком предварительно требуется выполнить следующее:

Компонент AppllModInfo

  • Устанавливаем компонент AppModInfo скачать здесь, в него вносится расширенная информация о подключаемых модулях, компонент устанавливается в палитру Samples.

  • Загружаем приложение движок (файл PlgLoader.dpr) в среду разработки

  • В среде Delphi устанавливаем следующие настройки project options / packages

По умолчанию эти настройки должны быть сделаны , но необходимо проверить

 

  • Установить галочку Build with runtime packages
  • В строке Runtime Packages указать vcl70 для Delphi7 (для Delphi5 это vcl50 и тд, и тп) 

Настройка основного приложения(движка модулей)

Подключение к БД

Настраиваем подключение программы к БД, если необходимо,

Для подключения к БД в движке используются компоненты ADO, подключение осуществляется через adoсonnection, необходимо настроить строку ConnectionString подключения в компоненте
Adoconnection1.( прописать тип соединения, путь к базе , пользователя и базу если это необходимо)

В этом примере программа работает с СУБД Access , но есть и другие приложения с СУБД Oracle , можно использовать MSSQL Server.

  подключение к БД

Настройка внешнего вида

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

Скрыть / показать отдельные элементы

Вид приложения

  • Горячие кнопки – скрывает / показывает горячие кнопки вверху формы

  • Навигатор модулей - скрывает / показывает навигатор модулей (дерево модулей)

  • Панель модулей - скрывает / показывает панель

Расположение меню

Натройка расположения главного меню

Задает расположение главного меню:
  • Меню в главной форме  - перемещает меню в форму

  • Меню во фрейме модуля - перемещает меню во фрейм модуля

Расположение панели модулей

настройка расположения панели модулей

Задает расположение панели модулей:

  • Панель в главной форме - перемещает панель в форму

  • Панель во фрейме модуля - перемещает панель во фрейм модуля

Картинки (иконки)
  • Настройка отображает картинки в дереве модулей и в главном меню

Настройка отображения картинок

Все эти настройки носят эстетический характер, а не влияют на функционал движка.

Добавляем  картинку логотип

В компонент Image1 вставляем картинку, с логотипом вашей программы.

Для PanelTop устанавливаем цвет, определяющий цвет фона для логотипа.

редактируем логотип

Задаем размер иконок для дерева модулей

Для регулировки размера иконок в дереве модулей используется стандартный ImageList с названием TreeImages, при изменении свойств width и height меняется высота и ширина иконок в дереве модулей.

Размеры иконок могут быть 16x16 , 24x24, 20x20, 32x32 пикселя.

Описание основных процедур в главном приложении (движке модулей)

const

 BplInd = 'PLGBPL' ;

Этот индикатор позволяет отличить НАШИ библиотеки bpl от прочих, например Borland библиотек.

procedure buildtree;

процедура строит дерево подчиненных модулей

 

procedure GetDirectories(Directory,Extention: string);

процедура сканирует папку modules. procedure LoadPackageTree(FileName :TFileName);

считывает некий модуль в дерево.

 procedure TabModulesChange(Sender: TObject; NewTab: Integer;

      var AllowChange: Boolean);

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

 procedure CreateMenuItem( Main :TMainMenu ; ItemName , GroupName : string;                               Data : Pointer ;                               GroupImgIndex , ImgIndex :  integer ;

                               SubItemName : string = ''

                               );

Процедура создает пункт меню для соответствующего модуля.

 

procedure ShowModulesMenu( Menu : TMainMenu; Show : boolean );

Данная процедура позволяет включить или выключить модули в меню.

Создание подгружаемых модулей

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

  • Создаем новую библиотеку пакет bpl.
  • Необходимо Project / Options / Descriptions в поле descriptions ввети текст– “plugins”
  • Основная форма подгружаемого модуля должна иметь название ChildForm1 -   поле name.
  • На каждый модуль необходимо добавить компонент AppModInfo .
  • Работа с модальными окнами в проекте осуществляется следующим образом
var  f: TFormModal  repFile: TFileName;beginf := TFormModal.Create(application);  try    if f.ShowModal = mrOk then    begin     end;  finally    FreeAndNil(f);

  end;

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

Как создать модуль смотрите следующие графы

  • Создаем подгружаемый модуль на основе шаблона
  • Создаем новый подгружаемый модуль
 

Настройка компонента ApplModinfo.

На главную форму ChildForm1 ,обязательно помещается компонент ApplModInfo.

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

Настройки

  • GroopMenuItem - название группы в дереве модулей в которой будет отображается модуль, если не указан то в основной группе

  • GroupTreeImage – картинка группы модулей

  • ImageSize - размер картинки для отображения в главной форме программы (не используется)

  • ItemHint – подсказка для этого модуля

  • MenuItem – наименование пункта меню

  • ModComments – комментарий данному модулю

  • Name – наименование компонента

  • ShowHints – показывать или нет подсказку

  • ShowModal – не используется

  • ShowTree – показыватьли модуль в дереве модулей

  • ShowTray – не используется

  • SubItem – наименование подпункта в главном меню

  • TreeImages – картинка под которой отображается модуль в дереве модулей в главном приложении(движке)

  компонент applmodinfo
Настройка Project / Options /OutputDirectory, DCPOutputDirectory в Directories / Conditionals.
Устанавливаем значение полей OutputDirectory , DCPOutputDirectory путь к папке modules нашего приложения, в моем случае это “C:\temp\moddelphi7\Modules”
Установка Project / Options / Descriptions
Пишем текст в поле descriptions plugins
Настройка Run / Parametrs / HostApplication

В HostApplication прописываем путь к загружаемому файлу движка в моем случае

это “c:\temp\moddelphi7\PlgLoader.exe”

Создаем подгружаемый модуль на основе шаблона

Из папки moddelphi7\templates загружаем файл temlates.bpl , после чего настраиваем компонент ApplModInfo (см Настройка компонента ApplModinfo).

Далее настраиваем OutputDirectory- DCPOutputDirectory в Directories / Conditionals в опциях проекта (Project / Options ) – указываем путь к папке modules нашего приложения.

В Run\Parametrs\HostApplication прописываем путь к загружаемому файлу движка

Добавляем новый функционал, сохраняем проект под нужным вам именем после чего запускаем приложение (Run/Run F9).

Создаем новый подгружаемый модуль

Открываем RAD среду разработки.

  • Создаем новую библиотеку File

  • Добавляем в главную форму File / New / Form

  • Переименовываем созданную форму свойство name в ChildForm1

  • Добавляем и настраивам компонент ApplModInfo.

  • Далее задаем OutputDirectory, DCPOutputDirectory в Directories / Conditionals , в опциях проекта (Project / Options ) – указываем путь к папке modules нашего приложения.

  • В Run\Parametrs\HostApplication прописываем путь к загружаемому файлу движкаhost application

  • Добавляем новый функционал, запускаем приложение (Run/Run F9).

  • Добавляем на форму нужный функционал

    • Добавляем следущий код в конец модуля формы ChildForm1:

    • initialization
  •   if not Assigned(GetClass('TChildForm1')) then  begin  RegisterClass(TChildForm1);  end;finalization  if Assigned(GetClass('TChildForm1')) then

       UnRegisterClass(TChildForm1);

  • Добавляем необходимый функционал и запускаем модуль (Run/Run F9)

 

Расширение функционала главного модуля

Вы можете постепенно наращивать функционал главного модуля,  для этого предусмотрен компонент mainmenu , а так же панель кнопок toolbutton2

Например, в главное меню можно добавить пункт для выбора соединения с БД.

Для этого в mainmenu / файл добавляем пункт “Соединение” прописываем необходимый код для смены соединения.

 

Собираем готовый дистрибутив для программы

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

Список файлов:

-----------
rxctl5.bpl
rxdb5.bpl
dclusr50.bpl
dclrxbd5.bpl
dclrx5.bpl
rxbde5.bpl
dclrxdb5.bpl
vclado50.bpl
tee50.bpl
vcl50.bpl
vclbde50.bpl
vcldb50.bpl
vcljpg50.bpl
vclsmp50.bpl
vclx50.bpl
-----------

список файлов дистрибутива