ShowDialog() Aufruf mal modal mal nicht

NewComerVB

Grünschnabel
Hallo Forum,

ich habe ein problem mit dem Aufruf "ShowDialog()". Dieser Aufruf soll eine DialogForm modal aufrufen.

Private Sub btnCh7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCh7.Click

objMaster.PushButton(7)
dlgMenu1.ShowDialog()

End Sub

Bei diesem Aufruf funktioniert er super. Ich habe in der selben Class folgende Sub:

Private Sub objMaster_OpenMenu(ByVal MenuName As String) Handles objMaster.OpenMenu
Select Case MenuName
Case "Menu 1"
dlgMenu1.ShowDialog()

Case "Menu 2"
'dlgMenu2.ShowDialog()

Case "Menu 2"
'dlgMenu2.ShowDialog()

End Select
End Sub

hier ruft die Funktion zwar die DialogForm auf, aber sie ist nicht mehr modal auch reagiert das Programm ganz anders. Funktionen die in diesem Dialog programmiert sind laufen nicht mehr.
Was ist hier falsch:confused: Das einzige was hier anders ist, ist der Aufrufort. Oder übersehe ich etwas?

Vielen Dank für Eure Hilfe im voraus
 
Hallo,

gehören die beiden Controls btnCh7 und objMaster zum gleichen Form?
Ist es möglich, dass die Methode dlgMenu1.ShowDialog() in den beiden Fällen aus unterschiedlichen Threads aufgerufen werden?

Gruß Steffen
 
Hallo Steffen,

objMaster ist in derselben Form wie der Button definiert worden.
Definition von objMaster ist:

Public WithEvents objMaster As New PC_Panel_Musterstation.ClassMasterController

Ich habe keine Ahnung warum der Aufruf, obwohl in der selben Form nur an anderer Stelle, ein ganz anderes verhalten zeigt.

Einmal wird der Aufruf vom Button getriggert und beim anderen mal über eine String-Auswertung.

Gruß
Andreas
 
Hallo Spyke,

ich habe es versucht, mit dem owner ("dlgMenu1.ShowDialog(Me.Owner)"). Geht leider auch nicht. Das Programm reagiert gleich. Vieleicht ist auch mein Aufruf falsch.:confused:
Wenn ich als owner nur "me" ("dlgMenu1.ShowDialog(Me)") eingebe, wird die Form vorsichtshalber gar nicht geöffnet.

Gruß
Andreas
 
Zuletzt bearbeitet:
Hallo Andreas,

Wenn ich als owner nur "me" ("dlgMenu1.ShowDialog(Me)") eingebe, wird die Form vorsichtshalber gar nicht geöffnet.

Das macht mich einigermassen stutzig :suspekt:
Das Form wird einfach nur nicht angezeigt?
Das Programm wirft keine Exception? Oder hast du die schon irgendwie abgefangen?

Irgendwie werd ich aus der ganzen Sache nicht schlau! Ich glaube da fehlen noch ein paar zusammenhänge aus deinem Projekt.:confused:
Aus welchem Form wird der Dialog aufgerufen?
Wie und wo ist dieses Form deklariert?
Wie und wo ist der Dialog deklariert?
An welchen Stellen des Forms erfolgt der Aufruf zum Anzeigen des Dialogs (ShowDialog())?

Vielleicht kannst du mal etwas mehr Code hier reinstellen, dass man die Zusammenhänge erkennt. Dann wird vielleicht einiges klarer.

Gruß Steffen
 
Hallo Steffen,

dies ist der Code der Form:

Code:
Imports System.Windows.Forms
Imports PC_Panel_Musterstation.ClassMasterController

