Quelle / Source:
tv203s/contrib/tvision/examples/msgcls/(Hauptprogramm:testdyn.cpp, Klassen:tlnmsg.cpp/tlnmsg.h) Wave: 1 — Pflichtbeispiel aus dem Originalordnertv203s/contrib/tvision/examples/Nicht Bestandteil vonTVDEMOS/oderTVFM/.
Dieses Beispiel demonstriert benutzerdefiniertes Nachrichten-Routing durch das
TuiVision-Broadcast-Ereignissystem. Ein MsgClsWindow empfängt Broadcast-Ereignisse
mit einem benutzerdefinierten Befehlscode und akkumuliert die enthaltenen Texte.
This example demonstrates custom message routing through the TuiVision broadcast event system.
A MsgClsWindow receives broadcast events with a custom command code and accumulates
the contained texts.
-
.NET 10 SDK installiert — lade es von dotnet.microsoft.com herunter und installiere es, bevor du weitermachst. / .NET 10 SDK installed — download and install it from dotnet.microsoft.com before proceeding.
-
TuiVision-Repository geklont — führe folgenden Befehl aus, um das Repository lokal verfügbar zu machen:
git clone https://github.com/hindermath/TuiVision.git/ TuiVision repository cloned — run the following command to get a local copy:git clone https://github.com/hindermath/TuiVision.git -
C#-Grundkenntnisse — ein grundlegendes Verständnis von C# ist hilfreich; eine gute Einführung findest du auf Microsoft Learn. / Basic C# knowledge — a foundational understanding of C# is helpful; a good starting point is Microsoft Learn.
-
TuiVision-Ereignissystem — Kenntnisse des Ereignismodells erleichtern das Verständnis erheblich; für eine tiefere Lektüre sieh dir
src/TuiVision.Core/TEvent.csim Repository an. / TuiVision event system — familiarity with the event model is recommended; for deeper reading, refer tosrc/TuiVision.Core/TEvent.csin the repository.
dotnet run --project examples/MsgClsDas Programm öffnet ein Nachrichtenfenster auf dem Desktop. Message -> Post
sendet eine Nachricht über den Command- und Broadcast-Pfad. Der Vorgang kann
wiederholt werden. Die Statuszeile meldet den letzten sichtbaren Zustand;
Help -> Description erklärt die View-Hierarchie.
The program opens a message window on the desktop. Message -> Post sends a
message through the command and broadcast path. The operation can be repeated.
The status line reports the latest visible state; Help -> Description explains
the view hierarchy.
-
Der Befehl
cmPostLoremIpsumerreichtMsgClsApp.HandleEvent(). -
MsgClsApp.PostMessage(text)erzeugt ein Broadcast-Ereignis mitMsgClsEvents.cmPostToMsgWindow. -
Das Ereignis wird über
HandleEvent()an die View-Hierarchie gesendet. -
MsgClsWindow.HandleEvent()fängt den Broadcast ab, ergänztMessagesund macht das Ergebnis sichtbar. -
Die Anwendung aktualisiert die Statuszeile; Wiederholungen bleiben in Empfangsreihenfolge erhalten.
-
The
cmPostLoremIpsumcommand reachesMsgClsApp.HandleEvent(). -
MsgClsApp.PostMessage(text)creates a broadcast event withMsgClsEvents.cmPostToMsgWindow. -
The event is sent through the view hierarchy via
HandleEvent(). -
MsgClsWindow.HandleEvent()intercepts the broadcast, adds toMessages, and makes the result visible. -
The application updates the status line; repeated messages keep receive order.
MsgClsApp.PostMessage("Hallo")
→ TEvent.CreateBroadcast(cmPostToMsgWindow, "Hallo")
→ MsgClsApp.HandleEvent()
→ TGroup.HandleEvent() → alle Kinder / all children
→ MsgClsWindow.HandleEvent() ← fängt ab / intercepts
→ Messages.Add("Hallo")
Der Schlüssel: Broadcast-Ereignisse durchlaufen die gesamte View-Hierarchie. Jede Ansicht, die den Befehlscode kennt, kann reagieren — ohne direkte Objektreferenz.
The key: broadcast events traverse the entire view hierarchy. Any view that knows the command code can respond — without a direct object reference.
MsgClsApp (TApplication)
├── MsgClsWindow (TWindow) ← empfängt Broadcasts / receives broadcasts
│ └── Messages: List<string>
└── PostMessage(text) ← öffentliche API / public API
-
MsgClsEvents.cmPostToMsgWindow = 201— benutzerdefinierter Befehlscode -
Die Headless-Smoke-Seam: Im Headless-Modus postet der Konstruktor sofort eine Testnachricht.
-
MsgClsEvents.cmPostToMsgWindow = 201— custom command code -
The headless smoke seam: In headless mode the constructor immediately posts a test message.
Der funktionale Nachweis für 014-wave1-functional-hardening prüft den
echten Command- und Broadcast-Pfad. Ein Smoke-Test sendet den
cmPostLoremIpsum-Befehl an MsgClsApp.HandleEvent(), danach muss
MsgClsWindow.Messages den Text Lorem Ipsum dolor sit amet. enthalten.
Weitere Tests prüfen die Headless-Initialnachricht und wiederholtes
PostMessage() in Empfangsreihenfolge.
The functional proof for 014-wave1-functional-hardening checks the real
command and broadcast path. A smoke test sends the cmPostLoremIpsum command
to MsgClsApp.HandleEvent(), after which MsgClsWindow.Messages must contain
Lorem Ipsum dolor sit amet. Further tests verify the headless startup message
and repeated PostMessage() calls in receive order.
017-wave1-visual-component-remediation prüft zusätzlich den vollständigen
App-Loop. Der primäre Test stellt den Befehl und Help -> Description in die
Ereignisfolge, prüft die konkrete Nachrichtenliste, den sichtbaren TWindow-Typ,
die Beschreibungsregion und die gerenderte Statuszeile. Direkte Helfer sind für
diesen primären Nachweis nicht erforderlich.
017-wave1-visual-component-remediation also verifies the complete app loop.
The primary test queues the command and Help -> Description, then verifies the
concrete message list, visible TWindow type, description region, and rendered
status line. Direct helpers are not needed for this primary proof.
Posten, Wiederholen, Status, Beschreibung und Beenden sind per Tastatur erreichbar. Reihenfolge und Ergebnis werden als Text dargestellt und hängen nicht nur von Fokusfarbe, Maus oder Fensterposition ab.
Posting, repeating, status, description, and quitting are keyboard reachable. Order and result are presented as text and do not depend only on focus colour, pointer input, or window position.
-
Fügen Sie eine zweite Fensterkategorie hinzu (z. B. Fehlermeldungen in Rot). Add a second window category (e.g., error messages in red).
-
Persistieren Sie die Nachrichten in einer Datei beim Beenden. Persist the messages to a file on exit.
-
Testen Sie, was passiert, wenn das Nachrichtenfenster geschlossen wird und dann eine weitere Nachricht gepostet wird. Test what happens when the message window is closed and another message is then posted.
| Verwaltete Datei / Managed File | Historische Quelle / Historical Source |
|---|---|
examples/MsgCls/MsgClsWindow.cs |
tv203s/contrib/tvision/examples/msgcls/tlnmsg.cpp + tlnmsg.h |
examples/MsgCls/MsgClsApp.cs |
tv203s/contrib/tvision/examples/msgcls/testdyn.cpp |
examples/MsgCls/MsgClsEvents.cs |
Befehlskonstanten aus testdyn.cpp / command constants from testdyn.cpp |