Створення Майстри в CBuilder

Майстер, або Експерт, – це розширення системи CBuilder, яке служить користувачеві для полегшення виконання деяких завдань (в основному, зі створення чого-небудь) Для створення компонентів в CBuilder існує Майстер компонентів, який можна викликати за допомогою команди меню Component д New Крім цього, в системі є Майстер форм (Dialog Form Wizard),

Майстер діалогів (Dialog Wizard, доступний тільки у версіях CBuilder Professional і вище) і основний Майстер форм, що знаходяться в Object Repository Добре підготувавши API для використан ня Майстрів, фірма Borland надає вам можливість вносити власні додавання в систему CBuilder

На ринку условнобесплатних програм (shareware) існує кілька Майстрів для CBuilder Причому найцікавіший серед них взагалі безкоштовний (freeware) Написаний Даніелем Карей (Daniel Carey), програмуючим на CBuilder, він надає можливість створювати найпростішу основу для Майстрів в CBuilder За своєю суттю це Майстер створення Майстрів, який полегшує вам створення своїх власних Майстрів Я кілька раз вдавався до його допомоги для створення основ своїх Майстрів, і, природно, ви також можете скористатися ним Ви знайдете цей Майстер у вигляді і вихідного, і довічного (DLL) файлу на компакт- диску в директорії Extras

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

Коли ви створюєте нову DLL в системі CBuilder, ви виконуєте практично всю ту ж саму роботу, що й при створенні Майстра Використовуючи Майстер створення Майстрів ми створимо основу нашого Майстра компонентів + ​​+ і розглянемо її Якщо ви не хочете самостійно інсталювати Майстри або взагалі займатися ним, просто подивіться на код, написаний мною:

#include &ltvcl\sharememhpp&gt

#include &ltvcl\vclh&gt

#include &ltvcl\exptintfhpp&gt

#include &quotClassTabFormh&quot

#include &quotDefPropFormh&quot

#include &quotDefMethodFormh&quot

#pragma hdrstop USERES(&quotCompWizres&quot) USELIB(&quotBcbmmlib&quot)

USEFORM(&quotClassTabFormcpp&quot,  PagesDlg) USEUNIT(&quotUtilitycpp&quot) USEFORM(&quotDefPropFormcpp&quot,  Form1) USEFORM(&quotDefMethodFormcpp&quot,  Form2)

//——————————————————————-

TExpertState tx

//——————————————————————-

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason,void*)

{

return 1

}

Це всього лише точка входу для всіх DLL У DLL має бути ця функція, і вона повинна експортуватися, з тим щоб Windows знала, як завантажувати DLL в память Будь глобальна ініціалізація або виділення / вивільнення памяті здійснюватимуться тут Ця функція буде викликатися неодноразово при роботі з DLL, особливо при завантаженні і вивантаженні DLL

class __declspec(delphiclass) CompWiz class CompWiz : public TIExpert

{

public:

System::AnsiString __stdcall GetName(void)

/ / Коротке описову назву

System::AnsiString __stdcall GetAuthor(void){}

/ / Не використовується в даному Майстрі

System::AnsiString __stdcall GetComment(void){}

/ / Не використовується в даному Майстрі

System::AnsiString __stdcall GetPage(void){}

/ / Не використовується в даному Майстрі

HICON __stdcall GetGlyph(void){}

/ / Не використовується в даному Майстрі

TExpertStyle      stdcall GetStyle(void)

/ / Стиль Майстра, форма, проект і тп TExpertState stdcall GetState (void) {}

/ / Не використовується в даному Майстрі

System::AnsiString __stdcall GetIDString(void)

/ / Унікальний внутрішній ідентифікатор

System::AnsiString __stdcall GetMenuText(void){}

/ / Не використовується в даному Майстрі

void __stdcall Execute(void){}

/ / Не використовується в даному Майстрі

void __fastcall OnClick( TIMenuItemIntf* Sender)

/ / Викликається, коли користувач вибирає команду меню

void __fastcall AddMenuItem(void)

__fastcall CompWiz(void){}

__fastcall virtual ~CompWiz(void){}

}

Це опис класу і є, власне кажучи, наш Майстер Зверніть увагу, що клас успадковує від класу VCL, званого TIExpert Цей клас, що не відбитий в системі контекстної допомоги за системою VCL CBuilder, формує основу для всіх Майстрів в системі CBuilder Зверніть увагу на коментарі під методами класу Вони були згенеровані Майстром для того, щоб вам було простіше орієнтувати ся в тому, які з них використовуються, а які ні в даному типі Майстрів Створюваний нами Майстер належить до розширень системи (тип add-in) CBuilder, тобто він буде присутній в меню Tools (інструменти) і зможе виконувати досить великий обсяг робіт До інших типів Майстрів відносяться Майстри форм (що створюють різні види форм), Майстри проектів (створюють проекти цілком) і стандартні Майстри (виконують звичайні повторювані завдання)

void HandleException(void)

{

}

Цей метод використовується для обробки локальних виняткових ситуацій всередині DLL, так що вони не відбиваються на рівні основного програми (в даному випадку CBuilder)

