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 { 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. :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!