为了账号安全,请及时绑定邮箱和手机立即绑定

表单中其他位置的引用变量和对象

表单中其他位置的引用变量和对象

jeck猫 2019-07-25 10:37:21
表单中其他位置的引用变量和对象我正在尝试将设备对象传递给表单对象,然后在窗体上的按钮的单击事件中使用该设备对象。但我不知道如何在按钮事件中正确引用设备对象。我使用以下方法设置新表单实例: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'对象无法识别。我认为这是因为发件人是按钮而不是表单本身。但是,我不知道如何从表单中引用设备对象。
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

范围取决于在哪里声明一个变量。您可能错过了浏览链接的内容 - 每个范围级别摘要都包含声明它的短语。

现在看看你的构造函数:

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 Int32Private Sub DoSomething()
    Dim myBar As String 
    myBar = "Ziggy"
    ...
    Dim myFoo As Int32 = 7End Sub

这通常称为本地范围。我正在使用程序级别,因为它与其他术语进行了比较和对比。

myBarDoSomething方法中声明,因此它具有过程级别范围 - 它只存在于该方法中。试图在别处使用它会导致错误。这类似于上面的构造函数示例,主要区别在于thisEquip对象作为参数传递而不是在本地声明。

这导致一些人感到困惑:Dim myFoo方法中声明(创建!)一个新的,仅本地myFoo变量,它与同名的Form / Class级别变量无关。本地版本遮蔽了另一个版本。对此的一些困惑似乎是有些人认为他们需要(重新)使用Dim它们才能使用变量。你不。


块级范围

直接来自MSDN:

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3End If

相当数量的VB语句创建了一个块范围For EachNextIfEnd IfUsingEnd Using)。在块内声明的变量,其范围仅限于该块。基本上,(几乎)任何导致缩进的内容都会创建一个块范围。

Private Sub .....
    Dim cube As Int32    If n < 1291 Then
       cube = n ^ 3
    End If

现在,cube可以在过程的其他地方使用:它的范围已从Block更改为Local。

有关更多详细信息,请参阅MSDN:
Visual Basic中的范围
值类型与引用类型


查看完整回答
反对 回复 2019-07-25
?
米脂

TA贡献1836条经验 获得超3个赞

那讲得通; 我的问题是我错误地认为构造函数的范围在它处于活动状态时应用于该表单对象。我通过了ThisEquip byRef,因为我想对它进行更改; 但现在我正在对myEquip应用更改。有没有比在构造函数中传递thisEquip byRef更好的地方? 

查看完整回答
反对 回复 2019-07-25
  • 2 回答
  • 0 关注
  • 334 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信