1

パーサーにこのコードがあり、テキストを Form1 に渡して、ラベルなどを更新できるようにします。(私の構造は次のとおりです: Form1 -> Engine -> Parser) 2 つの文字列を渡す必要がある場合もあれば、それ以上の場合もあります。

Public Class Parser
Public Event NewInfo(<[ParamArray]()> Byval strArray() as String)

Public Sub SomeParser(ByVal m As Match)
Dim strArray() As String = {"Word1", "Word2"}
RaiseEvent NewInfo(strArray)
End Sub

End Class

次に、この別のクラスがあります。Array を Engine に渡し、その後 Form1 に渡します。

Public Class Engine
Private parent as Form1
Private WithEvents Parser As New Parser

Private Sub New(ByRef parent as Form1)
Me.parent = parent
EndSub

Private Sub ChangeLabel(ByVal str() As String) Handles Parser.NewInfo
parent.UpdateTextLabel(str)
End Sub

そして、私はForm1にこれを持っています:

Public Class Form1
Private WithEvents Engine as New Engine(Me)
Public Delegate Sub UpdateTextLabelDelegate(<[ParamArray]()> ByVal text() As String)
Public Sub UpdateTextLabel(ByVal ParamArray str() As String)
    If Me.InvokeRequired Then
      Me.Invoke(New UpdateTextLabelDelegate(AddressOf UpdateTextLabel), str())
    Else
(Do stuff here)
End Sub
End Class

コードは Me.invoke(New UpdateTextLabelDelegate).... 行で停止します。例外は次のようなものです: System.Reflection.TargetParameterCountException したがって、パラメーターの量が間違っているようなものです..これを正しく行う方法は?

誰かが説明して、これを行う方法を理解できれば、とてもうれしいです。

4

2 に答える 2

3

<[ParamArray]()>渡しているのはすでに配列であるため、コードに必要ないと思います:

Public Delegate Sub UpdateTextLabelDelegate(ByVal text() As String)

そして、呼び出しを介してデータを渡す限り、使用しないでくださいstr()str

Public Sub UpdateTextLabel(ByVal str() As String)
  If Me.InvokeRequired Then
    Me.Invoke(New UpdateTextLabelDelegate(AddressOf UpdateTextLabel), str)
  Else
    '(Do stuff here)
  End If
End Sub
于 2013-09-11T14:45:19.377 に答える
1

最終的にこの問題を解決することができました。そんなに難しくはありませんでしたが、私のミスは自分の頭の中の何かでした。

Parser.vb に変更を加えていないので、上記のコードは問題ありません。また、Engine.vb に変更はありません。Form1.vb への変更は次のとおりです。

Public Class Form1
Private WithEvents Engine as New Engine(Me)
Public Delegate Sub UpdateTextLabelDelegate(<[ParamArray]()> ByVal text() As String)
Public Sub UpdateTextLabel(ByVal str() As String)
    If Me.InvokeRequired Then
      Me.Invoke(New UpdateTextLabelDelegate(AddressOf UpdateTextLabel), New Object() {str})
    Else
'(Do stuff here)
End Sub
End Class

だから、私がしたことはNew Object() {args}、呼び出し行に挿入して - 行から削除ParamArrayすることPublic Sub UpdateTextLabelだけでした..しかし、私の頭を蹴ってくれてありがとう。:)

于 2013-09-12T08:58:57.017 に答える