Announcement

Collapse
No announcement yet.

Messagebox immer im Vordergrund

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

  • Messagebox immer im Vordergrund

    Hallo an alle,

    ich verwende die Klasse Messagebox, um dem Benutzer wichtige Informationen anzuzeigen. Jetzt ist mir aufgefallen, dass manchmal die Messagebox angezeigt wird und im Vordergrund bleibt(heisst man kann auch kein anderes Steuerelement klicken, bis der OK Button gedrückt wurde). Das ist auch gut so und genauso soll es eigentlich auch immer sein! Aber manche Aufrufe von Messagebox.Show laufen anderst ab. Messagebox erscheint, man kann aber auf andedere Steuerelemente zugreifen. Wie kann das sein!? Ich habe auch schon versucht, mit dem "OWNER" Parameter die Messagebox explizit einem Form zuzuweisen, aber ohne Erfolg!

    Wäre ganz wichtig für mich, dass die Messagebox IMMER im Vordergrund bleibt und dass man erst NACH Bestätigung von OK wieder aktiv auf die Steuerelemente der anderen Forms zugreifen kann!!!!

    Danke im Vorraus...

    bin ratos!!!

  • #2
    Ruft du die MessageBox evtl. in diesem Fall von einem Thread auf?

    Comment


    • #3
      richtig, ich rufe die Messagebox in dem besagtem Fall nicht von einem Formular über z.B ein Button auf, sondern einer Klasse(ein TCP Empfangshandler) welcher in unterschiedlichen Threads läuft.

      Dass wird wohl der unterschied sein...Danke.

      Aber wie mache ich jetzt den Aufruf der Messagebox aus dem fremden Thread, so dass ich das gewünschte Ergebnis bekomme!?

      es tritt ja keine Thread Exception auf, die ich sonst mit Invoke behandle!???

      Comment


      • #4
        Du behandelst keine ThreadException mit Invoke! Invoke ruft das übergebene delegate immer im Kontext des aktuellen Threads auf, deswegen kommt dann auch keine ThreadException. Aus einem Thread heraus eine MessageBox aufzurufen halte ich für falsch, da dann ein Thread für die UI zuständig wäre. Ich wage zu behaupten dass man das nicht tun sollte.

        Comment


        • #5
          Danke für den Hinweis...

          brauche aber trotzdem ne Lösung. Ich reagiere ja auf ein bestimmtes Ereignes aus einem fremden Thread aus. Die Messagebox muss dann erscheinen wie gefordert!

          Comment


          • #6
            Dann lass doch den Thread einfach ein Ereignis verwerfen (z.B. ein delegate mitgeben). Die UI aboniert sich darauf und kann dann im eigenen Thread einen MessageBox aufmachen.

            In etwa so:

            [highlight=c#]
            public void MyDoingFunction(Action<String> messageCallBack)
            {
            // mach was

            // hier tritt eine Meldung auf
            messageCallBack(message);
            }

            //irgendwo in der Form
            private void ShowMessage(String message)
            {
            this.Invoke(delegate() { MessageBox.Show(message); });
            }

            public void MyThreadFunction()
            {
            ThreadStart job = new ThreadStart(ThreadJob);
            Thread thread = new Thread(delegate() { MyDoingFunction(ShowMessage); });
            thread.Start()
            }
            [/highlight]

            So in der Art. Ich hoffe Du verstehst die Idee. Bitte entschuldigen wenns nicht zu 1000% richtig ist. Ich habs einfach runter getippt ohne es zu kompilieren.
            Zuletzt editiert von fanderlf; 22.06.2011, 14:32.

            Comment


            • #7
              vielen Dank erst mal fanderlf.....

              ich tue mir schon ein wenig schwer damit, da ich nur vb programmiere und auch erst seit einem Jahr! Wie ich mit einzelnen Parametern eines Steuerelements mit einem threadübergreifendem Vorgang umgehe ist mir mittlerweile klar! z.B ein Steuerelement disablen tue ich so:

              Code:
              Private Sub changeStatusEnableStatus(ByVal mStatus As Boolean, ByVal mlbInvoke As Control)
              
                      If mlbInvoke.InvokeRequired Then
                        
                          Dim MyDelegate As New delChangeEnableStatus(AddressOf changeStatusEnableStatus)
                     
                          mlbInvoke.Invoke(MyDelegate, mStatus, mlbInvoke)
                      Else
                          mlbInvoke.Enabled = mStatus
                      End If
              End Sub
              Aber wie mache ich das mit der Klasse MessageBox?

              Comment


              • #8
                Gib dem Ding einfach ein delegate mit was aufgerufen wird wenn Du eine Nachricht ausgibst, dann ist das Teil komplett unabhängig von Windows Forms. Ich bin leider auch kein VB.NET Spezialist.
                Vielleicht bekommst Du es hiermit hin:
                http://de.wikipedia.org/wiki/Delegat_(.NET)

                Comment

                Working...
                X