Entwickler-Ecke

WinForms - C# Anfängerfrage: Zweites Fenster modal öffnen und warten


virtualtom - Mo 08.11.10 01:30
Titel: C# Anfängerfrage: Zweites Fenster modal öffnen und warten
Hallo.

Zunächst bitte ich zm Entschuldigung, falls meine Frage(n) etwas trivial erscheinen; außerdem bin ich mir nicht sicher, ob dies die angebrachte Kategorie dafür ist. Das ist mein erstes Programm. :wink:

Ich öffne aus meinem Programm mit einem Linksklick auf ein NotifyIcon ein zweites Fenster:

C#-Quelltext
1:
2:
3:
4:
5:
6:
        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                FormMessage aFormMessage = new FormMessage();
                aFormMessage.ShowDialog(this);

Dieses zweite Form schließt sich nach einer Weile selbst. Bis dahin möchte ich im Hauptprogramm einfach warten, bis es geschlossen ist. Aber wie? Offensichtlich reagiert das NotifyIcon immer noch auf Linksklicks und präsentiert weitere Fenster...

C#-Quelltext
1:
2:
3:
4:
                while (aFormMessage.Visible == true) { Thread.Sleep(1); }
                aFormMessage.Dispose();
            }
        }


Wo liegt mein Denkfehler? Bin für jede Hilfe dankbar.


jaenicke - Mo 08.11.10 07:13

Das Icon benachrichtigt dein Programm über Windows Messages. Diese werden natürlich auch ausgeführt während du ein Fenster modal offen hast. Andernfalls würde dieses Fenster ja auch nicht mehr reagieren.

Deshalb musst du das selbst abfangen indem du nachschaust, ob das Fenster bereits offen ist (ob mit einer boolschen Variablen, die du beim Öffnen setzt und nach ShowDialog zurück, oder anders, ist ja egal).


virtualtom - Di 09.11.10 22:35

Super! Ich habe das jetzt so erschlagen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (aFormMessage.Visible != true)
                {
                    aFormMessage.ShowDialog(this);
                }
            }
        }


Dazu musste ich natürlich das FormMessage sichtbar machen und instanziieren. Deshalb habe ich im Hauptformular (Datei "Form1.Designer.cs") eine Zeile eingefügt:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
namespace MeinProgramm{
    partial class Form1
    {
        // Uninteressantes Zeugs gelöscht

        // Eigenene Member
        FormMessage aFormMessage = new FormMessage();
    }
}


War das korrekt? Oder war das No-No?


jaenicke - Di 09.11.10 22:53

Fast:

C#-Quelltext
1:
2:
                if (!aFormMessage.Visible)
                {
Einen boolschen Wert musst du nicht nochmal vergleichen.

Das kann auch ins Auge gehen, denn 0 heißt false, alles andere (1, 2, 3, ...) true. Und wenn du jetzt nur einen Wert für true vergleichst, hast du noch jede Menge andere, die du ignorierst.


VampireSilence - Mi 10.11.10 21:13

Form.Visible kann aber auch Zweierlei sein. Ich würde vorschlagen, du initialisierst die Instanz mit null und überprüfst dies dann entsprechend auf eine Zuweisung. Beim schließen musst du die Instanz natürlich wieder mit null überschreiben, damit keine falsch-positiven Ergebnisse erscheinen. Damit bist du definitiv auf der sichereren Seite.

mfg
- VampireSilence


virtualtom - Mo 15.11.10 19:33

Ganz prima! Ich denke daß ich jetzt begriffen habe, und danke recht herzlich für den Support. :)