[英]VB.NET Problem with “Control Arrays”
我有一個VB.NET應用程序,並使用了一些第三方(封閉源)ActiveX控件。 其中一個控件代表一個“攝像機”(通過多個接口連接),我嘗試編寫一個示例,說明如何在一個應用程序中使用多個攝像機。 為此,我將多個“相機”對象動態分配為一個數組,該數組按預期方式工作,如下所示:
Const NUM_CAMERAS = 2
Private MyCameras(NUM_CAMERAS ) As xxx.MCamera
但是需要為相機對象分配WithEvents
因為它們會在拍攝新圖像時引發事件。 我發現WithEvents變量無法鍵入為數組,這是一個非常普遍的問題,因此我也找到了一些解決方法: http : //www.dreamincode.net/code/snippet885.htm http://www.xtremevbtalk.com/存檔/ index.php的/叔223970.html
這已經很有幫助,我將其采納為我的概念。 因此,我有一個MyCameras數組和一個MyCamera所有“沒有事件”,首先分配一個新的MyCamera對象,添加一個事件處理程序,然后將其放入數組中。 不幸的是我打電話時遇到錯誤
AddHandler Camera.ProcessModifiedImage, AddressOf MyHook
通常,“ MyHook”被聲明為
Private Sub MyHook (ByVal sender As Object, ByVal ModifiedBuffer As xxx.ProcessModifiedImageEvent) Handles Camera.ProcessModifiedImage
就像在“按鈕示例”中一樣,我只是刪除了“ Handles Camera.ProcessModifiedImage”,但是我收到一個錯誤,即“ MyHook”的簽名與委托的簽名不同
Delegate Sub ICameraEvents_ProcessModifiedImageEventHandler(ImageIndex as Integer)
有誰知道如何解決這個問題以及要進行哪些更改? 如有必要,我明天可以發布更多代碼和詳細信息。
“ MyHook”事件處理程序需要與委托具有相同的簽名(即,以相同的順序接受相同的參數類型)。 由於所需的委托接受一個稱為ImageIndex的整數參數,因此可以將MyHook事件處理程序聲明為:
Private Sub MyHook(ImageIndex as Integer)
End Sub
跟隨Waves帖子的評論,您可以使用lambda表達式優雅地處理丟失的“ sender”參數:
Public Sub New()
InitializeComponent()
For camera As Integer = 1 To 4
Dim cam As Camera = DirectCast(Me.Controls("Camera" + camera.ToString), Camera)
AddHandler cam.ProcessModifiedImage, Function(index As Integer) ProcessImage(cam, index)
Next
End Sub
Private Function ProcessImage(ByVal cam As Camera, ByVal ImageIndex As Integer) As Integer
' Your code here
'...
Return 0
End Function
錯誤告訴您您需要什么-事件處理程序的簽名必須與他們指定的委托匹配(帶有一個ImageIndex參數的子例程)
所以你要
Private Sub MyHook(ImageIndex as Integer)
您可能已經看到所有事件處理程序都采用myhook格式(發送方為對象,e為XXEventArgs)
這是Microsoft用於其.NET事件的約定,但不是必需的。 您的第三方工具顯然不遵循該約定。 當消息告訴您委托人簽名必須是什么樣時,只需遵循該消息即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.