Додавання функціональних можливостей в Майстер

У нас створена основа, так сказати скелет Майстри, що, звичайно, приємно, але аж ніяк не виконує покладених на Майстер функцій Нам треба додати в Майстер всі ті можливості, які ми реалізували в тільки що написаному додатку Як це зробити

Насправді додавання нових можливостей не складе великої праці Зрештою, у нас вже є форма для отримання всіх необхідних даних і є код, що дозволяє згенерувати новий клас компонента, що базується на цих даних Тобто вся робота вже зроблена, і все, що нам треба, – це додати форму і всі інші модулі з попереднього додатки в DLL, відобразити цю форму при виклику Майстра, і все інше буде зроблено без нашої участі Власне, для цього-то ми і створювали форму спочатку в простому додатку Так набагато простіше тестувати функції, виправляти помилки, коротше кажучи, доводити форму і інші функції до задовольняє нас стану, а потім вже обєднувати їх в повноцінний Майстер CBuilder У розробці будь-яких додатків керуйтеся принципом – На кожному етапі вирішувати тільки одну задачу – і ваше життя стане веселіше

Скопіюйте файли форми і модулів з проекту додатки (крім файлу проекту, MAK-файлу і проміжних файлів компілятора) в нову директорію Після цього виконайте наведені нижче перетворення коду Майстра Природно, найбільше змін доведеться внести в метод RunExpert, Оскільки він відповідає за всю роботу Майстра Ось як виглядає код для цього методу:

__stdcall RunExpert( TIMenuItemIntf* )

{

TPagesDlg *frm try

{

frm = new TPagesDlg(Application) Form1 = new TForm1(frm)

Form2 = new TForm2(frm) if( frm-&gtShowModal() )

{

TCreateModuleFlags mf

mf &lt&lt cmAddToProject &lt&lt cmNewUnit &lt&lt cmMarkModified ToolServices-&gtCreateCppModule(  frm-&gt

SourceFile-&gtText,&quot&quot,&quot&quot,&quot&quot, 0L, 0L, 0L, mf )

}

frm-&gtFree()

}

catch(..)

{

HandleException()

}

}

У цьому коді є кілька речей, на які варто звернути увагу По-перше, це використання блоку try .. catch по відношенню до всього коду методу для того, щоб убезпечити користувача систему – не дати можливу помилку в Майстрі просочитися на рівень IDE Наступний цікавий момент – створення примірників всіх форм системи безпосередньо у функції RunExpert Оскільки у DLL на відміну від додатків немає обєкта application, Немає, відповідно, і автоматичного створення форм оскільки немає автоматичного створення, вам треба створити форми самостійно до того, як ви будете їх використовувати Якщо форми створити не вдасться, VCL згенерує виняткову ситуацію і робота Майстра буде припинена Якщо форми були успішно створені, ми йдемо далі і модально відображаємо першу з них, тобто на екрані зявляється звичайний сторінковий діалог, що дозволяє користувачеві вводити дані для нового компонента – точно так само, як він це

робив в простому додатку

Після відображення форми слід блок коду, який є викликом методу CreateCppModule обєкта ToolServices Цей виклик вельми важливий – він додає в даний проект новий модуль, точно так само, як і CBuilder у своєму «рідному» Майстрі компонентів Для забезпечення сумісності нам також доведеться це зробити Далі форма видаляється викликом методу Free базової форми

Одним з найбільш важливих обєктів, що використовуються при створенні Майстрів, є обєкт ToolServices, Який містить методи для роботи з самою IDE У табл 174 перераховані методи класу TIToolServices, Примірником якого і є цей обект2

Таблиця 174 Методи класу TIToolServices

CloseProject Закриває поточний проект

OpenProject Відкриває новий проект, визначений у виклику

SaveProject Зберігає поточний проект

CloseFile Закриває редагований файл

OpenFile Відкриває вказаний файл у вікні редактора

SaveFile Зберігає редагований файл

