Entwickler-Ecke
WinForms - Formen aus anderen Klassen finden
Lyn - Di 18.12.18 17:54
Titel: Formen aus anderen Klassen finden
Hi,
ich habe gerade massive Probleme auch nur einen Ansatz zu finden.
Für vorsichtige Schubser in die richtige Richtung, wäre ich dankbar.
Wie kann ich zur Laufzeit mit meinem Programm Klassen in derselben Projektmappe durchsuchen?
Etwas genauer:
Ich möchte mit einer Form eine bereits existierende Form aufrufen, deren Name aber erst zur Laufzeit vom User eingegeben wird.
Alle Gedanken, die ich dazu habe, scheinen wirr oder enden irgendwann in einer Sackgasse.
Lg Lyn
Ralf Jansen - Di 18.12.18 18:00
Du wirst in deiner Anwendung Code haben der diese Form(en) erzeugt. Vermutlich merkst du dir nicht was du da erzeugt hast und fragst dich im Anschluss wie du da wieder dran kommst.
Lösung:
Merk dir in irgendeiner für deine Anwendung geeigneten Datenstruktur die erzeugten Formen. Über diese Datenstruktur (möglicherweise eignet sich für dich z.B. ein Dictionary) hast du dann Zugriff auf die Instanzen der Formen und kannst die manipulieren.
Lyn - Mi 19.12.18 10:03
Danke zunächst für die schnelle Antwort.
Zu dem Schluss kam ich auch, was mich jetzt doch beruhigt.
Aber je mehr Masken man hat, kann das ganz schön aufwendig sein.
Meinst du, es gibt einen Weg, dass man irgendwie an einer Stelle auslesen könnte, welche Masken man alle hat?
Oder müsste eine Speicherstruktur welcher Art auch immer, wenn dann manuell eingepflegt werden?
Gibt es zu der Thematik offenkundige Fachthemen, wo ich mich belesen könnte?
(nach welchen groben Schlagwörtern müsste ich da suchen, um das zu vertiefen)
Ralf Jansen - Mi 19.12.18 10:10
Zitat: |
Meinst du, es gibt einen Weg, dass man irgendwie an einer Stelle auslesen könnte, welche Masken man alle hat? |
Redest du jetzt von Klassen oder Instanzen von Klassen?
Lyn - Mi 19.12.18 10:13
Klassen, definitiv
Th69 - Mi 19.12.18 10:26
Woher soll der Anwender denn die Namen der ganzen Forms kennen? Was ist das überhaupt für ein Projekt, daß du so etwas benötigst?
Ralf Jansen - Mi 19.12.18 10:38
An alle Klassen mit bestimmten Eigenschaften in einer Assembly kommst du per Reflection.
Z.B hier um an alle Form Ableitungen zu kommen
C#-Quelltext
1: 2:
| var assembly = Assembly.GetExecutingAssembly(); var myLovelyFormInheritors = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(Form))).ToList(); |
Lyn - Mi 19.12.18 11:02
Th69 hat folgendes geschrieben : |
Woher soll der Anwender denn die Namen der ganzen Forms kennen? Was ist das überhaupt für ein Projekt, daß du so etwas benötigst? |
Wenn es wirklich interessiert oder hilft..
Der grobe Hintergrund ist, ich bin Anfänger als Entwickler und bekomme verschiedene Übungsaufgaben, die mir vermeintlich mehr über unser System beibringen sollen.
Die sind nur bisher durchweg eigentlich zu schwer.
Ich sitze stundenlang an der Konzeption, wie ich überhaupt ansetzen müsste und versuche mir dann zusammen zu googlen, wie eine Lösung sein könnte und hoffe, dass ich wirklich was lerne dabei.
Darüber reden bringt nicht viel, das sind schon die sogenannten leichten Aufgaben.
Speziell diese Aufgabe:
Indem das Programm aus Entwicklersicht geschrieben ist. Ich arbeite zum Üben mit unserem bestehenden System und für dieses soll u.a. eine Funktionalität geschrieben werden, dass man Masken (deren Namen oben immer steht und durch Bugs eh bekannt ist) eingeben soll können und diese dann direkt aufgerufen werden, nur durch Nameneingabe, ohne dass man explizit die ganzen Reiter durchsuchen muss, wo die Maske ist.
Problem ist, dass die Namen auf den Masken (wenn man das Programm startet), auch nicht identisch sind mit den Klassennamen, der Klassen, die dahinter stehen.
Die Anforderungen sind auch sehr grob formuliert, wo ich gefühlt jetzt erstmal tatsächlich Stunden spekuliere, was ein Ansatz für eine technische Umsetzung sein könnte.
Was zusätzlich auch frustrierend ist, wenn man ohne was geschafft zu haben, erstmal Stunden über ein "Konzept / Planung" nachdenken muss..
Ich habe mich anfangs auf einen Bruchteil beschränkt in meiner Anfrage hier, weil ich nicht vermitteln möchte, dass ich wollte, dass Jemand meine Aufgabe löst.
Ich komme nur an manchen Stellen, wie ausgeführt, so gar nicht weiter.
Einarbeitung, Doku, gibt es hier nicht.
Bugs lösen soll ich gerade nicht, weil die wohl alle zu schwer noch wären.
Dann kriege ich gelegentlich eine konkrete Aufgabe, wie jetzt, die schon offiziell leicht sein soll, tatsächlich aber deutlich über meinen Level liegt.
Zu viel Fragen wird aber auch nicht gerne gesehen.
Es wurde schon sehr deutlich gemacht, dass ich das eigentlich quasi alleine lösen soll.
Nur weiß ich auch nicht, wenn es teilweise vom Level doch deutlich zu hoch ist, wie man da als "Anfänger" ansetzen soll.
Sowas wird einem auch nicht in der Umschulung vermittelt, wie man sich alleine einarbeitet, ohne Doku und mit Aufgaben, die eigentlich zu schwer sind.
Mag sein, ich setze selbst falsch an.
Wenn es dazu sinnvollen Input gibt, wie ich mir besser selbst helfen kann, auch sehr gerne gesehen!
Wenn ich irgendwo fachlich wirr schreibe, bitte nachfragen, liegt an momentaner Inkompetenz, nicht am bösen Willen.
Moderiert von Th69: Beitragsformatierung überarbeitet.
Lyn - Mi 19.12.18 11:03
Ralf Jansen hat folgendes geschrieben : |
An alle Klassen mit bestimmten Eigenschaften in einer Assembly kommst du per Reflection.
Z.B hier um an alle Form Ableitungen zu kommen
C#-Quelltext 1: 2:
| var assembly = Assembly.GetExecutingAssembly(); var myLovelyFormInheritors = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(Form))).ToList(); | |
Dazu mache ich mir erstmal Gedanken, frage ggf. später nochmal nach. Danke für den Hinweis. :)
Th69 - Mi 19.12.18 11:42
Danke Lyn für deinen ausführlichen Text.
Was genau sind denn "Masken" - sind dies wirklich eigenständige Forms (oder evtl. eingebettete TabPages o.ä.)?
Für mich hört sich dein Text aber so an, als ob du bestehende Instanzen der "Masken" aufrufen sollst (und nicht anhand des Klassennamens eine neue Instanz öffnen sollst - und dann kämst du mit Reflection nicht weit).
Lyn - Mi 19.12.18 11:57
Th69 hat folgendes geschrieben : |
Danke Lyn für deinen ausführlichen Text.
Was genau sind denn "Masken" - sind dies wirklich eigenständige Forms (oder evtl. eingebettete TabPages o.ä.)?
Für mich hört sich dein Text aber so an, als ob du bestehende Instanzen der "Masken" aufrufen sollst (und nicht anhand des Klassennamens eine neue Instanz öffnen sollst - und dann kämst du mit Reflection nicht weit). |
Eigenständige Forms, teilweise Form + Grid + Uc, wenn du es genau wissen willst, im Kern auf jeden Fall eigenständige Winforms.
Ich fürchte da scheitert es gerade am Fachlichen..
Ich soll, was ich bisher so analysiert und zusammengereimt habe, über "Form1 = new Form2" Prinzip (Pseudocode)
bestehende Formen aufrufen.
Das Ziel ist sie sollen aufgehen. Indem ich mit meiner Form eine andere Form aufrufe, über angedeuteten Code Ansatz,
erzeuge ich de facto eine neue Instanz oder?
Die Form existiert schon, aber aus Entwickler Sicht ist es eine neue Instanz erzeugen oder?
(geht mir jetzt ums fachlich korrekte Betiteln, was ich hier eigentlich treibe?)
Da das hier schon wieder neue utopische Formen annimmt punkto Erwartungshaltung, jetzt doch mal n Kollegen geschnappt.
Die Anforderungen sind zu vage formuliert, hat er mir bestätigt und der neue Lösungsansatz sieht für mich jetzt aus,
dass ich es zunächst simpel als Testversion gestalte und mir "per Hand" eine Übersicht über ausgewählte Formen schaffe
und dann erstmal nur die ermögliche, dass diese aufrufbar sind.
Alle Masken zunächst in irgendeiner Form zu katalogisieren mit irgendeiner Codestruktur, wäre tatsächlich utopisch,
wurde mir ebenfalls bestätigt.
Das ist für mich einer der nervigen Punkte am "Anfänger" sein. Dass es deutlich schwerer ist zu beurteilen,
wann man sich selbst "doof" anstellt und wann wirklich zu hohe Anforderungen von außen kommen.
Danke für eure Geduld und Antworten auf jeden Fall! :)
Chiyoko - Mi 19.12.18 12:42
Hallo,
gräme dich nicht. Gerade bei Schulungen bist du ja nicht allein und kannst Kollegen und Dozenten fragen, wenn du da was nicht verstehst
oder die Aufgabe nicht eindeutig gestellt wurde.
Eventuell legst du dir mal ein (gutes) Fachbuch zu.
Wenn bereits Masken existieren, müssten ja zumindest irgendwo deklariert sein. Eine Instanz ist vorhanden, wenn diese Deklaration nicht "null" ist.
Existiert die Form bereits, wurde sie nur versteckt und kann per Form.Show/ShowDialog() abgrufen werden.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private Form _form1; ...
if(_form == null) { _form1 = new Form(); else { _form1.Show(); } |
EDIT: Es könnte hilfreich sein, das Thema OOP verstehen zu lernen.
https://entwickler.de/online/development/einfuehrung-programmierung-objektorientierte-programmentwicklung-197372.html
Ralf Jansen - Mi 19.12.18 12:55
Zitat: |
Die Form existiert schon, aber aus Entwickler Sicht ist es eine neue Instanz erzeugen oder? |
Vielleicht hilft dir/uns folgendes Beispiel.
Zitat: |
var ersteForm = new MeineLiebeForm();
var zweiteForm = new MeineLiebeForm();
var dritteForm = new MeineLiebeForm();
|
An den 3 Variablen hängen 3 verschiedene Instanzen der selben Klasse. Was interessiert dich? Die Instanzen die an den Variablen ersteForm, zweiteForm, dritteForm hängen oder die Klasse MeineLiebeForm von der in deinem Code beliebig viele unabhängige Instanzen existieren oder von der du weitere Instanzen erzeugen und anzeigen könntest wenn du denn die Klasse hättest?
Zitat: |
Alle Masken zunächst in irgendeiner Form zu katalogisieren mit irgendeiner Codestruktur, wäre tatsächlich utopisch, wurde mir ebenfalls bestätigt. |
Das ist eigentlich relativ simpel. Aber du hängst vermutlich an einer bestehenden Legacy Applikation wo nachträgliches einbauen schwer wird wenn jeder nach belieben an beliebiger Stelle bisher einfach ein direktes
new Form benutzt hat. Ein Lösung die das nicht ändert wird aber immer ein Art von Workaround bleiben. Man kann mit Tricks eine unsaubere Architektur am Leben halten und neue Features dran stricken. Sowas fällt einem aber irgendwann vor die Füsse. Vielleicht kann man hier was gutes reininterpretieren als Anfänger sollte man auch diese Erfahrung mal explizit machen ;)
Zitat: |
Speziell diese Aufgabe:
Indem das Programm aus Entwicklersicht geschrieben ist. Ich arbeite zum Üben mit unserem bestehenden System und für dieses soll u.a. eine Funktionalität geschrieben werden, dass man Masken (deren Namen oben immer steht und durch Bugs eh bekannt ist) eingeben soll können und diese dann direkt aufgerufen werden, nur durch Nameneingabe, ohne dass man explizit die ganzen Reiter durchsuchen muss, wo die Maske ist.
Problem ist, dass die Namen auf den Masken (wenn man das Programm startet), auch nicht identisch sind mit den Klassennamen, der Klassen, die dahinter stehen. |
Da kann man mit Erfahrung tatsächlich was reininterpretieren ;)
Ihr wollt in allen offenen Formen anhand der Caption(Text Property) der Form diese finden können. Vermutlich steht in der Caption in eurem System oft etwas sinnvolles das Instanzen der gleichen Form Klasse unterscheidbar machen (z.b. in einer Personenverwaltung der Name der Person etc.)
Dazu könnten dir helfen (ich nenne mal Stichpunkte die man als Anfänger nur schwer finden kann wenn man nicht weiß noch man den suchen soll, dann kannst du zumindest selbst kodieren :wink: )
* In Winforms gibt es immer eine Applikation Klasse. Die hat eine OpenForms Property über die du an alle angezeigten Formen deiner Applikation kommst.
* Formen können modal oder nicht modal angezeigt werden. Eine modale Form sperrt den Rest der Anwendung. In dem Fall das ihr auch modale Formen habt müsst ihr genau überlegen wie ihr damit umgeht. Ein aktivieren jeder beliebigen in der Anwendung angezeigten Form ist dann nicht möglich.
* Formen haben für Ihre Caption eine Text Property (ich vermute nur das das dein "Namen auf den Masken" ist). Das ist ein string und strings könntest du z.B. mit den Methoden Contains oder StartsWith durchsuchen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!