Laden...

Form über Text erzeugen/darstellen

Letzter Beitrag vor 7 Jahren 8 Posts 1.927 Views
Form über Text erzeugen/darstellen

Hi

Ich bin neu bei myCSharp und programmiere auch noch nicht lange mit C#.

Ich bin auf der Suche nach einer Möglichkeit eine Form über einen Text zu erzeugen und auf dem Bildschrim darzustellen. Leider bin ich noch nicht wirklich fündig geworden.

In der Hoffnung das Ihr mir weiterhelfen könnt schreibe ich diesen Beitrag.

Problemstellung:
Über eine Schnittstelle (z.B. seriell) empfange ich einen Text. Dieser Text kann z.B. so aussehen: "W123". Anhand von diesem Text möchte ich gerne eine Form mit gleichem Namen (W123) auf dem Bildschirm darstellen. Die Form die angezeigt werden soll ist im Projekt vorhanden.

Gibt es eine oder mehr Möglichkeiten dies zu realisieren?

Danke für Eure Hilfe.

Wenn es nicht zuviele Forms werden und der Satz an Kommandos von der SIO (Serial I/O) ist bekannt, wäre dies vielleicht ein praktikabler Weg:

Erstelle alle Forms, die zu den SIO-Kommandos passen. Erzeuge ein Dictionary, in das du die Forms hineinpackst und dazu passend den Kommandostring von der SIO.

Wenn nun ein Kommando von der SIO kommt, kannst du im Dictionary nach diesem String suchen und die dazugehörige Form einfach anzeigen.

Aufräumen bei Programmende nicht vergessen 😉

Hi

Danke für Deinen Lösungsansatz OlafSt.

Wenn es nicht zuviele Forms werden und der Satz an Kommandos von der SIO (Serial I/O) ist bekannt, wäre dies vielleicht ein praktikabler Weg:

Es werden sicher weit über 100 Forms werden (oder an welche Zahl denkst Du bei "zuvielen Forms"?), wobie immer nur zwei aktiv bzw. auf dem Screen sind, die Hauptform, wo die gesamte Kommunikation abläuft, sowie die Form die im Vordergrund mit dem Benutzer interagieren soll. Sobal ein neuer Befehl zur Erzeugung einer neuen Form empfangen wird, soll das Vordergrundfenster geschlossen werden.
Hinzukommt, dass in den Forms dann auch noch Texte zur Laufzeit aktualisiert werden sollen, das würde ich aber prinzipiell vom Hauptform veranlassen.

Erstelle alle Forms, die zu den SIO-Kommandos passen. Erzeuge ein Dictionary, in das du die Forms hineinpackst und dazu passend den Kommandostring von der SIO.

Wenn nun ein Kommando von der SIO kommt, kannst du im Dictionary nach diesem String suchen und die dazugehörige Form einfach anzeigen.

Prinzipiell wollte ich das als erstes so umsetzen, allerdings wird das "Dictionary" dann doch relativ groß und wahrscheinlich auch irgendwann unübersichtlich.

Aufräumen bei Programmende nicht vergessen 😉

Das ist sicherlich bei normalen Windowsanwendungen auf jeden Fall angebracht. Meine Zielplattform ist WEC2013 und die Anwendung ist die einzige nicht Windowsspezifische Anwendung die dort läuft. Windows wird nie vom Benutzer gesehen und es kann auch keine weitere Anwendung vom Benutzer gestartet werden.

Gibt es noch weitere Lösungsansätze?

Nachtrag:
Ich habe deinen Vorschlag mit dem "Dictionary" ausprobiert:
Funktioniert erstmal:

Dictionary<string, Form> dictForms;

dictForms = new Dictionary<string, Form>();
dictForms.Add("W600", new Form600());
dictForms.Add("W601", new Form601());

Allerdings muss jedes Form im Hintergrund geöffnet bleiben sobald ich Form.Close() ausführe, habe ich das Problem das ich die geschlossene Form nicht mehr öffnen kann. Mit Form.Hide() klappts. Allerdings frage ich mich dann schon was passiert wenn über 100 Forms offen sind!? Aber vielleicht habe ich auch falsch gedacht und bin es falsch angegangen 🤔!?

Ein Dictionary mit 100 Einträgen ist ein Klacks. Viel schlimmer ist es hunderte Formularinstanzen aktiv zu halten.

Statt den erzeugten Forms könntest du den Typ der Forms im Dictionary speichern und dann aus dem Typ die Instanz erzeugen.
Also ein

Dictionary<string, Type>

da rein kommt typeof(Form600)
und mit Activator.CreateInstance (Hilfe anschauen!) machst du aus dem Type eine Instanz. Cast in den Typ Form nicht vergessen!
etwa so:

