Autor Beitrag
Lyn
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 18.12.18 17:54 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4444
Erhaltene Danke: 914


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4444
Erhaltene Danke: 914


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 19.12.18 10:13 
Klassen, definitiv
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4121
Erhaltene Danke: 853

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4444
Erhaltene Danke: 914


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
var assembly = Assembly.GetExecutingAssembly(); // oder welche Assembly auch immer
var myLovelyFormInheritors = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(Form))).ToList();

Für diesen Beitrag haben gedankt: Lyn
Lyn Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 19.12.18 11:02 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconTh69: Beitragsformatierung überarbeitet.
Lyn Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 19.12.18 11:03 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
An alle Klassen mit bestimmten Eigenschaften in einer Assembly kommst du per Reflection.

Z.B hier um an alle Form Ableitungen zu kommen
ausblenden C#-Quelltext
1:
2:
var assembly = Assembly.GetExecutingAssembly(); // oder welche Assembly auch immer
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4121
Erhaltene Danke: 853

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 19.12.18 11:57 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# (VS 2017)
BeitragVerfasst: 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.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
private Form _form1; // Deklariert mit Namen

...

if(_form == null// keine Instanz vorhanden?
{
   _form1 = new Form(); // neue Instanz der Klasse Form erstellen}
else
{
   _form1.Show(); // bereits vorhandene Instanz von _form1 aufrufen
}



EDIT: Es könnte hilfreich sein, das Thema OOP verstehen zu lernen.
entwickler.de/online...wicklung-197372.html
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4444
Erhaltene Danke: 914


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.