Hallo,
wow
an der Diskussion sehe ich, daß meine Frage vielleicht doch nicht so "aus der Welt" war.
Singleton für ein Statusobjekt macht für mich schon Sinn! Schließlich gibt´s immer nur einen Status für einen Zustand. Das ist Fakt.
Allerdings macht der Aufwand für ein Singleton nur Sinn, wenn zur Laufzeit neue Stati hinzukommen und man mit dem Singleton verhindern will, daß ein Status zweimal existiert. Das kann bei einer späteren Verwendung des Statusobjekts aber durchaus vorkommen. Mit Singleton wäre es also zukunftssicher.
Das ist doch eigentlich überhaupt nicht Ungewöhnliches. Außer dass ich nicht verstehe, wo auf einmal globale Variablen notwendig geworden sind.
Bau dir doch erst einmal ein einfaches Objekt das den Zustand regelt. Werde dir über die Zustände (TEingabeZustand = (warteAufErsteEingabe, eingabeFalsch, datenWerdenVerarbeitet, ...)
) klar und setze die Zustandsübergänge um (.eingabeWarRichtig()
, eingabeWarFalsch()
, ...).
Wenn das alles stimmt fehlt doch nur noch, dass deine Oberfläche (TForm/TFrame) die Änderung des Zustands mitbekommt und entsprechend darauf reagiert. Heißt: Dein Formular muss dein eben gebasteltes Zustands-Objekt kennen, und nicht dein Zustands-Objekt deine Formulare.
Wie man auf Änderungen reagiert ist im Endeffekt genauso wie ein OnClick
bei einem TButton
, dein Zustandsobjekt bietet ein Event an, und deine Oberfläche hängt sich an das Event dran. Wie man das konkret umsetzt gibt es viele Möglichkeiten, aber über "Publish / Subscribe" sollte man zu dem Zeitpunkt schonmal etwas gelesen haben.
Ich denke da liegt für mich der Schlüssel dafür den Status übersichtlich in den Griff zu bekommen. Danke an "Der schöne Günther"!
Habe inzwischen erneut recherchiert und folgendes Interessantes gefunden (komisch, warum erst jetzt?):
https://sourcemaking.com/design_patterns/state
https://sourcemaking.com/design_patterns/state/delphi
Source:
http://sourcemaking.com/files/sm/CsvParser.pas
Ich stecke zwar noch im Tunnel, aber im Tunnel gibt´s nur noch zwei Richtungen: vorwärts oder zurück! Also vorwärts ...
Grüße
Martin