尝试设置用户定义的消息处理程序时堆栈溢出(!)

时间:2012-04-08 00:46:49

标签: c++ c++builder

我有这个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, 马丁

1 个答案:

答案 0 :(得分:5)

我怀疑这一行:

END_MESSAGE_MAP(TfoPNGload)

应指定基类:

END_MESSAGE_MAP(TForm)

消息映射宏生成一个名为Dispatch的虚函数或类似的函数,其中包含用于处理映射案例的大switchEND_MESSAGE_MAP(TfoPNGLoad)宏将生成切换default:的情况,该情况将调用TfoPNGLoad::Dispatch。但是,猜猜是什么,这是由宏定义的函数:因此会发生失控的直接递归。

您希望将超类名称TForm传递给结束宏,以便它生成default:案例路由到基类Dispatch