Announcement

Collapse
No announcement yet.

Referenz auf Fenster verloren.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Referenz auf Fenster verloren.

    Hallo!

    Ich habe in meiner Anwendung zwei Fenster.
    Das zweite Fenster hat einen statische Funktion welche eine Referenz auf eine Instanz des Fensters beinhaltet.
    Diese Referenz ist in einer statischen Variable hinterlegt.
    Die Funktion sieht so aus:

    static Form2 myfrm;

    static public Form2 TheMyForm2()
    {
    if(myfrm == null)
    {
    myfrm = new Form2();
    }
    return myfrm;
    }

    Die aufrufende Funktion sieht dann so aus:

    private void button1_Click(object sender, System.EventArgs e)
    {
    Form2 frm = Form2.TheMyForm2();
    frm.Show();
    }

    Wird der Button betätigt, so wird das Fenster geöffnet. Wird das Fenster dann geschlossen wird das Fenster trot Referenz von .net freigegeben.
    Was muß ich statt myfrm == null prüfen, damit eine gültige Referenz übergeben werden kann?

    Vielen Dank für jeden Hinweis.

    Danke Thomas

  • #2
    Hallo Thomas,

    das Probem wird sein, dass wen das Form geschlossen wird, dass es automatisch wieder freigegeben wird.

    Versuche mal in den Event "FormClosing" folgenden Code einzufügen:

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
    this.Visible = false;
    e.Cancel = true;
    }

    jetzt wird beim schließen das Form nur als nicht Sichtbar makiert aber nicht mehr zerstört.

    Hoffe es funktioniert.

    gru&#223

    Comment


    • #3
      Hallo!

      Danke für die Antwort. Ja, so ist das möglich.

      Ich habe jedoch etwas anderes programmiert. Ich prüfe ob
      frm.IsDisposed=true ist. Hiermit greife ich eigentlich auf ein schon zerstörtes Objekt zu. Geht abet trotzdem. Warum ??????

      Somit sieht die Procedure so aus:

      static public Form2 TheMyForm2()
      {
      if((myfrm == null) || (myfrm.IsDisposed))
      {
      myfrm = new Form2();
      }
      return myfrm;
      }

      Ob das OK ist?

      mfg
      Thoma

      Comment


      • #4
        Hallo!

        Ich hatte die Tage ein ähnliches Problem. Ich weiss nicht, ob ich genau verstanden habe, was Dein Problem ist. Du willst doch eigentlich nur, dass das Formular beim Schliessen komplett entladen wird und beim nächsten Laden wieder eine neue Instanz bildet, oder?
        Dazu musst Du einfach einen Destruktor in Deine Klasse einfügen, der sie komplett entlädt und die Instanz-Variable zurücksetzt.

        ~Form2()
        {
        this.Dispose(true);
        myfrm = null;
        }

        Probier's einfach mal aus.

        Gruß,
        Tobias Witt

        Comment


        • #5
          Hallo!

          Ja. Was mich störte war, dass die Variable myfrm nicht null war, obwohl das Fenster eigentlich freigegeben war. Zudem wundert es mich das ich trotzdem noch myfrm.IsDisposed aufrufen kann obwohl das Fenster zerstört ist.

          Ich bin gerade in die Entwicklung von Anwendungen mit .NET eingestiegen und stamme aus dem Delphi-Lager. Hier war die Lösung etwas einfacher. Die ganzen Zusammenhänge von Destruktor und gc sind mir noch etwas fremd.

          Danke für die Unterstützung. Ich werde das mal probieren.

          mfg
          Thoma

          Comment

          Working...
          X