Autor Beitrag
virtualtom
Hält's aus hier
Beiträge: 5

Windows 7 Ultimate x64
C# (VS 2005, VS 2008)
BeitragVerfasst: Mo 08.11.10 01:30 
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:
ausblenden 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...
ausblenden 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.

_________________
Bye! Tom
Es heisst, wenn man stirbt ziehen vor den Augen noch einmal alle Versionsnummern vorbei...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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).

Für diesen Beitrag haben gedankt: virtualtom
virtualtom Threadstarter
Hält's aus hier
Beiträge: 5

Windows 7 Ultimate x64
C# (VS 2005, VS 2008)
BeitragVerfasst: Di 09.11.10 22:35 
Super! Ich habe das jetzt so erschlagen:
ausblenden 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:
ausblenden 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?

_________________
Bye! Tom
Es heisst, wenn man stirbt ziehen vor den Augen noch einmal alle Versionsnummern vorbei...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 09.11.10 22:53 
Fast:
ausblenden 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.

Für diesen Beitrag haben gedankt: virtualtom
VampireSilence
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109
Erhaltene Danke: 5


C# (VS 2008 Express), PHP/MySQL, Windows XP
BeitragVerfasst: 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

Für diesen Beitrag haben gedankt: virtualtom
virtualtom Threadstarter
Hält's aus hier
Beiträge: 5

Windows 7 Ultimate x64
C# (VS 2005, VS 2008)
BeitragVerfasst: Mo 15.11.10 19:33 
Ganz prima! Ich denke daß ich jetzt begriffen habe, und danke recht herzlich für den Support. :)

_________________
Bye! Tom
Es heisst, wenn man stirbt ziehen vor den Augen noch einmal alle Versionsnummern vorbei...