ReloadFile Заново зчитує редагований файл з диска

CreateModule Створює новий модуль (модулі) у поточному проекті

CreateModuleEx Те ж саме, що і CreateModule, але з великою кількістю опцій GetParentHandle Повертає посилання (handle) батька обєкта, що викликає метод GetProjectName Повертає імя поточного проекту

GetUnitCount Повертає кількість модулів (unit) в поточному проекті

GetUnitName Повертає імя зазначеного (за індексом) модуля (unit) в поточному проекті EnumProjectUnits Перебирає всі модулі (unit) у проекті, викликаючи для кожного обробник, визначений користувачем

GetFormCount Повертає кількість форм в поточному проекті

GetFormName Повертає імя зазначеної (за індексом) форми в поточному проекті

IsFileOpen Визначає, завантажений вказаний файл в редактор

GetNewModuleName Повертає імя наступного модуля, використовуючи стандартні для проекту позначення (напр Unit1, Unit2)

GetModuleCount Повертає кількість модулів (module) в поточному проекті GetComponentCount Повертає кількість компонентів, визначених у даній системі GetMainMenu Повертає посилання (handle) на головне меню системи IDECreateCppModule Створює в проекті новий файл CPP і (залежно від параметрів) додає його в проект

RaiseException Дозволяє програмісту порушувати виняткові ситуації додатки в системі

2 У цьому розділі слово «модуль» використовується для позначення двох різних термінів, module і unit Терміном module позначають всі модулі системи, тобто вихідний файли, форми, DLL і т п Термін же unit означає пару з вихідного файлу (наприклад, Unit1cpp) і заголовного (Unit1h) Будьте пильні – Прямуючи перев

Як ви, напевно, зрозуміли з таблиці, методи обєкту ToolServices предостав ляють вам повний контроль над IDE Маючи у своєму розпорядженні подібні методи, ви можете за допомогою своїх Майстрів додати в систему будь-які нові можливості Я думаю, що якщо ви звикли самостійно створювати всілякі розширення для різних систем, то CBuilder вам досить і досить сподобається Дійсно, ця система надає вам для створення Майстрів всі свої можливості і обробляє внутрішні помилки у майстри з тією ж ретельністю, що і свої власні проблеми Тому практично неможливо обрушити систему CBuilder допомогою Майстра (хоча я впевнений, що знайдуться й такі умільці – ламати не будувати)

А тепер давайте повернемося до нашого прикладу

Перше, що ви виявите, синсталліровав і запустивши Майстри безпосередньо з середовища розробки, так це те, що він не працює Дивно Не дуже Адже ми веліли формам використовувати бази даних, що знаходяться в локальній директорії програми Для DLL локальної є поточна директорія CBuilder, а не поточна директорія DLL Змініть назви директорій в таблицях бази даних так, щоб вони відповідали директорії, в яку ви синсталліровалі DLL і базу даних

А тепер важливе зауваження Якщо ви інсталюєте DLL в ту ж директорію, де і створюєте її, то незабаром зясуєте, що не можете вбудувати її в середу Причина цього досить проста CBuilder завантажує DLL в память операційної системи, і операційна система не дозволить вам переписувати цей файл, поки він завантажений в неї, так що у випадку якщо ви все-таки спробуєте так зробити, то отримаєте повідомлення операційної системи про неможливість спільного доступу до файлу (sharing violation) Так що завжди інсталюйте свої DLL з будь директорії системи (наприклад, CBuilder \ bin), крім тієї, в якій ви її тестували Природно, для того щоб протестувати зміни, внесені в DLL, вам доведеться закрити IDE і запустити її заново Тут ми зіткнулися з проблемами швидше операційної системи, ніж CBuilder Раз завантажена, DLL залишається в памяті операційної системи до тих пір, поки не буде закрита IDE Тому ви не можете і скопіювати її поверх старої версії (ви отримаєте те ж саме повідомлення про неможливість спільного доступу)

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*