C#: GC Dispose() Frage

Hallo!

Hab ein schwerwiegendes Problem:
Und zwar jedes mal wenn ich auf "Neues Spiel" klicke, werden 2 neue Spielfelder erstellt, das funzt soweit auch alles. Nun mus ich aber das alte Spielfeld (falls bereits erstellt) vorher löschen (da das neue Spielfeld sonst hinter dem alten erscheint), das kann man unter .NET ja nicht selbstständig und rufe deshalb die Dispose() Funktion der Form auf, in der sich die alten Spielfelder befinden (this.Dispose(false))

Nun das macht er auch alles, arbeitet das OnClick-Event fertig ab und dann NICHTS!!!
Die ganze Form ist einfach verschwunden! Das Programm läuft noch, aber ohne Form.
Hab auch schon probiert in mein 'SpielFeld' das Dispoce Interface zu implementieren, jedoch mit demselben Effekt.

Rufe ich vielleicht die falsche Dispose-Funktion auf?

Benutze VS2008, WinXP, .NET 3.5

Irgendjemand eine Idee / selbes Problem gehabt?

Werde in der nächsten Woche kaum antworten können, da ich keinen PC habe, also bitte habt etwas Geduld mit mir :D
 
Hallo,
Dispose ist der vermutlich der falsche Ansatz.
Wenn ich dich richtig verstanden hast, erstellt du pro Spielfeld ein neues Form? Dieses Form (und nicht this) solltest du dann per .close() (oder so ähnlich) schließen.

Ansonsten musst du schon genauere Infos machen, wie du ein neues Spielfeld erstellst (geerbt von Form, Form mit Delegate auf Spielfeldobjekt, Geerbt von UserControl, normale Klasse die ein Form/Usercontrol erstellt, UserControl der ein Spielfeldobjekt übergeben wird?...)
 
also wenn ich dich richtig verstehe rufst du die dispose funktion vom form aus und nicht von dem feld.

interessant wär jetzt mal, was du als dein spielfeld benutzt und wieso das im hintergrund liegt.

versuch mal, deinen programmaufbau näher zu beschreiben mit so den wichtigsten controls die du verwendest (und am besten noch etwas code).

und dann kann ich dir als forum noch http://www.c-sharp-forum.de/ empfehlen, da du dort sehr viel mehr leute findest, die dir mit c# helfen können (für den fall, dass wir dir hier nicht helfen können)

aber mit ner besseren beschreibung kann ich dir vielleicht sogar schon tips geben ;)
 
Hallo,
Dispose ist der vermutlich der falsche Ansatz.
Wenn ich dich richtig verstanden hast, erstellt du pro Spielfeld ein neues Form? Dieses Form (und nicht this) solltest du dann per .close() (oder so ähnlich) schließen.

Danke für Deine schnelle Antwort und sorry für die Ungenauigkeit:
Ich erstelle die Form ("MainForm") 1x, auf dieser sollten dann die beiden Spielfelder dargestellt werden. So dachte ich mir, müsste es reichen, wenn ich beide Spielfelder (vor dem erneuten Erstellen) auf null setze und dann diese Form dispose. (mit Aktualparameter false)

Erstellt wird die Klasse indem ich ihr einen "Zeiger" im Konstruktor übergeben, in etwa so
Spielfeld sf = new Spielfeld(this (<--MainForm),...)

Apropo hier hätte ich sowieso mal ne Frage, ich weiß dass das oben nicht die schönste Variante ist, welche Variante würdet Ihr denn empfehlen?

EDIT:
also wenn ich dich richtig verstehe rufst du die dispose funktion vom form aus und nicht von dem feld.
Genau so!

interessant wär jetzt mal, was du als dein spielfeld benutzt und wieso das im hintergrund liegt.
Also wenn ich eine neue Instanz des Spielfeldes erzeuge (die alte überschreibe), dann sind die beiden anderen (nicht mehr zugängigen) Instanzen immer noch vorhanden (auf der Form sichtbar) und verdecken das neue Spielfeld (es ist nicht sichtbar)

