我正在尝试将设备对象传递给表单对象,然后在表单上的按钮的单击事件中使用该设备对象。但我不知道如何在按钮事件中正确引用设备对象。
我使用以下方式设置新表单实例:
Public Sub New(ByRef thisEquip As classEquipment)
Me.InitializeComponent()
Me.Text = thisEquip.equipName & " Tests"
End Sub
并设置按钮点击事件,如下所示:
Private Sub btnUpdateAndClose_Click(sender As Object, e As EventArgs) Handles btnUpdateAndClose.Click
Call updateTestList(thisEquip)
End Sub
但是' thisEquip'对象无法识别。我认为这是因为发件人是按钮而不是表单本身。但是,我不知道如何从表单中引用设备对象。
答案 0 :(得分:4)
Scope取决于声明变量的位置。您可能错过了浏览链接的内容 - 每个范围级别摘要都包含声明的短语。
现在看看你的构造函数:
Public Sub New(ByRef thisEquip As classEquipment)
thisEquip
声明作为构造函数的参数。因此,它只存在于该程序中。该过程采用的形式或在表单(或模块或其他任何内容)中提及thisEquip
的事实是偶然的。虽然构造函数在几个方面都是特殊的,但在 Scope 方面,它只是另一个过程。
保存对其的引用以供其他地方使用:
Public Class Form1
' declare a variable to hold the reference
Private myEquip As classEquipment
' declare an array
Private myImgs As Image()
Public Sub New(ByRef thisEquip As classEquipment)
InitializeComponent()
...
myEquip = thisEquip ' assign param to the var
' assign array of images to the Form level var
' via a temp array
myImgs = New Image() {My.Resources.add,
My.Resources.ballblack, My.Resources.ballblue,
My.Resources.ballgreen}
End Sub
在表单级别声明,它具有表单/类级别范围。您现在可以在表单中的任何位置引用myEquip
或myImgs。仅在为表单级别对象分配内容时,不要使用 Dim
- 它将创建一个新的本地但名称相同的变量。
其他常见范围级别:
Private myFoo as Int32
Private Sub DoSomething()
Dim myBar As String
myBar = "Ziggy"
...
Dim myFoo As Int32 = 7
End Sub
这通常被称为本地范围。我正在使用程序级别,因为它与其他术语进行了比较和对比。
myBar
在DoSomething
方法中声明,因此它具有过程级别范围 - 它只存在于该方法中。试图在别处使用它会导致错误。这与上面的构造函数示例类似,主要区别在于thisEquip
对象作为参数传递而不是在本地声明。
这导致一些人感到困惑:方法中的Dim myFoo
声明(创建!)一个新的,仅本地的myFoo
变量,该变量与其相同的Form / Class级别变量无关名称。本地版本遮蔽了另一个版本。对此的一些困惑似乎是有些人认为他们需要(重新)使用Dim
才能使用变量。你没有。
直接来自MSDN:
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
相当数量的VB语句创建块范围(For Each
/ Next
,If
/ End If
和Using
/ End Using
)。在块内声明的变量,其范围仅限于该块。基本上,(几乎)任何导致缩进的内容都会创建一个块范围。
Private Sub .....
Dim cube As Int32
If n < 1291 Then
cube = n ^ 3
End If
现在,cube
可以在过程的其他地方使用:其范围已从Block更改为Local。
有关详细信息,请参阅MSDN:
- Scope In Visual Basic
- Value Types vs Reference Types