Public Class fmMain
    Public WithEvents objMaster As New PC_Panel_Musterstation.ClassMasterController

    Private WithEvents MsgTimeout_Timer As New Windows.Forms.Timer

    Private WithEvents dlgMenu1 As DialogMenu1 = New DialogMenu1
    Private WithEvents dlgMenu2 As DialogMenu2 = New DialogMenu2
    Private WithEvents dlgMenu3 As DialogMenu3 = New DialogMenu3
    
    Public TXTList(195) As String

    Private Sub tsmItem_Connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsmItem_Connect.Click
                 My.Forms.DialogMasterConnection.ShowDialog()
    End Sub

    Private Sub OnBlink_Master(ByVal State As Boolean) Handles objMaster.On_Blink
           If State = True Then
                 Me.tssMasterConnection.Image = My.Resources.g_LED_B_on
           Else
                 Me.tssMasterConnection.Image = My.Resources.g_LED_B_off
           End If
    End Sub

    Private Sub GetMessage(ByVal Msg As String) Handles objMaster.Message
              Me.tssMsg.Text = Msg

              Me.MsgTimeout_Timer.Start()
    End Sub

    Private Sub MsgTimeout(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MsgTimeout_Timer.Tick
             Me.tssMsg.Text = ""

             Me.MsgTimeout_Timer.Stop()
    End Sub

    Private Sub GetStateMessage(ByVal Msg As String) Handles objMaster.StateMessage
             Me.tssStateMsg.Text = Msg
    End Sub

    Private Sub fmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
             Me.MsgTimeout_Timer.Interval = 2000
    End Sub

    '---- Button's Main Page Tab1
    Private Sub btnCh1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCh1.Click
             objMaster.PushButton(1)
    End Sub
   
 Private Sub btnCh2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCh2.Click
             objMaster.PushButton(2)
    End Sub
 
   Private Sub btnCh7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCh7.Click
             objMaster.PushButton(7)
             'dlgMenu1.ShowDialog()    ' dieser Aufruf Funktioniert
        End Sub

    Private Sub btnCh8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCh8.Click
             objMaster.PushButton(8)
    End Sub

    Private Sub btnCh9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCh9.Click
             objMaster.PushButton(9)
    End Sub
    
       Private Sub objMaster_OpenMenu(ByVal Menu As String) Handles objMaster.OpenMenu
             openDlg(Menu)
    End Sub

    Public Sub objMaster_CloseMenu(ByVal MenuName As String) Handles objMaster.CloseMenu
             Select Case MenuName
                      Case "Menu 1"
                                 Me.dlgMenu1.CloseDialog()

                      Case "Menu 2"
                                 Me.dlgMenu2.CloseDialog()

                       Case "Menu 3"
                                 Me.dlgMenu3.CloseDialog()

             End Select
    End Sub

    Private Sub objMaster_SendTXT(ByVal FieldNr As Integer, ByVal Txt As String) Handles objMaster.SendTXT
             TXTList(FieldNr) = Txt
    End Sub

    Private Sub openDlg(ByVal name As String)
             Select Case name
                      Case "Menu 1"
                               dlgMenu1.ShowDialog() ' dies ist der Aufruf wie sein soll, aber nicht t

                      Case "Menu 2"
                              dlgMenu2.ShowDialog()

                      Case "Menu 3"
                              dlgMenu3.ShowDialog()

                       Case "NotOnlineMSG"
                              MsgBox(TXTList(1) & Chr(13) & "Systm is offline!" & Chr(13) & _
                                              "Check network or local controller.", MsgBoxStyle.Information)

              End Select
    End Sub

End Class

Ich hoffe das, dass zur Klärung beiträgt. Ich bin echt ratlos.

Gruß Andreas
 
Zuletzt bearbeitet:
Hallo Andreas,

folgendes ist mir aufgefallen, was womöglich eine Ursache sein könnte:

Der erste Aufruf:

Code:
   Private Sub btnCh7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCh7.Click
             objMaster.PushButton(7)
            dlgMenu1.ShowDialog()    ' dieser Aufruf Funktioniert
        End Sub

behandelt ein Ereignis (Button.Click), das aus deinem Hauptfenster fmMain kommt, was an dieser Stelle gleichzeitig 'Me' ist.

Der zweite Aufruf:

Code:
       Private Sub objMaster_OpenMenu(ByVal Menu As String) Handles objMaster.OpenMenu
             openDlg(Menu)
    End Sub

...

    Private Sub openDlg(ByVal name As String)
             Select Case name
                      Case "Menu 1"
                              dlgMenu1.ShowDialog() ' dies ist der Aufruf wie sein soll, aber nicht t

                      Case "Menu 2"
                              dlgMenu2.ShowDialog()

                      Case "Menu 3"
                              dlgMenu3.ShowDialog()

                       Case "NotOnlineMSG"
                              MsgBox(TXTList(1) & Chr(13) & "Systm is offline!" & Chr(13) & _
                                              "Check network or local controller.", MsgBoxStyle.Information)
		End Select

... behandelt ein Ereignis, das vom Object objMaster kommt.
Nun weiss ich leider nicht, wie genau die Klasse ClassMasterControl aussieht. Ist das auch ein Form oder was sonst?
Jedenfalls scheint es mir wahrscheinlich, daß hier ein anderer Thread ShowDialog() aufruft, was dazu führt, dass das Form nicht mehr modal zu 'Me' geöffnet wird. In dem Fall sollte der gleiche Effekt für die Aufrufe von dlgMenu2 und dlgMenu3 auftreten.

Ich hoffe, das hilfz schon mal als Denkanstoss. Ansonsten bin ich für weitere Fragen gern offen.

Gruss Steffen
 
Ich danke Euch für Eure Hilfe.
Ihr habt mir sehr weiter geholfen :).

Ich habe die eine Class aufgehoben und die Funktionen direkt
in die Form eingebunden und nun gehts.

Es waren also wohl zwei unterschiedliche Threads.


Gruß Andreas
 

Neue Beiträge

Zurück