Проблема при создании собственного компонента в Cbuilder

sunsaysunsay Самара
отредактировано 15:48 Раздел: FastReport 4.0
Исходные данные: CodeGear C++Builder 2007, FastReport 4.4.50
Небольшой код:
[b]// .h[/b]
class TSample: public TfrxView
{
public:
  virtual void __fastcall Draw(TCanvas* Canvas,
       long double ScaleX,  long double ScaleY,
       long double OffsetX, long double OffsetY);
  virtual AnsiString __fastcall GetDescription(TMetaClass* MetaClass);
};
[b]// .cpp[/b]
void __fastcall TSample::Draw(...)
{
  // рисуем квадрат
}

AnsiString __fastcall TSample::GetDescription(TMetaClass* MetaClass)
{
  return "Sample Of Name";  // <-- вот в этом месте происходит AV при открытии дизайнера отчета
}

В программе:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  TfrxObjectCollection* frxObj = frxObjects();
  frxObj->RegisterObject(__classid(TSample), NULL);
  fr->DesignReport(false, false);
}

После fr->DesignReport(false, false); вылетает с Access Violation.
Есть мысль, что это как-то связанно с выделением памяти под AnsiString.
Пробовал сделать этот (GetDescription) метод static'ом - он, естественно не наследуется от базового.
Поломал всю голову.
Может у кого-то уже была такая проблема...


P.S. Началось после того как обновил FastReport до 4.4.50

Комментарии

  • отредактировано 15:48
    sunsay написал: »
    P.S. Началось после того как обновил FastReport до 4.4.50

    А какая версия была до этого ?
    По идее не должно было работать и в предыдущих версиях.
    Данная функция объявлена как виртуальная функция класса, в C++ таких аналогов нет (есть static но она не может быть виртуальной).
    Компилятор генерирует из таких функций заголовки с таким объявлением GetDescription(TMetaClass* vmt);, как я понимаю борланд хотели передавать через параметр указатель на класс, но проблема в том, что делфийский компилятор об этом ничего не знает( он передает такие параметры как ссылка на класс, не явно).

    В общем, откройте frxClass.hpp и замените все GetDescription(TMetaClass* vmt); на GetDescription(); (в приложении тоже), должно заработать.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.