Hallo,
Du musst in der Tat etwas umdenken: Delphi ist nur "teilweise" objektorientiert, aber NET und C# vollständig. Das bedeutet, dass irgendeine Klasse von Details einer anderen Klasse nichts, aber auch gar nichts weiß. Die Kommunikation zwischen zwei Klassen findet nur über dafür vorbereitete Schnittstellen (das sind Schnittstellen im Sinne der OOP, aber kein interface von C#) statt. Die Aufgabe darf deshalb nicht lauten: MachWasMitForm1, sondern Form1.SollWasTun. Außerdem muss die Maßnahme "Mach was" immer dort stehen, wo sie von der Sachlogik her hingehört. Aufgaben, die zu einem Formular gehören, sollten innerhalb des Formulars deklariert und implementiert werden.
In Deiner Situation hast Du drei Klassen: TestProgramm, Form1, MyClass. TestProgramm steuert den Programmablauf. (Standardmäßig heißt diese Klasse Program.) Zusätzliche Methoden wie MyMethod haben dort nur insoweit etwas zu suchen, wie es mit dem Programmablauf zusammenhängt. In der Praxis kann ich nur folgende Situation für sinnvoll halten:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| static class TestProgramm { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); string username = String.Empty; using(LoginForm login = new LoginForm()) { if (login.ShowDialog() == DialogResult.OK) username = login.Username; } if (! String.IsNullOrEmpty(username)) { MainForm main = new MainForm(); main.Init(username); Application.Run(main); } } } |
Die Frage 1 kann also etwa so beantwortet werden: Wenn es eine Notwendigkeit gibt, kannst Du Dir mit einer Variablen den Zugriff auf das Formular verschaffen. Aber Du darfst damit nur auf public-Member zugreifen, also auf Eigenschaften, die die Kommunikation über die Schnittstelle steuern, und auf Methoden, die dafür vorgesehen sind.
Etwas schwieriger ist Frage 2 zu beantworten, weil es keine allgemeingültigen Situationen gibt. Es hängt z.B. davon ab, ob eine Instanz von MyClass vom Formular erzeugt wird oder umgekehrt und welchen Einfluss die Instanzen aufeinander haben sollen. Vereinfacht gesagt: Die erzeugende Klasse darf die erzeugte Klasse kennen, aber nicht umgekehrt. Auch für diese "Kenntnis" gilt die Beschränkung auf die Schnittstelle.
Um es noch etwas komplizierter zu machen: Wenn die erzeugte Klasse etwas in der erzeugenden Klasse erledigen soll, kann ein
Delegate benutzt werden; das entspricht in etwa einem Methodenzeiger. Wenn ein Objekt (z.B. eine Klasse, die einem Datenmodul entspricht) allen Formularen in exakt der gleichen Situation bekannt sein soll, kann es als
Singleton eingebaut werden.
Weitere Erläuterungen zu Deinen Verständnisproblemen findest Du z.B. unter
FAQ Kommunikation zwischen 2 Forms (wie von Sebastian erwähnt) und den dort genannten Verweisen.
Viel Erfolg! Jürgen
Weitere einführende Literatur:
OpenBook Visual C#
OpenBook C#
OpenBook OOP