eigene Fensternachrichten



  • Hallo,

    mit BEGIN_MESSAGE_MAP etc. kann ich in einem Formular definieren, wie es auf bestimmte Nachrichten reagieren soll:

    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER( WM_XML_ITEM_CLICK, TMessage, XmlItemClick );
    END_MESSAGE_MAP(TForm)
    

    Gibt es eine Möglichkeit sowas auch bei einem TPanel-objekt zu haben, oder muß ich hierzu eine abgeleitete Klasse von TPanel definieren?

    Hintergrund: eine eigene Fensterklasse schickt eine selbsdefinierte Nachricht an das Elternhandle. Wenn dies das Handle meines Formobjekts ist, klappt das so wie ich will. Wenn das Childfenster aber in einem Panel liegt, verschwindet meine Nachricht im Nirwana.

    mfg Martin



  • Du könntest, wenn du keine eigene TPanel Klasse ableiten willst, die Nachricht in den Formobjekt empfangen, in dem das Panel liegt, und vor dort aus das mit dem Panel anstellen, was immer du vorhast.

    Übrigens ist dein Formularobjekt ja auch abgeleitet, und zwar von TForm. Schau dir einfach mal an, was hinter den Makros BEGIN_MESSAGE_MAP, MESSAGE_HANDLER und END_MESSAGE_MAP(steckt



  • Burkhi schrieb:

    Du könntest, wenn du keine eigene TPanel Klasse ableiten willst, die Nachricht in den Formobjekt empfangen, in dem das Panel liegt, und vor dort aus das mit dem Panel anstellen, was immer du vorhast.

    Dazu müsste aber das Formobjekt die Nachricht überhaupt erhalten. Dazu müsste die Standardimplementierung von Dispatch() unbekannte Nachrichten an das Elternfenster weiterreichen. Das tut es aber nicht.
    Das Childfenster hat keine Ahnung von meinem Formular. Es hat noch nicht einmal Ahnung von VCL. Es verschickt einfach eine Nachricht an sein Elternfenster, wenn ein Element angeklickt wurde:

    bool XML_EDITOR_CHILD::handleLeftButton( UINT msg, WPARAM modifier, const POINT *position )
    {
    	if( msg == WM_LBUTTONUP && !modifier && theViewerBox )
    	{
    		XML_ELEMENT *theElement = (*theViewerBox).findElement(
    			position->x, position->y, horizOffset, vertOffset
    		);
    		if( theElement )
    			getParent()->postMessage( WM_XML_ITEM_CLICK, 0, (long)theElement );
    	}
    
    	return false;
    }
    

    Der Aufruf in Zeile 9 postMessage ruft die Windowsfunktion PostMessage auf.

    Burkhi schrieb:

    Übrigens ist dein Formularobjekt ja auch abgeleitet, und zwar von TForm. Schau dir einfach mal an, was hinter den Makros BEGIN_MESSAGE_MAP, MESSAGE_HANDLER und END_MESSAGE_MAP(steckt

    Das weiß ich und hinter den Makros steckt einfach die Definition der virtuellen Funktion Dispatch().

    Das Panel wollte ich eigentlich nur, damit ich mit dem Geometriemanagement des Formulars einfach die Größe des Childfensters ändern kann, wenn die Formulargröße sich ändert. Derzeit ist aber neben dem Child nur noch ein weiteres Panel im Formular, so daß es noch relativ einfach zu beherschen ist:

    void __fastcall TXmlViewerForm::FormResize(TObject *)
    {
    	xmlEditor->resize( ClientWidth, ClientHeight-PanelToolBar->Height );
    }
    

    Naja, wenn's vom Formularlayout konmplizierter wird, komm ich wohl nicht darum herum ein eigenes Panel zu machen. Dann mach ich aber lieber eine eigene VCL-Komponente für das Childfenster.

    mfg Martin


Anmelden zum Antworten