new Geschrieben 27. Juli 2010 Geschrieben 27. Juli 2010 Hi! Ich habe seit 2 Tagen mit C# angefangen und schon hab ich eine Frage. Zu meinem Problem: Ich habe, durch die Hilfe einens Lernprogrammes ein Labyrinth erstellt. Und dieses Programm habe ich erweitet. Wenn ich aber von Labyrinth 1 zu Labyrinth 2 wechsel und dabei dann Labyrinth 1 schließe kommt eine Fehlermeldung. (form1 zu form2 ) private void MovetoStart(int a) { if (a == 1) { Point startingPoint = panel1.Location; startingPoint.Offset(13, 13); [B][I][U]Cursor.Position = PointToScreen(startingPoint);[/U][/I][/B] } } Die Fehlermeldung bezieht sich auf das markierte. Titel: ObjectDisposedException wurde nicht behandelt. Text: Auf das verworfene Objekt kann nicht zugegriffen werden. Objektname:"Form1". Hinweis: Stellen Sie sicher, dass keine Ressourcen von ihrer Verwendung freigegeben wurde. Wie kann ich die Fehlermeldung beheben ? Habe bereits mehrere Sachen versucht: 1: erstes Fenster nicht schließen und das klappt nur das bringt mich nicht weiter, denn ich will ja nicht irgentwann 10 fenster offen haben. 2: Den Bereich ausgeklammert, aber dann kam kein sprung mehr zu form2 3: Den ganzen Code gelöscht und neu geschrieben, ohne Erfolg Vielleicht hängt es damit zusammen wie ich form2 aufrufe: private void finish_MouseEnter(object sender, EventArgs e) { finishi.Play(); switch (MessageBox.Show("Jawoll!!", "Hura!", MessageBoxButtons.OKCancel)) { case DialogResult.OK: Form2 f2 = new Form2(); f2.Show(); this.Close(); break; } int a = 1; MovetoStart(a); } Die Suchfunktion habe ich bereits genutzt, doch ich fande nur Sachen von form2 zu form1 Daten übergeben. Hier einmal der komplette Code: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication4 { public partial class Form1 : Form { System.Media.SoundPlayer start = new System.Media.SoundPlayer (@"C:\Windows\Media\chord.wav"); System.Media.SoundPlayer finishi = new System.Media.SoundPlayer( @"C:\Windows\Media\tada.wav"); public Form1() { InitializeComponent(); int a = 1; MovetoStart(a); } private void finish_MouseEnter(object sender, EventArgs e) { finishi.Play(); switch (MessageBox.Show("Mizuki!!!", "Hura!", MessageBoxButtons.OKCancel)) { case DialogResult.OK: Form2 f2 = new Form2(); f2.Show(); this.Close(); break; } int a = 1; MovetoStart(a); } private void MovetoStart(int a) { if (a == 1) { Point startingPoint = panel1.Location; startingPoint.Offset(13, 13); Cursor.Position = PointToScreen(startingPoint); } if (a == 2) { start.Play(); Point startingPoint = panel1.Location; startingPoint.Offset(13, 13); Cursor.Position = PointToScreen(startingPoint); } } private void wall_MouseEnter(object sender, EventArgs e) { int a = 2; MovetoStart(a); } } } Vielen Dank für eure Hilfe! Und ich hoffe das ich es einigermaßen mein Problem schieldern konnte. Zitieren
HJST1979 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Hallo habe deinen Fehler gefunden private void finish_MouseEnter(object sender, EventArgs e) { int a = 1; MovetoStart(a); } Diesen oben angegeben Code läuft du auf JEDEN Fall durch, auch wenn du das aktuelle FORM schon geschlossen hast, deshalb läufts auf einen Fehler. Du darfst den Code aber nur durchlaufen, wenn das aktuelle FORM noch nicht geschlossen wurde. Also ab damit in deinen SWITCH switch (MessageBox.Show("Jawoll!!", "Hura!", MessageBoxButtons.OKCancel)) { case DialogResult.OK: Form2 f2 = new Form2(); f2.Show(); this.Close(); break; default: int a = 1; MovetoStart(a); break; } Viel spass noch ;-) Gruß Hans-Jörg Zitieren
new Geschrieben 28. Juli 2010 Autor Geschrieben 28. Juli 2010 (bearbeitet) Hi! Vielen Dank für deine Hilfe Hans-Jörg! Danke werd ich haben ^^ Durch das Switch ist jetzt die Fehlermeldung weg, allerdings werden beide Fenster geschlossen also Form1 und Form2. switch (MessageBox.Show("Jawoll!!", "Hura!", MessageBoxButtons.OKCancel)) { case DialogResult.OK: Form2 f2 = new Form2(); f2.Show(); this.Close(); break; default: int a = 1; MovetoStart(a); break; } Habe bereits this.Close(); ausgeklammert und dann konnte ich sehn, dass beide Fenster offen sind. Die Frage lautet: Wie schaffe ich es, dass nur Form1 geschlossen wird ? Was ich bereits versucht habe: - Ich habe Form1 einfach unsichtbar gemacht. case DialogResult.OK: Form2 f2 = new Form2(); f2.Show(); this.Hide(); break; Dies klappt auch. Nur stelle ich mir jetzt eine generelle Frage: Verbraucht Form1 noch Speicher oder könnte ich so 1000 Forms unsichtbar machen ? Ohne das der Pc sichtlich langsamer wird ? Entschuldigung, weiß leider noch nicht viel von Anwendungssprachen, denn habe bisher immer im Web-gescriptet und wollte damit nun anfangen. Vielen Dank für eure Hilfe! Bearbeitet 28. Juli 2010 von new xD Zitieren
lbm1305 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Jedes Objekt, was noch nicht zerstört wurde, verbraucht Speicher. Die Garbage Collection räumt den Speicher leer, wenn diese merkt, wenn ein Objekt nicht mehr benötigt wird. Um aber eine zweite Form offen zu halten, wird die erste benötigt, jedenfalls in Deinem Szenario. Vielleicht hilft Dir die Methode ShowDialog() --> diese öffnet einen modalen Dialog. Oder Du nutzt das Singleton-Pattern. Zitieren
HJST1979 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Hallo ich denke ich weiß wo das Problem liegt. Scheinbar ist Form1 dein "Startform" der Application. Wenn du nun natürlich Form1 beendest beendest du automatisch die Application. Ich würde also ein neues StartForm machen in dem du mit einem Menüclick das Form1 startest. Nun kannst du aus Form1 das Form2 starten und dann Form1 schließen ohne dass die Application mit beendet wird. Probiers mal aus, ich kann dir leider nicht genau sagen ob das funktioniert aber denke schon ! Gruß Hans-Jörg Zitieren
lbm1305 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 automatisch die Application. Ich würde also ein neues StartForm machen in dem du mit einem Menüclick das Form1 startest. Nun kannst du aus Form1 das Form2 starten und dann Form1 schließen ohne dass die Application mit beendet wird. Probiers mal aus, ich kann dir leider nicht genau sagen ob das funktioniert aber denke schon ! Was soll den der Unterschied zwischen einer Form (Window) und einer StartForm (Window) sein? Zitieren
HJST1979 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Hallo ich weiß nicht ob es bei c# anders ist aber bei VB.NET kann man bei den Projekteigenschaften mitteilen welches das Startformular ist, wenn hier eines eingetragen wird wird dies automatisch gestartet. Im umkehrschluss heißt es wird das Formular geschlossen wird automatisch die Applikation beendet. Oder denke ich jetzt falsch !? Gruß Hans-Jörg Zitieren
lbm1305 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Man kann über die Eigenschaften sagen, dass mehrere Forms-Projekte gestartet werden sollen. Dann sind aber alle offen. Dafür benötigt man aber mehrere WinForms-Projekte innerhalb einer Solution. Dann kann ich ein Fenster schließen ohne das andere Fenster zu zerstören. Zitieren
new Geschrieben 28. Juli 2010 Autor Geschrieben 28. Juli 2010 Hi! Vielen Dank schonmal. @Ibm1305 Also ist es nicht schlimm, wenn z.b die Form x unsichtbar offenlassen, denn nach einer zeit wird die geschlossen. Habe ich das so richitg verstanden ? ShowDialog() -> ok ich werde es mal testen thx. @Hans-Jörg Thx! so gehts auch! Habe es eben getestet und das Fenster wird geschlossen und trotzdem geht es weiter. Ich stelle auch ma kurz den Code rein: Form1: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void labyrinth_Click(object sender, EventArgs e) { switch (MessageBox.Show("Los gehts!", "Hura!", MessageBoxButtons.OKCancel)) { case DialogResult.OK: Form2 f2 = new Form2(); f2.Show(); this.Hide(); break; default: MessageBox.Show("Dann nicht!", "OK!"); break; } } } Form2: switch (MessageBox.Show("Jawoll!! next lvl ^^", "Hura!", MessageBoxButtons.OKCancel)) { case DialogResult.OK: Form3 f3 = new Form3(); f3.Show(); this.Close(); break; default: int a = 1; MovetoStart(a); break; } Form3: private void button1_Click(object sender, EventArgs e) { Form1 f1 = new Form1(); f1.Show(); this.Close(); } Habe Form2 und Form3 getestet und das nächste Fenster geht wie gewünscht auf und das alte Fenster wird gelöscht. Vielen Dank für eure Hilfe! Zitieren
HJST1979 Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 Kein Problem immer gerne ;-) Gruß Hans-Jörg Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.