Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.30.162] |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Вопрос адресован к тем, кто когда-нибудь создавал эксперты. Тип эксперта - форма. Среда - C++Builder 2010. Пишу эксперт впервые. Эксперт я написал основываясь на информации полученной в интернете. В принципе, везде пишут одно и тоже. Но я никак не могу его установить. Т.е. я скопировал все нужные файлы (*.bpl, *.bpi, *.lib, *.h) в соответствующие папки. В среде установил нужный пакет. Выскочило сообщение об успешной установке. Но ничего не появилось А должен был появиться значок моего эксперта в окошке File->New->Other... на вкладке C++Builder Files. Собственно, вопрос состоит в том, почему это могло произойти. Все найденные мной статьи по написанию экспертов были основаны на старых версиях среды. Может в 2010 появились какие-то нюансы... Всем спасибо за помощь! |
Сообщ.
#2
,
|
|
|
Значит что-то сделали не так, судя по коду (который вы не привели) ошибка в 17 строке.
Да и форум выбран не тот, здесь явно не сишники обитают |
Сообщ.
#3
,
|
|
|
Цитата DimaBr @ ошибка в 17 строке. Ну это и я знаю Цитата DimaBr @ Да и форум выбран не тот, здесь явно не сишники обитают Почему не тот? Разве есть разница? Речь же идёт о RAD Studio 2010, а не о C++Builder конкретно. Ну и код. *.h //--------------------------------------------------------------------------- #ifndef FormExpertH #define FormExpertH #include <vcl.h> #include <ExptIntf.hpp> #include <EditIntf.hpp> //--------------------------------------------------------------------------- namespace nsStackFormExpert { //---------------------------------------------------------------------- const int nUnit_h = 100; //идентификатор шаблона для UnitX.h const int nUnit_cpp = 200;//идентификатор шаблона для UnitX.cpp const int nUnit_dfm = 300;//идентификатор шаблона для UnitX.dfm //строковый идентификатор базового класса const System::UnicodeString AncestorIdent = "StackForm"; //--------------------------------------------------------------------------- class PACKAGE TStackFormExpert: public Exptintf::TIExpert { typedef Exptintf::TIExpert inherited; public: System::UnicodeString __stdcall GetName(void); System::UnicodeString __stdcall GetAuthor(void); System::UnicodeString __stdcall GetComment(void); System::UnicodeString __stdcall GetPage(void); HICON __stdcall GetGlyph(void); TExpertStyle __stdcall GetStyle(void); TExpertState __stdcall GetState(void); System::UnicodeString __stdcall GetIDString(void); System::UnicodeString __stdcall GetMenuText(void); void __stdcall Execute(void); __fastcall TStackFormExpert(void); inline __fastcall virtual ~TStackFormExpert(void) { ; } protected: HICON hIcon; }; //---------------------------------------------------------------------- }; // namespace nsStackFormExpert //---------------------------------------------------------------------- #endif *.cpp //--------------------------------------------------------------------------- #pragma hdrstop #include "FormExpert.h" #include <memory> #include <IStreams.hpp> //--------------------------------------------------------------------------- __fastcall nsStackFormExpert::TStackFormExpert::TStackFormExpert() : Exptintf::TIExpert() { hIcon = LoadIcon(HInstance, "STACKFORMICON"); } //--------------------------------------------------------------------------- System::UnicodeString __stdcall nsStackFormExpert::TStackFormExpert::GetName(void) { return "StackForm"; } //---------------------------------------------------------------------- System::UnicodeString __stdcall nsStackFormExpert::TStackFormExpert::GetAuthor(void) { return "artsb"; } //---------------------------------------------------------------------- System::UnicodeString __stdcall nsStackFormExpert::TStackFormExpert::GetComment(void) { return "Creating new StackForm"; } //---------------------------------------------------------------------- System::UnicodeString __stdcall nsStackFormExpert::TStackFormExpert::GetPage(void) { return "C++Builder Files"; } //---------------------------------------------------------------------- HICON __stdcall nsStackFormExpert::TStackFormExpert::GetGlyph(void) { return hIcon; } //---------------------------------------------------------------------- TExpertStyle __stdcall nsStackFormExpert::TStackFormExpert::GetStyle(void) { return esForm; } //---------------------------------------------------------------------- TExpertState __stdcall nsStackFormExpert::TStackFormExpert::GetState(void) { return (TExpertState() << esEnabled); }; //---------------------------------------------------------------------- System::UnicodeString __stdcall nsStackFormExpert::TStackFormExpert::GetMenuText(void) { return ""; } //---------------------------------------------------------------------- System::UnicodeString __stdcall nsStackFormExpert::TStackFormExpert::GetIDString(void) { return "artsb.StackFormExpert"; } //---------------------------------------------------------------------- void __stdcall nsStackFormExpert::TStackFormExpert::Execute(void) { //ToolServices - указатель на объект TIToolServices, //объект, обеспечивающий интерфейс к IDE //если объекта не существует, продолжать не имеет смысла if(!ToolServices) exit(1); //полное имя файла *.cpp std::auto_ptr<TFileName> FileName(new TFileName); //идентификатор модуля System::UnicodeString UnitIdent; //идентификатор формы System::UnicodeString FormIdent; TIMemoryStream* imsHdr; TIMemoryStream* imsCpp; TIMemoryStream* imsDfm; try { //получаем идентификатор и полное имя модуля if (ToolServices->GetNewModuleName(UnitIdent, *FileName)) { //формируем идентификатор формы FormIdent = AncestorIdent + UnitIdent.SubString(5, 255); //Загружаем шаблон h-файла из ресурса и основе шаблона //формируем его содержимое в объекте TStringStream std::auto_ptr<TStringStream> ssHdr( new TStringStream( FmtLoadStr(nUnit_h,ARRAYOFCONST((UnitIdent,FormIdent, AncestorIdent))))); std::auto_ptr<TMemoryStream> msHdr(new TMemoryStream()); //Перегоняем содержимое из TStringStream в TMemoryStream msHdr->LoadFromStream(ssHdr.get()); //На основе TMemoryStream создаем объект TIMemoryStream //который будет использоваться в качестве параметра //в вызове метода CreateCppModule imsHdr = new TIMemoryStream(msHdr.get(),soReference); try { //тоже самое проделаем для cpp std::auto_ptr<TStringStream> ssCpp( new TStringStream( FmtLoadStr(nUnit_cpp,ARRAYOFCONST((UnitIdent,FormIdent, AncestorIdent))))); std::auto_ptr<TMemoryStream> msCpp(new TMemoryStream()); msCpp->LoadFromStream(ssCpp.get()); imsCpp = new TIMemoryStream(msCpp.get(),soReference); try { // и для dfm std::auto_ptr<TStringStream> ssDfm( new TStringStream( FmtLoadStr(nUnit_dfm,ARRAYOFCONST((FormIdent))))); std::auto_ptr<TMemoryStream> msDfm(new TMemoryStream()); ObjectTextToResource(ssDfm.get(), msDfm.get()); imsDfm = new TIMemoryStream(msDfm.get(),soReference); try { TCreateModuleFlags CreateFlags; // устанавливаем флаги для вновь создаваемого модуля CreateFlags << cmAddToProject << cmShowSource << cmShowForm << cmUnNamed << cmMarkModified; // создаем модуль ToolServices->CreateCppModule(*FileName, "", "", "", (IStream*)(*imsHdr), (IStream*)(*imsCpp), (IStream*)(*imsDfm), CreateFlags); } catch(...) { delete imsDfm; throw; } } catch(...) { delete imsCpp; throw; } } catch(...) { delete imsHdr; throw; } } } catch(...) { ToolServices->RaiseException(ReleaseException()); } } #pragma package(smart_init) |
Сообщ.
#4
,
|
|
|
Код явно не delphi, продолжение тут Borland C++ Builder/Turbo C++ Explorer
|