Laden...

Schließen eines Forms, ohne die komplette Anwendung zu schließen [war: Form- und Codehandling]

Letzter Beitrag vor 19 Jahren 4 Posts 7.573 Views
Schließen eines Forms, ohne die komplette Anwendung zu schließen [war: Form- und Codehandling]

Hallo,

das Problem was ich habe, wurde in dem unten stehenden Thema auch schon aufgeführt, nur leider sind bei mir Folgeprobleme aufgetreten, die ich mir nicht erkklären kann und einfach nich weiß, wie ich diese lösen soll.

Hier der Link:
mainform this.Hide(); ?????

Info:
Ich habe eine Klasse namens Settings, in der eine Funktion, die Programmeinstellungen aus einer XML-Datei ließt - das funktioniert. Das laden soll aber verdeckt werden, deshalb habe ich einen SplashScreen gebaut.

Bisheriger Stand:

  • Form1.cs (Hauptform)
  • SplashScreen.cs (SplashScreenForm)
  • Settings.cs (Klasse)

Ablauf (Variante 1)::
In der Form1 war bisher immer der Aufruf der Klassenfunktion:
MySettings = Settings.LoadSettingsFromFile();
Damit die Klasse bekannt ist, habe ich vorher eine Instanz erstellt.
Aus dem obigen Link habe ich dann entnommen, dass ich in meiner Form1

Application.Run();

schreiben muss, damit diese Form erstmal nicht sichbar ist.

Problem (Variante 1):
Vor das Application.Run(); habe ich dann geschrieben

SplashScreen Splash = new SplashScreen();
Splash.Show();

Sie da, der SplashScreen ist da und die Mainform nicht. So jetzt muss ich aber zb. noch machen

this.propertyGrid1.SelectedObject = MySettings;

und da ist das Problem. Er kann weder auf this noch auf das propertyGrid Objekt zugreifen (ist mir auch klar warum), nur ich muss ja diese Zuweisung machen und noch andren Code ausführen, aber was muss ich da tun bzw. wohin muss dieser?

Aufgrund dieses Umstandes dachte ich mir, komm trickste das Ding aus...

Ablauf (Variante 2):
Nun habe ich die Formen vertauscht.
Die Mainform ist jetzt der Splash und die Form1 ist die zweite Form.
Ich mache also jetzt ganz normal (Splash anzeigen)

Application.Run(new Form1());

und starte dann die Instanz der Klasse mache

MySettings = Settings.LoadSettingsFromFile();

mach dann

this.Visible = false;
Form Main = new Form2();

So wenn ich aber jetzt sagen will

propertyGrid1.SelectedObject = MySettings;

geht das nicht, weil ja das Objekt propertyGrid in der andren Form ist und ich darauf keine Zugriff habe.

Nun gut ich denke mal meine Erklärung ist ziemlich verwirrend und versuche euch das bei Umstimmigkeiten noch weiter zu erklären.

Prinzipiell geht es bei Variante 1 nur darum, dass ich Probleme damit habe, wohin mit dem Code bzuw. zur Handhabung und bei Variante 2 das Problem mit den Objekten die sich auf einer andren Form befinden.

ok zur Variante 2:

Habe nun den Modifier gefunden und auf public gestellt. Objekt ist verfügbar in der SplashForm. Habe gemerkt, dass ich, wenn ich die 2te Form schließe, das Programm immer noch offen ist. Klar, weil ich nur die Mainform versteckt habe und diese geschlossen werden muss. D.h. ich muss in der Form2 Application.Exit(); machen. Funzt auch. Hm.. Frage mich nur, ob das ne saubere Variante ist...

Hallo -acid-,

ich weiß nicht, ob das hilft, bin mir noch nicht mal sicher, ob es genau auf Deine Frage passt, aber:

Beim Erstellen einer Anwendung muss man sich entscheiden, ob diese ein Hauptfenster haben soll oder ob alle Fenster gleichberechtigt existieren sollen. Ich habe mal ein kleines Programm angefügt, das zeigt, wie das geht. Je nachdem, ob SW_MAINWINDOW definiert ist oder nicht, wird das Programm mit Hauptfenster oder eben mit gleichberechtigten Fenstern übersetzt.

Der springende Punkt ist, dass die Nachrichtenverarbeitung des Programms (Main-Loop oder auch Application.Run) und das Vorhandensein von Fenstern erstmal unabhängig ist. Es kann also eine Main-Loop ohne Fenster geben (und andersherum).

Wenn das letzte Fenster geschlossen ist, aber die Main-Loop noch existiert, wird das Programm noch nicht beendet. Deshalb musst man auch in der !SW_MAINWINDOW-Variante die Main-Loop selbst mit Application.Exit beenden.

Wenn dagegen bei Application.Run ein Form-Objekt mitgegeben wird, macht Windows dieses zum Hauptfenster und ruft beim Schließen dieses Fenster Application.Exit automatisch auf. Dadurch werden auch alles anderen Fenster geschlossen und die Main-Loop beendet.


using System;
using System.Windows.Forms;
using System.Drawing;

//****************************************************************
public class MyWindow : Form
{
   //-------------------------------------------------------------
   static int iId    = 1;
   #if !SW_MAINWINDOW
      static int iCount = 0;
   #endif

   //=============================================================
   public MyWindow ()
   {
      Control ctrlCurr;


      //----------------------------------------------------------
      #if !SW_MAINWINDOW
         ++iCount;
      #endif
      Text = "Window " + iId++;
      Size = new Size (220 + Size.Width - ClientSize.Width,
                        70 + Size.Height - ClientSize.Height);

      //----------------------------------------------------------
      ctrlCurr = new Button ();
      ctrlCurr.Location = new Point (10,10);
      ctrlCurr.Size = new Size (200, 50);
      ctrlCurr.Text = "New Window";
      ctrlCurr.Click += new EventHandler (ButtonClick);
      Controls.Add (ctrlCurr);

      //----------------------------------------------------------
      #if !SW_MAINWINDOW
         Disposed += new EventHandler (MyWindowDisposed);
         Show ();
      #endif
   }

   //=============================================================
   protected void ButtonClick (Object sender, EventArgs e)
   {
      MyWindow myw = new MyWindow ();
   }

   //=============================================================
   #if !SW_MAINWINDOW
      protected void MyWindowDisposed (Object sender, EventArgs e)
      {
         if (--iCount <= 0) {
            Application.Exit ();
         }
      }
   #endif
}

//****************************************************************
abstract class App
{
   //=============================================================
   public static int Main (string [] astrArg)
   {
      #if !SW_MAINWINDOW
         new MyWindow ();
         Application.Run ();
      #else
         Application.Run (new MyWindow ());
      #endif

      return 0;
   }
}

HTH

herbivore

Suchhilfe: 1000 Worte

@herbivore: ich denke, dass werde ich mir mal zu gemüte führen.

danke erstmal für deine hilfe. vorerst werde ich wohl mal variante 2 nehmen mit des es bisher klappt.