void __stdcall RunExpert( TIMenuItemIntf* )

{

}

Метод RunExpert – Основна точка входу в Майстер Він відповідає практично за все, що робить Майстер Код, який повинен бути доданий у Майстри, в основному буде нами додаватися саме в цей метод

System::AnsiString __stdcall CompWiz::GetName(void)

{

try

{

return &quotCompWiz"

}

catch(..)

{

HandleException()

}

return &quot"

}

Метод GetName повертає коротке, просте імя Майстра Ми хочемо, щоб наш Майстер створював компоненти, так що його коротке імя буде CompWiz, то саме імя, яке повертається в IDE CBuilder для використання в різного роду повідомленнях

TExpertStyle      stdcall CompWiz::GetStyle(void)

{

try

{

return esAddIn

}

catch(..)

{

HandleException()

}

return esAddIn

}

Метод GetStyle викликається системою CBuilder для того, щоб визначити тип Майстри, з яким вона має справу У нашому випадку це Майстер-розширення системи (add-in), так що ми повертаємо константу esAddIn Крім цього, можливі наступні константи типів: esStandart, esForm, esProject Ці константи визначені в заголовному файлі EXPTINTFHPP, який знаходиться в директорії include \ vcl дерева каталогів CBuilder

System::AnsiString __stdcall  CompWiz::GetIDString(void)

{

try

{

return &quotCWZ100"

}

catch(..)

{

HandleException()

}

return &quot"

}

МетодGetIDString         повертає рядок-унікальний ідентифікатор Майстра У нашому випадку я вибрав значення CWZ100 (Component Wizard 100) Ви можете вибрати яку завгодно рядок, але з тією умовою, щоб вона була унікальна для даного Майстра

__fastcall CompWiz::OnClick( TIMenuItemIntf* Sender)

{

try

{

RunExpert( 0L )

}

catch(..)

{

}

}

Обробник події OnClick викликається системою, коли користувач вибирає команду меню, асоційовану з даним Майстром (командою меню ми займемося в найближчому майбутньому) Ми внесемо наш власний обробник в пункт меню системи в реєструючої функції даного Майстра Коли користувач вибирає команду меню, викликається метод RunExpert, В якому, як я вже згадував, відбувається все важливе для системи

void __fastcall DoneExpert(void)

{

}

Метод DoneExpert викликається, коли Майстер припиняє свою роботу Якщо вам треба щось підчищати при цьому, код слід додавати саме в цей метод

void __fastcall CompWiz::AddMenuItem(void)

{

int index TIMainMenuIntf *mmi

TIMenuItemIntf *miparent TIMenuItemIntf *michild TIMenuFlags mf

try

{

mf &lt&lt mfVisible &lt&lt mfEnabled

mmi = ToolServices-&gtGetMainMenu()

michild = mmi-&gtFindMenuItem( &quotToolsGalleryItem&quot) index = michild-&gtGetIndex()

index++

miparent = michild-&gtGetParent()

miparent-&gtInsertItem( index,  &quotComponentWizard++&quot, &quotCompWiz&quot, &quot&quot, 0, 0, 0, mf, OnClick )

michild-&gtRelease() miparent-&gtRelease() mmi-&gtRelease()

}

catch(..)

{

}

}

Метод AddMenuItem викликається для додавання нового пункту в головне меню IDE CBuilder У даному випадку ми додаємо в меню, що містить пункт ToolsGalleryItem (тобто в меню Tools), пункт із заголовком «Component Wizard + +» Ідентифікатор цього пункту меню був отриманий простим збільшенням останнього в меню ідентифікатора, тобто новий пункт додається в кінець меню Tools Цьому пункту відповідає метод OnClick, Що обробляє звернення до пункту Ось як організовано взаємодію коду Майстра і IDE:

extern &quotC&quot __declspec(dllexport) bool

__stdcall INITEXPERT0016( Toolintf::TIToolServices* ToolServices, TExpertRegisterProc  RegisterProc,

TExpertTerminateProc  &ampTerminate)

{

/ / Переконуємося, що знайшли перший і єдиний

/ / Потрібний пункт

int Result = Exptintf::ToolServices == NULL if (Result) return false  Exptintf::ToolServices = ToolServices

if (ToolServices = NULL)

Application-&gtHandle =  ToolServices-&gtGetParentHandle() else

return false

Terminate = DoneExpert

/ / Реєстрація Майстри CompWiz * ew = new CompWiz (* RegisterProc) (ew)

ew-&gtAddMenuItem()

return true

}

Це наша реєструюча функція, яка викликається IDE CBuilder при першому завантаженні DLL DLL завантажується при реєстрації в CBuilder (ми поговоримо про те, як це відбувається, трохи пізніше), і система починає роботу Після цього кожен Майстер в системі опитується і завантажується реєструючої функцією Спочатку ця функція перевіряє, чи зареєстровані ми вже Якщо ні, то створюється новий екземпляр класу CompWiz і в меню Tools додається новий пункт

У цій главі використовується як термін Мастер (wizard), так і термін Експерт (expert), так само як і в документації фірми Borland Використання того чи іншого з них – це справа звички

Джерело: Теллес М – 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>

*

*