Form mit Application.Run starten

cyrano1960

Grünschnabel
Hallo, ich habe mal eine Grundsatzfrage. Ich bin recht neu bei C# und ich hoffe, dass das nicht zu simpel ist aber ich habe nirgend eine Antwort darauf gefunden. Wenn ich im Visual Studio 2008 Express C# eine Windows-Applikation erzeuge, dann wird das erste Formular ja mit der Anweisung Application.Run(new Form1()) in der Main-Methode gestartet. Wenn ich mir den Code anschaue, handelt es sich bei Form1 doch aber um eine Klasse, die von Form abgeleitet ist und kein Objekt, wie es in den meisten Büchern steht. Aus diesem Grund kann ich es ja auch aus der Main-Methode nicht per Form1.ShowDialog() starten. Ich wollte nun aus einem anderen Formular auf Steuerelemente von Form1 zugreifen. Das geht aber aus oben genannten Grund nicht. Wie heißt denn die Instanz von Form1? Vielen Dank und viele Grüße Cyrano
 
Hallo Norbert, vielen Dank für die schnelle Antwort. Bei mir heißt es
Code:
Application.Run(new Form1());
nicht
Code:
Application.Start(new Form1());
aber ich denke, dass ist ja nicht das Maßgebliche. Was ich nur nirgends finde, Form1 ist ja die Klasse von der ein Objekt erzeugt wird, wie heißt dann dieses Objekt? Form1 ist ja keine Instanz von Form, sondern eine neue Klasse, die von Form abgeleitet wurde und wenn ich es so mache:
Code:
Form1 my_form = new Form1();
my_form.ShowDialog();
dann klappt das ja auch prima und ich kann mit my_form.xxx auf die Steuerelemente zugreifen, aber bei der ersten Variante fehlt mir einfach der Name über den ich auf die Instanz zugreifen kann.
Sorry, aber Objektorientierung ist noch nicht lange mein Ding.

Viele Grüße Cyrano
 
Der Term new IrgendeineKlasse() erzeugt immer eine Instanz der Klasse. Dafür sorgt das Schlüsselwort "new". Dabei ist es egal, ob diese Instanz nun einer Variablen zugewiesen wird oder nicht.
Man könnte auch schreiben:
C#:
Form1 my_form = new Form1();
Application.Run(my_form);
Da "my_form" aber in der Main-Methode nirgendwo gebraucht wird, ist seine Verwendung überflüssig. "Show()" wird dann innerhalb der Run-Methode aufgerufen.

Gruß
MCoder
 
Hallo MCoder, aber sind das nicht 2 vollkommen unterschiedliche Wege, wenn ich einfach nur
Code:
Application.Run(new Form1());
schreibe, übergebe ich ja eine Klasse. Wie Du schreibst, wird durch new eine neue Instanz erzeugt ohne das ich eine Variable habe, über die ich auf das Fenster zugreifen kann. Im 2. Fall, den Du beschreibst:
Code:
Form1 my_form = new (Form1();
Application.Run(my_form);
Das funktioniert bei Dir? So würde doch eine Instanz der Klasse Form1 erzeugt und diese Instanz übergeben. Mein Compiler meckert diese Variante auch an.

Bliebe immer noch die Frage, wie kann ich denn dann aus einer anderen Klasse auf Objekte in meinem Fenster zugreifen, das durch
Code:
Application.Run(new Form1());
erzeugt wurde, wenn es dafür keine Variable gibt?

Beste Grüße und einen schönen Tag
Cyrano
 
C:
Form1 my_form = new (Form1();
Application.Run(my_form);

Wie es MCoder schon geschrieben hat, ich denk du machst eher noch ein fehler Poste mal den Source

mfg
 
;) Sorry, hab mal wieder im Stress ein wenig zu oberflächlich gelesen. Du hast ja eben das new in der 2. Variante weggelassen. Das ist natürlich was anderes.

Oki, dann mal vielen Dank.
 
Hallo Leroux,

ein Fehler ist es ja im Grunde nicht, da beide Wege funktionieren. Die Frage bezog sich lediglich auf den Namen des Objektes. Also, wenn ich es über:

Code:
Form1 my_form = new Form1();

mache, dann kann ich ja ganz simpel aus anderen Klassen auf die Steuerelemente meines Formulars zugreifen.

Erzeuge ich das Fenster (wie der Designer es beim Anlegen eines Windows-Application-Projektes macht) über:

Code:
Application.Run(new Form1());

dann kenne ich ja den Namen des erzeugten Objektes nicht (Form1 ist ja die Klasse und nicht das erzeugte Objekt) und meine Frage war, wie ich auf ein solches Objekt dann zugreifen kann.

Beste Grüße
Cyrano
 
dann kenne ich ja den Namen des erzeugten Objektes nicht (Form1 ist ja die Klasse und nicht das erzeugte Objekt) und meine Frage war, wie ich auf ein solches Objekt dann zugreifen kann.Cyrano

Da hast du recht, ohne den Namen kannst du auf das Objekt nicht nicht zugreifen. Die vorherige Zuweisung an eine Variable nützt dir aber auch nicht viel, weil deren Gültigkeit auf die Main-Methode beschränkt bleibt, also von anderen Klassen auch nicht darauf zugegriffen werden kann.
Was den konkreten Fall betrifft: Das an Application.Run() übergebene Form-Objekt ist das zentrale Objekt der ganzen Applikation. Alle weiteren Klassen werden innerhalb dieses Objektes instanziiert und denen kann man bei Bedarf einen Verweis auf diese Form übergeben.

Gruß
MCoder
 
Die Frage ist doch: "Willst du in der Main Klasse auf das Form zugreifen oder nicht?"

Application.Run(new Form1()) erzeugt eine Instanz von Form ein und zeigt dieses Formular an. Wenn die Form geschlossen wird, dann endet ebenfalls die Ausführung der Methode Run() und es wird, falls vorhanden, der Code nach dieser Zeile ausgeführt, anschließend wird das Programm beendet.

Wenn du von "außen" auf die Instanz der Form zugreifen willst, dann musst du diese über eine Variable erzeugen und die Variable der Application.Run()-Methode übergeben.
Sämtliche Zugriffe müssen dann allerdings VOR Application.Run() ausgeführt werden.

Zugriffe von "innen", also z.B. wenn du einen Button auf dem Form1 platzierst und z.B. den Formtitel änderst, erfolgen über das Schlüsselwort this.

Ergo: Nur wenn du unbedingt in in der Main-Methode auf das Formular zugreifen musst, ist es erforderlich, dass das Formular in einer Variable verfügbar ist, ansonsten nicht.
 
Zurück