Benutzer mit den meisten Antworten
Parameter an SplashScreen übergeben (Threading) ?

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
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
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
-
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