Zugriff auf alle Controls der Anwendung
-
Hallo,
gibt es eine Möglichkeit, wie ich z.B. vom Hauptformular oder von der Application auf alle untergeordneten Controls zugreifen kann?
Gibt es da eine Liste oder eine Möglichkeit des rekursiven Abstiegs?
-
TForm::Components ist dein Freund.
-
Dankeschön!
Habe übrigens Deine Anleitung "Document-View mit Borland C++ Builder" gelesen.
Das Thema ist für mich gerade sehr wichtig, da ich gerade ein CVM versuche zu implementieren.
Problematisch für mich ist aber, dass ich eben keine TForms sondern TFrames als Views habe, welche nicht mehr durch die IDE als Views nutzbar sind, sobald ich diese in eine eigene Ableitungshierarchie überführe.PS: Meine Forumsfragen drehten sich bisher immer um dieses Thema.
-
Naja, statt einer direkten Ableitung kannst du da natürlich auch über eine Hilfsklasse gehen (hab noch nie mit frames gearbeitet...)
Ich könnte mir vorstellen, folgende Konstruktion müsste eigentlich funktionieren:
Du hast nach wie vor eine Dokumenten und eine View klasse. Wobei die Viewklasse keine Vorfahren mehr hat. Statt das du nun aber aus der View-Klasse ableitest, "registrierst" du das Frame bei der View klasse und "klebst" sie sozusagen zusammen.
Wenn nun ein Update läuft, dann macht die View klasse das Selbe wie sonst auch, aber hald auf dem "verklebten" Frame.
Etwas mühsam erklärt, iuch weiss... aber weisst du was ich meine?
-
Danke, das Forum gefällt mir immer besser.

Das müsste gehen, aber dazu muss jedes Frame da es einen anderen Typ hat, quasi gleich aber anders behandelt werden.

Ich versuche das mal per Mehrfachvererbung:
|---------| |---------------------| | TFrame | |TViewimplementierung | |---------| |---------------------| A A |---------|-----------| | |--------------| | TmeinFrame | |--------------|Evetuell schluckt es so die IDE.
Andererseits schliesst sich der Kreis gerade bei einer Implementierung via Qt-Nachrichten mit CLX.
Wenn bedarf besteht, dann kann ich später mal meine Lösung hier darstellen.
-
markus.r schrieb:
Das müsste gehen, aber dazu muss jedes Frame da es einen anderen Typ hat, quasi gleich aber anders behandelt werden.

Das muss es ja auch sonst? Es wäre in diesem Fall ja nur so, das du die Behandlung ausgelagert hast.
Quasi so:
|---------| |---------------------| | TFrame |<----|TViewimplementierung | |---------| |---------------------| | | |--------------| | TDocument | |--------------|Das TView registriert sich beim TDocument
Ein TFrame wird der Instanz von TView zugeordnet
TDocument triggert TView mit UpdateData
TView zeichnet die neuen Daten in den registrierten Frames des einen Typs.Hat zur Folge, das du für jedes Frame noch eine ViewKlasse erstellen musst die das Frame intim kennt. Dafür hast du aber sauberes Doc/View. und den Spagat (Pfeil) geschafft zwischen Framework und Applikationskonzept
-
Daher habe ich eine hybride Lösung nun implementiert, in der jeder View eine eigene Implementierung hat, jedoch das Interface der Views trotzdem einheitlich durch Verwendung von Qt-Messages ist.
|-------------| | Controller | |-------------| |\ | \ sendet Qt-Nachricht an | \ | ---------------\ | | |-------------| |----------| | TFrame1 | | TFrame2 | |-------------| |----------| | behandle() | |behandle()| |-------------| |----------| | | |-----------------| | V |----------| | TFrame | |----------| |----------|
-
Hallo,
wenn man Nachrichten in CLX/Qt an alle Fenster verteilen will, dann ist das wie folgt möglich:
void TForm1::broadcast(TWidgetControl* p_twidgetc, QCustomEventH* p_event) { //Broadcast via rekursivem Abstieg 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); } } }//broadcastDas wird dann z.B. so aufgerufen:
broadcast(static_cast<TWidgetControl*>(this), QCustomEvent_create(MyEvent_ID, this));Vielleicht kann man den ganzen Thread mal in Form einer Anleitung hier der Nachwelt zur Verfügung stellen, da das leider weder von Borland noch sonst wo im Internet dokumentiert ist.
Gruss
Markus
-
markus.r schrieb:
Vielleicht kann man den ganzen Thread mal in Form einer Anleitung hier der Nachwelt zur Verfügung stellen, da das leider weder von Borland noch sonst wo im Internet dokumentiert ist.
Unsere FAQ lebt von freien Schreiberlingen. Was spricht dagegen, das du den Artikel gleich schnell verfasst? (o;
-
Selbstverständlich!
