На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Создание эксперта , потомок TIExpert
    Всем привет!

    Вопрос адресован к тем, кто когда-нибудь создавал эксперты.
    Тип эксперта - форма. Среда - C++Builder 2010. Пишу эксперт впервые.
    Эксперт я написал основываясь на информации полученной в интернете. В принципе, везде пишут одно и тоже. Но я никак не могу его установить. Т.е. я скопировал все нужные файлы (*.bpl, *.bpi, *.lib, *.h) в соответствующие папки. В среде установил нужный пакет. Выскочило сообщение об успешной установке. Но ничего не появилось :( А должен был появиться значок моего эксперта в окошке File->New->Other... на вкладке C++Builder Files.

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

    Всем спасибо за помощь!
      Значит что-то сделали не так, судя по коду (который вы не привели) ошибка в 17 строке.
      Да и форум выбран не тот, здесь явно не сишники обитают
        Цитата DimaBr @
        ошибка в 17 строке.

        Ну это и я знаю :)
        Цитата DimaBr @
        Да и форум выбран не тот, здесь явно не сишники обитают

        Почему не тот? Разве есть разница? Речь же идёт о RAD Studio 2010, а не о C++Builder конкретно.

        Ну и код.
        *.h
        ExpandedWrap disabled
          //---------------------------------------------------------------------------
           
          #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
        ExpandedWrap disabled
          //---------------------------------------------------------------------------
           
           
          #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)
          Код явно не delphi, продолжение тут Borland C++ Builder/Turbo C++ Explorer
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0241 ]   [ 17 queries used ]   [ Generated: 24.04.24, 11:59 GMT ]