Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

2.25.1. Создание mck-проекта

О, сколько нам открытий чудных

Готовит просвещенья дух!

И опыт, сын ошибок трудных,

И гений, парадоксов друг,

И случай, сводный брат Фортуны.

(А.С. Пушкин)

Теперь, когда начальное представление о возможностях форм, апплетов и - в целом - прочих визуальных элементов получено, настало самое время поговорить немного о разработке МСК-проектов. Умение создать MCK-проект, бросить на форму пару MCK-компонент, настроить их и запустить проект позволит читателю при дальнейшем чтении, ощутить прочитанное на опыте. Ибо, как показывает опыт, нет лучше способа обучения, чем... опыт.

Как уже говорилось в начале изложения, Mirror Classes Kit, т.е. набор зеркальных компонентов для библиотеки KOL, появилась не сразу. Идеология библиотеки KOL отрицает саму возможность использования компонентов, т.е. классов, произведенных от TComponent, классов, которые могли бы существовать как на этапе разработки, так и на этапе исполнения приложения (во втором случае загружая свое начальное состояние из ресурсов формы, при ее конструировании). Так устроена среда Delphi, и надо признать, это очень удобный подход, существенно ускоряющий разработку приложений, и не зря Delphi носит гордое наименование RAD - Rapid Develpment Tool, или, в переводе на русский: средство быстрой разработки.

Тем не менее, для KOL удалось построить ничуть не худший механизм для визуального программирования. MCK содержит набор зеркальных компонентов (или просто - зеркал), примерно соответствующий набору разновидностей простых объектов KOL. Точно так же, как и при разработке VCL-проекта, эти зеркала бросаются на форму с линейки компонентов, их свойства настраиваются визуально (мышкой, Инспектором Объектов, вызовом специальных редакторов компонент). И в результате совместной работы этих компонентов на этапе разработки, текст исходных файлов проектов модифицируется таким образом, чтобы при компиляции у нас получился "чистый" KOL-проект, в котором нет классов, компонентов, и других ссылок на VCL, а есть только простые объекты object, и минимум кода при всей необходимой функциональности.

Пожалуй, стоит выделить эту особенность особо, и подчеркнуть еще раз, что компоненты MCK не участвуют в рабочем варианте кода. Их задача состоит только в генерации кода для KOL, который помещается, в основном, в inc-файлы, и при выполнении приложения вызывается для создания формы вместе со всеми дочерними элементами. То есть, форма во время выполнения не создает себя из ресурса формы, как это делается в VCL-приложении, а строится динамически, путем вызова соответствующих функций NewXXXX, присваивания начальных значений свойств и событий в соответствии с настройками MCK-компонентов, выполненных на этапе разработки.

На самом деле, идея MCK не столь тривиальна. Код зеркальных компонентов содержит некоторое количество трюков, предназначенных для «обмана» среды разработки. В итоге среда Delphi IDE считает, что она имеет дело с обычным проектом VCL с классами и формами, загружаемыми из dfm-ресурсов, хотя это далеко не так.

С

оздание MCK-проекта начинается с того же, что и создание проекта VCL, а именно: в меню File среды разработки следует выбрать пункт New Application. В результате чего создается проект Project1, содержащий три файла (пока что они хранятся в памяти): это Project1.dpr - исходный файл проекта, Unit1.pas - исходный файл единственного пока модуля формы, и Unit1.dfm - файл формы. Следующее действие, которое теперь необходимо выполнить - это сохранить проект в какой-либо папке. Для этого мы выбираем в меню File|Save All, и нам последовательно выдаются запросы на сохранение Projec1.dpr и Unit1.pas (файл Unit1.dfm сохраняется при этом автоматически в той же папке, где сохранен и файл Unit1.pas). При сохранении стоит изменить имя модуля Unit1.pas (если только вы не собираетесь так и оставить это имя навсегда: переименование модулей в MCK-проекте может вызывать некоторые трудности, поэтому об именах для модулей лучше всего думать заранее). Не стоит, однако, менять пока имя проекта, пусть останется Project1 (ниже я объясню, почему).

Еще один важный момент: сохраняйте все исходные файлы MCK-проекта (по крайней мере, модули форм и сам файл проекта) в одной директории. Если вы их разместите в разных папках, то MCK, возможно, не сможет их обнаружить и выполнить необходимые модификации.