Form neuesform = (Form)Activator.CreateInstance(dictionary[formname]);

Mir kommt es aber etwas eigenartig vor 100 Forms dafür zu haben. Unterscheiden sich diese so sehr voneinander - oder geht es eher darum dann jeweils unterschiedliche Daten dadrin anzuzeigen?

Persönlich würde ich statt den Forms dann eher UserControls dafür erzeugen und die dann dynamisch auf 1 Form packen.

@chilic: Danke Dir. Werde dies morgen versuchen umzusetzen und mich vorher schlau lesen. Rückmeldung folgt. Was Ihr hier alles wisst. Echt super - davon träume ich nur 😉! Ist absolut die richtige Entscheidung gewesen mich hier anzumelden.

@Th69: Es hört sich merkwürdig an, da gebe ich Dir recht. Sinn und Zweck von der Ganzen ist:
Wie schon erwähnt programmiere ich für WEC2013. Dieses läuft auf einem kleinen Insustriecomputer. Meine Anwendung kommuniziert wiederum mit einem Mikrocontrollerboard. Von diesem Board kommen die Befehle um Fenster (Forms) sowie diverse Variablen anzuzeigen. Hinzu kommt das die Forms dafür sehr unterschiedlich aufgebaut sind - teils nur zwei Labels, ein Button und ein oder zwei Bilder, vielleicht auch Animationen aus mehreren Bildern, teils aber wiederum sehr viel Text oder sehr viele verschiedene Button. Alles in allem ist meine Anwendung nur ein Visualisierungstool für das eigentliche Programm welches auf dem Mikrocontrollerboard läuft. Ich hoffe ich konnte Dir das in groben Zügen verdeutlichen.

Letztendlich gehe ich jetzt mal diesen Weg, der hört sich erstmal sinnig und für mich verständlich an. Da ich noch ziemlich am Anfang stehe sehe ich momentan keine anderen Wege, zumindest jetzt noch nicht.

Grundlegend kannst du dafür auch einen IOC-Container verwenden.
Je nach dem welchen du Verwendet, kannst du dann einfach entscheiden ob du immer die selbe Instanz haben willst oder dir eine neue Erzeugen lassen wilst.
(Mit google findest du einiges dazu).

Die Idee mit von Th69 mit den UserControlls ist auch nicht schlecht. Du braucht ja nicht immer eine neue Form. Sondern in der Form sollen andere Inhalte angezeigt werden.

Vieleicht ist auch ASP Core, was für dich. Die Ansichte kannst du dann mit HTML erstelln und die Aktualisierungen z.B. mit SignalR machen. Grundlegend kannst du, dann einen WebServer anbieten und die Daten können bei Bedarf auch auf anderen Geräten anzeigen. z.B. Handy.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

Hey, guten Morgen

@chilic: Danke für den Tip. Mit CreateInstance zusammen mit dem Dictionary funktioniert das wunderbar.

@Th69: Das mit den UserControls ist ebenfalls eine gute Idee. Weiß nur nicht ob ich da in den nächsten zwei Wochen schon was anständiges hinbekomme. Zum einen muss in zwei Wochen was vorzeigbar sein, und zum anderen geht mir das Ganze noch nicht ganz so flüßig von der Hand wie Euch - Anfänger halt 😦! Da gewisse Dinge aber immer gleich sein werden (Hintergrund und 3 Labels oder so) habe ich mir schon mal eine Grundform gemacht von der ich ableiten werde. Ein UserControl war schon nötig: Musste mir einen PictureButton machen, da Windows Style nicht erwünscht war (Sowas meintest Du mir UserControl, oder!?). Mit dem habe ich noch ein kleines Eventproblem (Ich halte den Finger ständig auf den Button - es sollte also nur einmal ein MouseDown Event kommen - dem ist aber nicht so, ständig abwechselnd MouseUp, MouseDown 🤔 - gezeichnet wird der Button dadurch auch neu) , aber das gehört nicht in diesen Beitrag, dafür müsste ich einen neuen Beitrag erstellen wenn ich nicht mehr weiter weis.

@Palin: Auch Dir danke ich für Deine Antwort. Habe letzte Woche versucht mich mal kurz bezüglich IOC-Container zu Informieren. Aufgrund der zeitlichen Problematik habe ich dies aber erstmal verschoben, auch wenn es vielleicht oder wahrscheinlich sogar im Nachhinein einfacher wäre. Die anderen Möglichkeiten habe ich noch gar nicht in betracht gezogen. Allerdings habe ich das im Hinterkopf, sollte es eventuell ein weiteres Projekt geben, bzw. für dieses mehr Zeit zur Verfügung stehen werde ich mich in die Thematik einlesen.

Danke Euch allen nochmal für die Hilfestellung.