【问题标题】:Function/Sub not Declared. It may be inaccessible due to its protection level未声明功能/子。由于其保护级别,它可能无法访问
【发布时间】:2015-07-14 18:22:52
【问题描述】:

我对 vb.net 还很陌生,所以我并不完全熟悉公共函数是如何从一种形式调用到另一种形式的。当悬停在类 frmReadTemp 中的“myIniFile”和“initGPIB”上时,我收到错误消息 - 未声明。由于其保护级别,它可能无法访问。但是,该函数和子函数在另一个类中是公共的。

Public Class frmReadTemp


    Private Sub cmdRun_Click(sender As Object, e As EventArgs) Handles cmdRun.Click
        Dim err_code As eCode = eCode.ERR_NONEr

        myInifile()
        err_code = initGPIB()

    End Sub

End Class


Public Class PowerSupply_setup

#Region "Variable Declarations"

    Dim myIniFile As IniFile
    Public instrInfo As New ArrayList
    Public myiniObj As iniObj
    WithEvents myPS As IPowerSupply
    WithEvents myTestSystem As New testSystemObj(4)

#End Region

    Public Sub loadIniFile()

        Dim tenable As String

        'Power Supply
        myiniObj.ps_addr.PrimaryAddress = myIniFile.GetInteger("GPIB_INSTRUMENTS", "POWERSUPPLY_ADDR", 6)
        myiniObj.ps_addr.ComInterface = 1
        myiniObj.ps_type = myIniFile.GetString("GPIB_INSTRUMENTS", "POWERSUPPLY_TYPE", "HP6632").ToUpper
        tenable = myIniFile.GetString("GPIB_INSTRUMENTS", "POWERSUPPLY_AVAILABLE", "NO")
        myiniObj.ps_available = IIf(tenable.ToUpper.Trim.StartsWith("NO"), False, True)
        'myiniObj.ps_available = IIf((myIniFile.GetString("GPIB_INSTRUMENTS", "POWERSUPPLY_AVAILABLE", 0)) = "0", False, True)
        myiniObj.ps_port = myIniFile.GetInteger("GPIB_INSTRUMENTS", "POWERSUPPLY_PORT", 1)
        myiniObj.ps_ov_offset = Val(myIniFile.GetInteger("GPIB_INSTRUMENTS", "POWERSUPPLY_OVERVOLTAGE_OFFSET", "3.0"))
        myiniObj.ps_current_limit = Val(myIniFile.GetInteger("GPIB_INSTRUMENTS", "POWERSUPPLY_CURRENT_LIMIT", "3.0"))

    End Sub

    Public Function initGPIB() As swiErr.eCode
        Dim err_code As eCode = eCode.ERR_NONE

        If (instrInfo.Count = 0) Then

            'init Power Supply
            If (err_code = eCode.ERR_NONE And myiniObj.ps_available) Then
                Dim iInfo2(1) As String
                If (myiniObj.ps_type.ToUpper.Contains("HP6632")) Then
                    myPS = New HP6632(myiniObj.ps_addr)
                    err_code = myPS.ErrCode
                ElseIf (myiniObj.ps_type.ToUpper.Contains("E3631")) Then
                    myPS = New E3631A(myiniObj.ps_addr)
                    err_code = myPS.ErrCode
                ElseIf (myiniObj.ps_type.ToUpper.Contains("E66311")) Then
                    myPS = New E66311B(myiniObj.ps_addr)
                    err_code = myPS.ErrCode
                ElseIf (myiniObj.ps_type.ToUpper.Contains("E66319")) Then
                    myPS = New E66311B(myiniObj.ps_addr)
                    err_code = myPS.ErrCode
                ElseIf (myiniObj.ps_type.ToUpper.Contains("SCPI")) Then
                    myPS = New SCPI_PS(myiniObj.ps_addr)
                    err_code = myPS.ErrCode
                Else
                    myPS = Nothing
                    err_code = eCode.ERR_INST_PS_NOT_SUPPORTED
                End If

                If (err_code = eCode.ERR_NONE) Then
                    iInfo2(0) = myPS.instrumentName
                    iInfo2(1) = myPS.gpibAddress.PrimaryAddress
                    myPS.selectPort = Me.myiniObj.ps_port
                    instrInfo.Add(iInfo2)
                    myPS.OverVoltageOffset = myiniObj.ps_ov_offset
                    myPS.setPwrOff()
                End If

                If (err_code = eCode.ERR_INST_GPIB_SEARCH) Then err_code = eCode.ERR_INST_MISSING_PWRSUPPLY
            Else
                'create object but set availability to false
                myPS = New E3631A()
            End If

            Me.myTestSystem.instrument.PS = myPS

        End If

        Return err_code
    End Function
End Class

【问题讨论】:

    标签: vb.net function declaration


    【解决方案1】:

    变量myIniFile 和方法initGPIB 确实是公共的,因此可以从PowerSupply_setup 类的外部访问它们。但是,由于它们是该类的成员,因此必须通过该类的对象来引用它们。例如:

    Dim mySetup As New PowerSupply_setup()
    err_code = mySetup.initGPIB()
    

    由于它们是实例成员(不是Shared),因此您必须创建类的实例(对象),然后才能通过该对象访问它们。如果您创建该类的多个对象,那么您将拥有多个成员的副本。

    如果您只需要成员的一个副本,并且您不想为了使用它们而创建一个对象,您也可以将它们作为 Shared 类的成员来处理:

    Public Class PowerSupply_setup
        Public Shared Sub loadIniFile()
            ' ...
        End Sub
        ' ...
    End Class
    

    然后就可以通过类名直接访问了:

    err_code = PowerSupply_setup.initGPIB()
    

    就个人而言,我建议不要这样做,除非真的有必要,因为它会导致全局状态,这可能很危险。但是,如果您真的想走这条路,并且您甚至不想使用类名来访问这些成员,您也可以将它们放在 Module 而不是类中。

    【讨论】:

      【解决方案2】:

      这里发生了一些不同的事情:

      1. Dim 是私有的,而不是公共的,因此您需要声明 var Public 或创建一个 Public Property 来访问它。
      2. 任何未声明为 Shared 的属性/方法都必须从实例成员中调用。换句话说,您实际上必须创建一个 Powersupply_Setup 对象并从该副本调用 Init_GPIB(),除非您更改 Init_GIPB() 的声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多