Теперь, когда проект сохранен, начинаем "конвертировать" его в проект MCK. К этому моменту, пакет MirrorKOLPackageXX для соответствующей версии Delphi уже должен быть установлен. Так как я большую часть времени работаю именно с MCK-компонентами, то после установки этого пакета, я сразу же захожу в меню Component|Configure Palette и перетаскиваю этот набор компонент поближе к началу, чтобы не листать потом все закладки палитры подряд.

Конвертация состоит из четырех очень простых шагов. Но они должны быть выполнены в точности, иначе вопрос №1: «почему не устанавливается KOL/MCK?» – неизбежен. Облегчите себе жизнь, прочитайте инструкцию очень внимательно!.

Во-первых, необходимо найти на линейке компонентов в закладке KOL и бросить на форму компонент TKOLProject.

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

Когда компонент TKOLProject создан в первый раз, или при открытии MCK-проекта, он «оживает» и начинает регулярно проверять (по таймеру, период проверки регулируется свойством autoBuildDelay – в миллисекундах), не было ли от MCK-компонентов запросов на перегенерацию кода по причине изменения свойства в каком-либо MCK-зеркале (и в том, числе, в самом компоненте TKOLProject). Как только такое изменение зафиксировано, по очередному событию от своего таймера отыскиваются все формы проекта, и для тех из них, которые изменились, вызывается перегенерация кода, а так же, при необходимости, генерируется новая версия кода для самого проекта.

Во-вторых, необходимо выделить теперь компонент TKOLProject на форме, переключиться в Инспектор Объектов (клавиша F11), найти и изменить свойство projectDest. Введите в это поле "настоящее" имя проекта, отличное от Project1. Например, test1 - вполне подходящее имя для тестового проекта. (Проект готов к конвертации, осталось сделать маленький шаг).

Установка данного свойства сообщает компоненту TKOLProject имя файла проекта, который необходимо создать при конвертации проекта из VCL в MCK. Путь к файлам проекта и их имена компонент узнает от среды Delphi, и создает файл MCK-проекта.

В-третьих, найдите на линейке, так же в закладке KOL, компонент TKOLForm, и так же бросьте его на форму. Вы ничего не заметили? Зря: смотреть надо внимательно. Если бы вы обратили внимание на исходный код модуля до того, как вы бросили этот компонент на форму, и сравнили его с тем, что получилось после этого, вы бы заметили, что изменений произошло довольно много. Но об этом позже. Осталось сделать еще один шаг.

В коде выполняется ряд изменений, обеспечивающих (с помощью директив условной компиляции) «невидимость» для компилятора кода, который не следует компилировать. В то же время (к счастью для MCK) сама Delphi IDE «не замечает» директив условной компиляции, которые делают невидимыми для компилятора нежелательные для компиляции участки кода. В результате, файл формы, зеркальные компоненты, текст объявления формы остаются "видимыми" для Инспектора Объектов и среды IDE, которая продолжает считать проект обычным проектом VCL. В том числе, продолжают работать даже средства Code Completion, и средства навигации между методами и их декларациями в фиктивном отныне классе формы. По крайней мере, до версии Delphi 2010 – включительно.

Кроме того, добавляется директива {$INCLUDE…} для ссылки на вновь созданный файл <имя_модуля>_1.inc, в котором размещается процедура инициализации формы New<имя_типа_формы> ( Form_Var, Aparent ).

В-четвертых, необходимо сохранить полученный результат ( File | Save all ), и закрыть проект. Почему закрыть? Потому что сейчас в Delphi загруженным является не тот MCK-проект, который мы создали в результате предыдущих четырех шагов, а VCL-проект с именем Project1. Нам теперь требуется открыть наш проект. «test1», кажется, так мы его назвали, правильно? Нет? Ну, вам видней.

В принципе, можно не закрывать проект, а сразу выбрать пункт меню File|Open Project, и выбрать для загрузки файл test1.dpr (ну, или как вы его там назвали). Причем, в этот момент я обычно еще предварительно выделяю в диалоге открытия файл Project1.dpr и нажимаю кнопку <Delete> - больше этот файл не понадобится (как сказал великий Шекспир, "мавр сделал свое дело, мавр может уйти").