2012-04-08 11 views
0

Ich habe diese C++ Builder 2009 App. Es ist nicht verzweifelt - es ist eine Demo, aber es bringt mich zu Scotch. Ich bin jetzt so voll Single Malt, dass ich um Hilfe bitten muss.Stapelüberlauf (!) Beim Versuch, einen benutzerdefinierten Meldungshandler einzurichten

Diese App hat eine Hauptform und einige andere Sachen, die alle funktionieren. Ich habe keinen Grund zu denken, dass irgendetwas daran falsch ist. Ich fügte ein anderes Formular hinzu, 'TfoPNGload', und fügte ein paar Komponenten hinzu - nichts Ungewöhnliches. Ich habe es aus der Liste der automatischen Erstellung entfernt, damit Instanzen bei Bedarf erstellt werden können.

Als Test plonked ich einen Speedbutton auf dem Hauptformular und im Klick, eine Instanz der 'TfoPNGload' Form und Show() ed es erstellt:

void __fastcall TForm1::SpeedButton1Click(TObject *Sender) 
{ 
    myPNGform=new TfoPNGload(NULL); 
    myPNGform->Show(); 
} 

Dieser feinen auch gearbeitet - Ich klicke auf den Knopf, ein Formular tauchte auf.

Alles ist normal.

Ich habe einen Nachrichten-Handler hinzugefügt und die Dinge wurden abnormal, noch bevor ich irgendwelche Nachrichten gesendet habe. Ich habe eine Funktion und das Makro Dingen es einen Message-Handler zu machen:

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; 
}; 

Dann, wenn ich auf der Schaltfläche geklickt, das Formular zu erstellen, ich öffnet die klassische ‚Stack-Überlauf‘ messagebox!

Wenn ich die Makros auf Kommentar:

//  BEGIN_MESSAGE_MAP 
//  MESSAGE_HANDLER(WM_APP, TMessage, WMAPP) 
//  END_MESSAGE_MAP(TfoPNGload) 

..Die Form erstellt wird einfach gut!

Es ist nicht so, als würde ich noch irgendwelche Nachrichten posten - nur die Verarbeitung der Makros scheint den Überlauf bei der Formularerstellung zu erzeugen. Die WMAPP-Funktion ist sowieso leer.

Wer hat so etwas gesehen oder besser noch repariert?

Wenn Push kommt, habe ich eine Umgehungslösung - mit den gleichen Makros in der Hauptform funktioniert, so dass ich stattdessen meine Sachen dort posten und dann in das Formular "TfoPNGload" aufrufen. Es würde wahrscheinlich funktionieren, aber es macht ein Chaos meiner Code-Struktur, die TBH, schwierig genug ist, zu folgen, wie es ist: ((

Rgds, Martin

+0

Können Sie alle Makros verarbeiten? –

+0

@KerrekSB - als ich dies schrieb/posten wusste ich, dass jemand das sagen würde: ((OK, ich werde mir die Makros ansehen und vielleicht posten - ich kann C++ machen, aber ich bin kein Guru Level :( –

+0

Warum machen Sie Ihren Compiler nicht die Arbeit - lassen Sie ihn nur die Vorverarbeitung durchführen und filtern Sie den relevanten Teil heraus Schauen Sie zumindest ob der Konstruktor sich nicht rekursiv selbst aufruft –

Antwort

5

ich diese Linie vermuten:

END_MESSAGE_MAP(TfoPNGload) 

Sollte die Basisklasse angeben:

END_MESSAGE_MAP(TForm) 

die Nachricht Karte Makros erzeugen eine virtuelle Funktion Dispatch oder so etwas wie th genannt bei dem enthält eine große switch für die Bearbeitung der Mapping-Fälle. Das Makro END_MESSAGE_MAP(TfoPNGLoad) erzeugt den default: Fall des Schalters, der TfoPNGLoad::Dispatch aufrufen wird. Aber, raten Sie mal, das ist genau die Funktion, die von den Makros definiert wird: so läuft die direkte Rekursion ab.

Sie möchten den Superklassennamen TForm an das Ende-Makro übergeben, sodass es eine default: Fall-Routing an die Basisklasse Dispatch generiert.

Verwandte Themen