Zum Inhalt springen

C# Problem


new

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von new
xD
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...