【问题标题】:VB.NET Problem with "Control Arrays"“控制数组”的 VB.NET 问题
【发布时间】:2010-10-02 06:36:00
【问题描述】:

我有一个 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/archive/index.php/t-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)

有没有人知道如何解决这个问题以及改变什么?如有必要,我可以在明天发布更多代码和详细信息。

【问题讨论】:

  • 只是一个小问题,但您的 MyCameras 数组最终会按照您的编码方式包含 3 个元素。
  • 是的,我知道这没关系。相机的最大数量是预先知道的,我只是想避免分配 MyCamera1、MyCamera2 等。

标签: .net vb.net arrays


【解决方案1】:

“MyHook”事件处理程序需要与委托具有相同的签名(即以相同的顺序接受相同的参数类型)。由于所需的委托接受一个名为 ImageIndex 的整数参数,您可以将 MyHook 事件处理程序声明为:


Private Sub MyHook(ImageIndex as Integer)

End Sub

【讨论】:

  • 如果有多个摄像头,那么他将如何确定是哪个摄像头引发了事件?
  • 从原始帖子中我不清楚这是必要的。是否需要知道哪个相机正在调用钩子?从发布的代码中,一个处理程序被添加到一个通用的“相机”对象中。如果您需要知道正在调用哪个摄像头,那么您将需要一个单独的处理程序...
  • ...(续)您的 MyCamera() 数组中的每个“相机对象”。 AddHandler MyCamera(0), AddressOf MyHook0; AddHandler MyCamera(1), AddressOf MyHook1;等等..等等..
  • 当然,没有看到实际的第三方ActiveX控件的类/接口,我只能推测和提供一般性建议。
  • 我编辑了原始帖子,处理程序未添加到通用对象中,我需要知道哪个相机引发了它。
【解决方案2】:

错误告诉你你需要什么——你的事件处理程序的签名必须匹配他们指定的委托(一个带有一个 ImageIndex 参数的子例程)

所以你想要

Private Sub MyHook(ImageIndex as Integer)

您可能已经看到所有事件处理程序都采用以下格式 sub myhook(sender as object, e as XXEventArgs)

这是微软为其 .NET 事件使用的约定,但不是必需的。您的第三方工具显然不遵循该约定。当它告诉您委托签名必须是什么样子时,只需按照该消息进行操作即可。

【讨论】:

    【解决方案3】:

    跟进 Waves 的 cmets 帖子,您可以使用 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
    

    【讨论】:

    • 您使用的是什么版本的 .NET?我似乎无法让“lambda”匿名“函数(索引为整数)”构造在 .NET 2.0 下工作。
    • 您需要 VB.NET 版本 9,即 VS2008 中附带的版本。值得升级,如果只是为了 Linq。
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多