M
ohne nun verwirren zu wollen:
Ich habe ein aehnliches Problem bei einer Controller-View-Model-Implementierung gehabt, dass ich bei den unterschiedlichen Views keine zugreifbaren Methoden anbauen konnte.
Ich habe mir mit Fensternachrichten geholfen, welche jeder View empfaengt und dann in die passende Behandlungsroutine verzweigt.
Die Loesung ist fuer CLX, aber leicht auf VCL uebertragbar (, da im Gegensatz zu dem CLX-Message-System die VCL-Version vollstaendig und vor allem richtig dokumentiert ist).
//Die Qt-Message
static const QEventType Event_aenderung_ID =(int) QEventType_ClxUser + 50;
//diese Nachricht in einem View empfangen
bool __fastcall TFrameXXX::EventFilter(Qt::QObjectH* Sender, Qt::QEventH* Event)
{
//Methoden der Basisklasse nutzen
bool retval = TFrame::EventFilter(Sender, Event);
//eigener Behandlungscode
switch (QEvent_type(Event))
{
//verzweigen zu meiner Behandlungsroutine
case ControllerViMo::Event_aenderung_ID /*2050*/: this->event_aenderung();
}//switch
//Basisklassenmethodenergebnisse zurueckgeben
return retval;
}//EventFilter
void TFrameXXX::event_aenderung(void)
{
//tu was
}
Die Nachrichten werden über folgenden zentralen Broadcastmechanismus an jeden View bzw. alle Fensterelemente verteilt (der im Controller eingebaut ist):
void ControllerViMo::broadcast(TWidgetControl* p_twidgetc, QCustomEventH* p_event)
{//Broadcast via rekursivem Abstieg
if (this->p_hauptfenster != NULL)
{
for (int i= 0; i < p_twidgetc->ComponentCount; ++i)
{//ueber alle direkten Komponenten
if (TWidgetControl* twc= dynamic_cast<TWidgetControl*>(p_twidgetc->Components[i]))
{
QApplication_sendEvent(twc->Handle, p_event);
//Absteigen
broadcast(twc, p_event);
}//war es ein TWidgetControl?
}//ueber alle Componenten
}//if p_hauptfesnter valid
}//broadcast
Die Lösung ist zwar etwas kompliziert, aber auf diese Weise umgeht man den static_cast. Man umgeht damit das Problem, dass man den Typ des empfangenden Fensters sicher feststellen muss.
Wenn man aus Versehen an falschen Fensterelementtyp die Nachricht verschickt, dann macht das nichts, denn die reagieren einfach gar nicht darauf.
Die Lösung funktioniert gut, ist sicher und auch performant, was den Mehraufwand rechtfertigt.
Übrigens kann man auch dediziert senden anstatt des Broadcastes, indem man nur QApplication_sendEvent(...,p_event); aufruft.