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