none
Parameter an SplashScreen übergeben (Threading) ? RRS feed

  • Frage

  • Guten Tag,

    ich versuche mich gerade an Delegates und trete nun leider auf der Stelle.

    Ich möchte auf einem SplashScreen ein Label mittels Parameter updaten (bzw. den Text des Labels als Parameter übergeben)

    Bisheriger Code im frmSplash:

      Delegate Sub updateStatusLabel(ByVal pMessage As String)
    
        Public Sub updateLabelText(ByVal pMessage As String)
            ulblMessage.Text = pMessage
        End Sub
    

    Und im frmMain:

    If My.Application.SplashScreen.Visible = True Then
     Dim myDelegate = New frmSplash.updateStatusLabel(AddressOf frmSplash.updateLabelText)
     Dim aResult As IAsyncResult = My.Application.SplashScreen.BeginInvoke(myDelegate)
    
     loadForm()
    
     Dim callResult As Integer = 0
     callResult = My.Application.SplashScreen.EndInvoke(aResult)
                        If callResult <> 0 Then 'Fehler
                          'Fehlerbehandlung
                        End If
    End If
    


    Möchte ich nun jedoch per:

    myDelegate.Invoke einen Parameter übergeben, bekomm ich eine Exception 'Parameter count mismatch' - Ein Versuch, die Parameter per Object-Array zu übergeben, lieferte das gleiche Ergebnis.

    Wie bekomme ich den Parameter übergeben ?

    Vielen Dank 

    Freitag, 25. November 2011 10:37

Antworten

  • Hallo Robert Breitenhofer,

    dieses How-To hatte ich auch verwendet.

    Nun ist es dort so, dass nur beim BeginInvoke ein Parameter übergeben wird - Wie sieht es jedoch aus, wenn ich zwischendrin den Parameter mit einem anderen Wert übergeben möchte ?

    Zur Veranschaulichung, der angepasste Code (beispielhaft):

    Public Class Form1
    
     
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            If My.Application.SplashScreen.Visible = True Then
    
                Dim aResult As IAsyncResult = My.Application.SplashScreen.BeginInvoke(New SplashScreen1.SetMessageCallback(AddressOf SplashScreen1.updateStatusLabel), New Object() {"Mein String Parameter wird angezeigt"})
    
                     '2ter Parameterwert:
                     myDelegate.Invoke("TEST")
     
    
                Dim callResult As Integer = 0
    
                callResult = My.Application.SplashScreen.EndInvoke(aResult)
    
                If callResult <> 0 Then '//Fehler
    
                    '//Fehlerbehandlung
    
                End If
    
            End If
    
        End Sub
    
    End Class
    
    
    

     

     Edit:

    Ich hab es hinbekommen.

    Der Aufruf lautet:

     My.Application.SplashScreen.Invoke(myDelegate, New Object() {"Mein Text"})


     


    • Als Antwort markiert Ralf Stiegele Freitag, 25. November 2011 14:25
    • Bearbeitet Ralf Stiegele Freitag, 25. November 2011 14:26 Lösung selber gefunden
    Freitag, 25. November 2011 14:18

Alle Antworten

  • Hallo Ralf Stiegele,

    Dein Delegate wartet ein Parameter aber Du gibst im keinen…deshalb …“Parameter count mismatch“

    Schau Dir mal folgenden Code an:

    [SplashScreen1.vb]

    Delegate Sub SetMessageCallback(text As String)

     

        Public Sub updateStatusLabel(text As String)

                Me.lblStatus.Text = text

        End Sub

     

     

    [Form1.vb]

    Public Class Form1

     

        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

            If My.Application.SplashScreen.Visible = True Then

                Dim aResult As IAsyncResult = My.Application.SplashScreen.BeginInvoke(New SplashScreen1.SetMessageCallback(AddressOf SplashScreen1.updateStatusLabel), New Object() {"Mein String Parameter wird angezeigt"})

     

                Dim callResult As Integer = 0

                callResult = My.Application.SplashScreen.EndInvoke(aResult)

                If callResult <> 0 Then '//Fehler

                    '//Fehlerbehandlung

                End If

            End If

        End Sub

    End Class

     

     

    Zum lesen: How to: Specify a Splash Screen for an Application (Visual Basic)

    Grüße,

    Robert

    Freitag, 25. November 2011 13:10
    Moderator
  • Hallo Robert Breitenhofer,

    dieses How-To hatte ich auch verwendet.

    Nun ist es dort so, dass nur beim BeginInvoke ein Parameter übergeben wird - Wie sieht es jedoch aus, wenn ich zwischendrin den Parameter mit einem anderen Wert übergeben möchte ?

    Zur Veranschaulichung, der angepasste Code (beispielhaft):

    Public Class Form1
    
     
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            If My.Application.SplashScreen.Visible = True Then
    
                Dim aResult As IAsyncResult = My.Application.SplashScreen.BeginInvoke(New SplashScreen1.SetMessageCallback(AddressOf SplashScreen1.updateStatusLabel), New Object() {"Mein String Parameter wird angezeigt"})
    
                     '2ter Parameterwert:
                     myDelegate.Invoke("TEST")
     
    
                Dim callResult As Integer = 0
    
                callResult = My.Application.SplashScreen.EndInvoke(aResult)
    
                If callResult <> 0 Then '//Fehler
    
                    '//Fehlerbehandlung
    
                End If
    
            End If
    
        End Sub
    
    End Class
    
    
    

     

     Edit:

    Ich hab es hinbekommen.

    Der Aufruf lautet:

     My.Application.SplashScreen.Invoke(myDelegate, New Object() {"Mein Text"})


     


    • Als Antwort markiert Ralf Stiegele Freitag, 25. November 2011 14:25
    • Bearbeitet Ralf Stiegele Freitag, 25. November 2011 14:26 Lösung selber gefunden
    Freitag, 25. November 2011 14:18