2016-07-08 16 views
0

私はvb.netを初めて使い、vb.netでwin CEアプリを構築しようとしています。ハンドヘルドデバイスのSDKはC#にあり、これをオンラインコンバータでvb.netに変換しました。以下 は、C#のコードです:vb.netのデリゲートを使用

としてvb.netに変換
public class DecodeEventArgs : EventArgs 
{ 
    private string barcode; 
    private byte type; 

    public DecodeEventArgs(string barcodeData, byte typeData) 
    { 
     barcode = barcodeData; 
     type = typeData; 
    } 

    public string Barcode 
    { 
     get { return barcode; } 
     set { barcode = value; } 
    } 

    public byte Type 
    { 
     get { return type; } 
     set { type = value; } 
    } 

} 

:C#のから

私の変換で
Public Class DecodeEventArgs 
    Inherits EventArgs 
    Public barcode As String 
    Public type As Byte 

    Public Sub New(ByVal barcodeData As String, ByVal typeData As Byte) 
     barcode = barcodeData 
     type = typeData 
    End Sub 

    Public Property pBarcode() As String 
     Get 
      Return barcode 
     End Get 
     Set(ByVal value As String) 
      barcode = value 
     End Set 
    End Property 

    Public Property pType() As Byte 
     Get 
      Return type 
     End Get 
     Set(ByVal value As Byte) 
      type = value 
     End Set 
    End Property 
End Class 

あなたが私に見るように、私は、プロパティの名前に「P」を追加しましたvb.netコードIは

バーコードがすでにこのクラスのパブリック文字列として宣言されていると、エラーがあったので

それは私の問題の一部である場合、私はよく分からないが、私の本当の問題は、彼らがこのコードでクラスを呼び出すために.BeginInvokeを使用し、フォームに、次のとおりです。私はvb.netに変換

void scanner_DecodeEvent(object sender, DecodeEventArgs e) 
    { 
     Win32.sndPlaySound(Properties.Resources.Scan, Win32.SND_ASYNC | Win32.SND_MEMORY); 

     this.BeginInvoke((Action<string>)delegate(string barcode) 
     { 
      scanCount = 0; 
      ListViewItem item = new ListViewItem(new string[] { barcode }); 
      lstView.Items.Insert(0, item); 

     }, e.Barcode); 
    } 

次のように:

Private Sub scanner_DecodeEvent(ByVal sender As Object, ByVal e As DecodeEventArgs) 
    PlaySound() 

    Me.BeginInvoke(DirectCast(Barcode As String)) 
    scanCount = 0 
    Dim item As New ListViewItem(New String() {barcode}) 

    lstView.Items.Insert(0, item) 


End Sub 

これは、バーコードが宣言されていないというエラーです。これは私が立ち往生している場所です。事前に助けてくれてありがとう

答えて

0

C#スニペットは、UIスレッドでアクションを実行するために呼び出す匿名メソッドを作成し、パラメータとしてe.Barcodeを送信します。あなたのVB.NET変換は、DirectCastのいくつかの不思議で不完全な使用を呼び出すよう試みます。代理メソッドにキャストしなければならないdelegateキーワードがないため、DirectCastはVB.NET変換には必要ありません。

あなたの最も簡単な解決策は、ラムダメソッドを使用することです:

Me.BeginInvoke(Sub() 'Lambda anonymous method. 
    scanCount = 0 
    Dim item As New ListViewItem(New String() {e.Barcode}) 
    lstView.Items.Insert(0, item) 
End Sub) 

EDIT:ラムダ式を使用しているときにエラーが発生しますので

は、私はあなたが.NET Frameworkを対象と仮定3.5以下である。

Private Sub AddBarcode(ByVal Barcode As String) 
    scanCount = 0 
    Dim item As New ListViewItem(New String() {Barcode}) 
    lstView.Items.Insert(0, item) 
End Sub 

次に、あなたが呼び出しを実行するために使用することができ、独自のデリゲートメソッドを宣言する必要があります:

Delegate Sub AddBarcodeDelegate(ByVal Barcode As String) 

Private Sub scanner_DecodeEvent(ByVal sender As Object, ByVal e As DecodeEventArgs) 
    Me.BeginInvoke(New AddBarcodeDelegate(AddressOf AddBarcode), e.Barcode) 
End Sub 
言えば、それはあなたが今、別の方法でコードを入れなければならないとして、もう少し複雑になります
+0

ありがとう@Visual Vincent。もっときれいに見えますが、Sub()の下に「Expression Expected」と書かれています。また、 "End Sub"の後ろにも ")"を付けました。 –

+0

@ PercyKumah:どの.NET Frameworkバージョンをターゲットにしていますか?また、自分の投稿で誰かを "@"する必要はありません。 :) –

+0

'End Sub'の後の括弧は、' Me.BeginInvoke'を閉じるのでそこになければなりません。 –

関連する問題