[C#] Alle Objekte eines Forms schließen.

Danielku15

Erfahrenes Mitglied
Hallo Leute.
Ich experimentiere zur Zeit ein bisschen mit C#. Ich erstelle gerade ein kleines Spiel. Auf Knopfdruck startet das Spiel und es werden mittels Intervall Objekte von Forms erzeugt. In diesen Forms befinden sich Bilder. Wenn sie angeklickt werden werden sie geschlossen und man bekommt Punkte. Sollte eine bestimmte Punkteanzahl erreicht sein wird das Intervall verkleinert. Sollten mehr als 20 Forms geöffnet sein wird das Intervall gestoppt. Das Problem liegt nun darin die überbleibenden Forms zu schließen. Gibt es einen Befehl dafür alle Forms zu schließen oder ist dies über Umwege möglich?

greez Daniel
 
Du erstellst dir einfach eine globale Variable vom Typ ArrayList (oder wenns performance-kritisch ist vom Typ Hashtable) und trägst jede erstellte Form dort ein. Wenn das Spiel oder die Runde beendet ist, dann gehst du dort alle Forms durch und setzt sie auf null oder rufst einfach Dispose() auf.
 
Danke ersteinmal. Die Idee ist mir nun klar. Nur bei der Umsetzung haperts noch ein bisschen. Ich habe nun eine globale Variable im Hauptfenster deklariert. Sobald ein neues Fenster geöffnet wird trägt sich dieses in die Hashtable ein. Nur welche Werte muss ich eintragen. Und wie durchlaufe ich dann alle Forms uns schließe sie. Bisher habe ich die Forms einfach über Show() und Close() geöffnet und geschlossen. Ich experimentiere erst seit ein paar Tagen mit C# herum.

greez daniel
 
Hi!

So kannst einfach durch iterieren.
C#:
forech ( Form form in formHashTable )
	form.Dispose()
formHashTable.Clear()
oder so direkt auf ein Form via Idendifizier-Objekt zugreifen:
C#:
Form currentForm = formHashTable[ formKey ];
formHashTable.Remove( formKey );
currentForm.Dispose();
MfG, cosmo
 
Danke. Jetzt weiß ich wenigstens wie ich die Forms lösche . Jetzt bleibt nur noch die Frage übrig: "Was trage ich als Key und Value in die Hashtable ein?" Folgender Code ist funktioniert nicht. Es werden keine Forms geöffnet:
C#:
                Screen src = Screen.PrimaryScreen;
                Random rnd = new Random();
                Form Form1 = new Form(this);
                int pos_y = rnd.Next(0, (src.WorkingArea.Height - Form1.Height / 2));
                int pos_x = rnd.Next(0, (src.WorkingArea.Width - Form1.Width / 2));
                Form1.StartPosition = FormStartPosition.Manual;
                Form1.Location = new Point(pos_x, pos_y);
                this.Forms.Add(this.zaehler, Form1);
                Form1.Show();

greez daniel.
 
Zuletzt bearbeitet:
Hi,

Ich hab son ähnliches problem, naja vielleicht nicht ganz aber so ähnlich...
Gibt es eine möglichkeit in einer form selbst zu sagen das sie sich schließ soll?

Also mein Problem ist das die Form offen ist und arbeitet...
Doch wenn was passiert, z.B Spieler 1 hat gewonnen soll sich diese Form schließen!
Ich bin also soweit das die meldung kommt... aber wenn ich danach return; mach arbeiten die threads in der Form weiter... sollen sie aber nicht...

Die form soll komplett geschlossen werden mit dem ganzen inhalt und objekten!

Ich glaube das ist einfach als ich denke und deswegen komm ich nicht drauf ;-)


Danke vielmals an alle die mir helfen im vorraus :)

Gruß
Sam
 
Wenn dein Code ungefähr so aussieht
C#:
...
MessageBox.Show("Spieler 1 hat Gewonnen!");
dann füge noch ein
C#:
Form.Close();
an. Return hat nur die Funktion die aktuell ausgeführte Funktion zu beenden, und einen Wert zurückzugeben. Machs per Form.Close(); oder Form.Dispose(); wenn du das Form komplett aus dem Speicher entfernen willst.
 
Zuletzt bearbeitet von einem Moderator:
So hab ich mir das auch erst gedacht aber es funktioniert irgendwie nicht!
Es kommt die Fehlermeldung

Fehler 10 Für das nicht statische Feld, die Methode oder die Eigenschaft "System.Windows.Forms.Form.Close()" ist ein Objektverweis erforderlich. D:\Eigene Dateien\School\Saman Lino\Oberstufe\Abschluß Projekt 2007\NetMan-6.0\NetMan-1.0\SpielForm.cs 272 29 NetMan-1.0

Das ist seltsam weil ich auch kein plan hab wie ich das sonst machen könnte!!

Danke für deine schnelle antwort... muss Morgen mein abschluß projekt abgeben und hab außer das schon alles erledigt :)

Kennst du noch einen anderen weg?


Gruß
Sam
 
Hi

Close ist eine Instanz-Methode. Das bedeutet, dass du immer erst eine Instanz der Klasse anlegen musst, bevor du die Methode nutzen kannst (wie die Fehlermeldung auch besagt).

Instanz-Methode kannst du natürlich auch innerhalb der Klasse nutzen, in dem du mit dem this-Pointer darauf zugreifst.
also zum Beispiel:
C#:
this.Close();
 
Oh gott... ich bin so hool... sorry natürlich, es ist zu einfach...
Naja ich vollidiot hätte ja einfach schreiben können

Close();

Also problem gelöst, naja vielleicht sollte ich lieber mal ne halbe stunde pause machen ;-)

Gruß und vielen dank für deine antwort, das hat mir den richtigen denkanstoß gegeben.
Sam
:)
 

Neue Beiträge

Zurück