Проблема при создании собственного компонента в Cbuilder
sunsay
Самара
Исходные данные: CodeGear C++Builder 2007, FastReport 4.4.50
Небольшой код:
В программе:
После fr->DesignReport(false, false); вылетает с Access Violation.
Есть мысль, что это как-то связанно с выделением памяти под AnsiString.
Пробовал сделать этот (GetDescription) метод static'ом - он, естественно не наследуется от базового.
Поломал всю голову.
Может у кого-то уже была такая проблема...
P.S. Началось после того как обновил 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
Комментарии
А какая версия была до этого ?
По идее не должно было работать и в предыдущих версиях.
Данная функция объявлена как виртуальная функция класса, в C++ таких аналогов нет (есть static но она не может быть виртуальной).
Компилятор генерирует из таких функций заголовки с таким объявлением GetDescription(TMetaClass* vmt);, как я понимаю борланд хотели передавать через параметр указатель на класс, но проблема в том, что делфийский компилятор об этом ничего не знает( он передает такие параметры как ссылка на класс, не явно).
В общем, откройте frxClass.hpp и замените все GetDescription(TMetaClass* vmt); на GetDescription(); (в приложении тоже), должно заработать.