versuch mal, deinen programmaufbau näher zu beschreiben mit so den wichtigsten controls die du verwendest (und am besten noch etwas code).

Also, es geht um das Spiel Schiffe versenken, der Spielregeln sind wohl jedem bekannt.
Hier der ablauf: der user klickt auf "Neues Spiel", er fügt seine Daten ein (Farbe des jeweiligen Schiffstyps,....) und platziert seine Schiffe. Nach dem Platzieren (und falls alle richtig platziert sind) kopiere ich die Felder aus der (vom Spielfeld abgeleiteten) Klasse place_ships in eines der Spielfelder (MainField[0]), denn hier sollte der Spieler nun seine platzierten Schiffe sehen (aber natürlich nicht mehr verändern können).

Klickt der Spieler nun wieder auf "Neues Spiel", entsteht eben das geschilderte Problem.

Zu meinen Controls zählen im Spielfeld:
(1 GroupBox)
1 Buttonarray Button[,]

Das sind die Main-Controls! Falls ihr wirklick Code sehen wollt, hier etwas:

Code:
//generate the upper screen for user
                Properties = new_game_Form.SpielFeld_Properties;

                if (MainField[0]!=null||MainField[1]!=null)
                {
                    MainField[0] = MainField[1] = null;
                    throw new Exception("Das hier funzt nicht!; ka warum nit");
                    this.Dispose();
                    this.Show();
                }

                MainField[0] = new SpielFeld(this, Properties, FieldSize, "Ihre Schiffe:", ButtonGroupBoxOffset, ButtonSize, new Point(15, 30));
                SpielFeld.CopyButtons((SpielFeld)(new_game_Form.Form_PlaceShips.Ships_to_place_Field), MainField[0]);
                //copy the ships of the 'old' field:
                SpielFeld.CopyShips((SpielFeld)(new_game_Form.Form_PlaceShips.Ships_to_place_Field), MainField[0]);
                
                //refresh the field:
                MainField[0].ReDrawShips();
                
                //make it readonly
                MainField[0].Enabled = false;

                //create the second field:
                MainField[1] = new SpielFeld(this, Properties, FieldSize, "Schuss:",

und dann kann ich dir als forum noch http://www.c-sharp-forum.de/ empfehlen, da du dort sehr viel mehr leute findest, die dir mit c# helfen können (für den fall, dass wir dir hier nicht helfen können)

Danke, war schon auf der Suche nach einem "gescheiten" Forum für C#, nicht das ich Eure Hilfe nicht zu schätzen weiß (im Gegenteil!), aber manche Fragen gehören einfach in ein C# Forum

Hoffe, das ist etwas besser verständlich!
 
also so recht sehe ich immer noch nicht, womit du letztendlich die spielfelder darstellst (also mit welchem control). letztendlich müsstest du nämlich dieses mit dispose entsorgen und nicht das form.
also etwa so: this.spielfeld.dispose();
 
Hallo,
du solltest evt. das Spielfeld von einem Usercontrol ableiten lassen und dann dieses Control in einem Panel anzeigen lassen.

Um ein neues Spielfeld zu erstellen, leerst du alle Elemente des Panels und fügst ein neues Spielfeld dem Panel hinzu.


Dass this.Dispose(); nicht funktioniert ist klar, da damit das ganze Form 'über den Haufen geworfen wird'.
 
Hallo,
du solltest evt. das Spielfeld von einem Usercontrol ableiten lassen und dann dieses Control in einem Panel anzeigen lassen.

Um ein neues Spielfeld zu erstellen, leerst du alle Elemente des Panels und fügst ein neues Spielfeld dem Panel hinzu.


Dass this.Dispose(); nicht funktioniert ist klar, da damit das ganze Form 'über den Haufen geworfen wird'.

Vielen Danke für die schnelle Hilfe @Elderan & lightsaver

Habs nun so probiert, wie ihr es gemeint habt, funktioniert jetzt tadellos!
 
Zurück
Oben