我有这个C ++ Builder 2009应用程序。这不是绝望 - 这是一个演示,但它驱使我去苏格兰威士忌。我现在充满了单一的麦芽,我不得不寻求帮助。
这个应用程序有一个主要形式和一些其他所有工作的东西。我没有理由认为它有任何问题。我添加了另一个表单'TfoPNGload',并添加了一些组件 - 没什么不寻常的。我把它从自动创建列表中取出,因此可以按需创建实例。
作为测试,我在主窗体上添加了一个SpeedButton,然后在单击中创建了一个'TfoPNGload'窗体的实例和Show()编辑它:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
myPNGform=new TfoPNGload(NULL);
myPNGform->Show();
}
这也很好用 - 我点击按钮,弹出一个表格。
一切都很正常。
我添加了一个消息处理程序,即使在发送任何消息之前,事情也变得异常。我添加了一个函数和宏的东西,使它成为一个消息处理程序:
class TfoPNGload : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
TPanel *Panel1;
TSpeedButton *SpeedButton1;
TTimer *tiSlideShow;
TLabel *Label1;
void __fastcall tiSlideShowTimer(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private:
PNGload *myLoad;
void __fastcall filesLoaded(TObject *Sender);
protected:
public: // User declarations
__fastcall TfoPNGload(TComponent* Owner);
MESSAGE void __fastcall WMAPP(TMessage& msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_APP, TMessage, WMAPP)
END_MESSAGE_MAP(TfoPNGload)
vector<PNGtask*> *PNGresult;
int vecSize;
};
然后,当我点击按钮创建表单时,向上弹出经典的“堆栈溢出”消息框!
如果我注释掉宏:
// BEGIN_MESSAGE_MAP
// MESSAGE_HANDLER(WM_APP, TMessage, WMAPP)
// END_MESSAGE_MAP(TfoPNGload)
..表单创建得很好!
这不像我发布任何消息 - 只是处理宏似乎会在表单创建时产生溢出。无论如何,WMAPP功能都是空的。
任何人都可以看到这样的东西,或者甚至更好地修复它?
如果push推进,我有一个解决方法 - 在主窗体中使用相同的宏可以工作,所以我可以在那里发布我的东西,然后调用'TfoPNGload'表单。它可能会工作,但它使我的代码结构混乱,TBH,很难遵循它:((
RGDS, 马丁
答案 0 :(得分:5)
我怀疑这一行:
END_MESSAGE_MAP(TfoPNGload)
应指定基类:
END_MESSAGE_MAP(TForm)
消息映射宏生成一个名为Dispatch
的虚函数或类似的函数,其中包含用于处理映射案例的大switch
。 END_MESSAGE_MAP(TfoPNGLoad)
宏将生成切换default:
的情况,该情况将调用TfoPNGLoad::Dispatch
。但是,猜猜是什么,这是由宏定义的函数:因此会发生失控的直接递归。
您希望将超类名称TForm
传递给结束宏,以便它生成default:
案例路由到基类Dispatch
。