1

この 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関数は空です。

このようなものを見た人はいますか?

プッシュが押し寄せた場合、回避策があります。メイン フォームで同じマクロを使用すると機能するため、代わりにそこに投稿してから、「TfoPNGload」フォームを呼び出すことができます。それはおそらくうまくいくでしょうが、それは私のコード構造を混乱させます.TBHは、そのままでは従うのが難しいです:((

Rgds、マーティン

4

1 に答える 1

5

私はこの行を疑う:

END_MESSAGE_MAP(TfoPNGload)

基本クラスを指定する必要があります。

END_MESSAGE_MAP(TForm)

メッセージ マップ マクロは、マッピング ケースを処理するためDispatchの big を含む、またはそのようなものと呼ばれる仮想関数を生成します。マクロは、 を呼び出すスイッチのケースを生成switchします。しかし、それはまさにマクロによって定義されている関数なので、暴走した直接再帰が発生します。END_MESSAGE_MAP(TfoPNGLoad)default:TfoPNGLoad::Dispatch

TFormスーパークラス名を end マクロに渡してdefault:、基本クラスへのケース ルーティングを生成しDispatchます。

于 2012-04-08T01:32:14.227 に答える