1

我有这个 C++ Builder 2009 应用程序。这并不绝望——这是一个演示,但它驱使我去苏格兰。我现在全是单一麦芽威士忌,我不得不寻求帮助。

这个应用程序有一个主窗体和其他一些可以正常工作的东西。我没有理由认为它有什么问题。我添加了另一种形式,“TfoPNGload”,并添加了一些组件 - 没有什么不寻常的。我将它从自动创建列表中取出,以便可以按需创建实例。

作为测试,我在主窗体上添加了一个 SpeedButton,并在单击中创建了一个“TfoPNGload”窗体的实例并显示()它:

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 函数无论如何都是空的。

任何人都见过这样的东西,或者更好的是,修复它?

如果迫在眉睫,我有一个解决方法——在主窗体中使用相同的宏确实有效,所以我可以在那里发布我的东西,然后调用“TfoPNGload”表单。它可能会起作用,但它使我的代码结构变得一团糟,TBH,它很难按照原样遵循:((

Rgds,马丁

4

1 回答 1

5

我怀疑这条线:

END_MESSAGE_MAP(TfoPNGload)

应该指定基类:

END_MESSAGE_MAP(TForm)

消息映射宏生成一个名为Dispatch或类似的虚函数,其中包含一个switch用于处理映射情况的大函数。END_MESSAGE_MAP(TfoPNGLoad)宏将生成将default:调用的开关的情况TfoPNGLoad::Dispatch。但是,你猜怎么着,这正是宏定义的函数:所以发生了失控的直接递归。

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

于 2012-04-08T01:32:14.227 回答