Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对非共享成员的引用需要VB.net中的对象引用_Vb.net - Fatal编程技术网

对非共享成员的引用需要VB.net中的对象引用

对非共享成员的引用需要VB.net中的对象引用,vb.net,Vb.net,我有一个VB.net程序,是从别人那里得到的。它由一个主窗体和6个其他模块(所有.vb文件)组成。在资源管理器窗格中,这些文件旁边都有一个“VB”图标。我试图从主窗体调用其中一个模块中的子程序。我的代码是: QuoteMgr.StartGettingQuotesLevel2(sSym) 其中,QuoteMgr是模块的名称,StartGettingQuotesLevel2(sSym)是子程序的名称。当我输入此项时,我会收到错误消息: Reference to a non-shared membe

我有一个VB.net程序,是从别人那里得到的。它由一个主窗体和6个其他模块(所有.vb文件)组成。在资源管理器窗格中,这些文件旁边都有一个“VB”图标。我试图从主窗体调用其中一个模块中的子程序。我的代码是:

QuoteMgr.StartGettingQuotesLevel2(sSym)
其中,QuoteMgr是模块的名称,StartGettingQuotesLevel2(sSym)是子程序的名称。当我输入此项时,我会收到错误消息:

Reference to a non-shared member requires an object reference.  
子程序在QuoteMgr模块中定义如下:

 Public Sub StartGettingQuotesLevel2(ByVal oSymbol As String)
奇怪的是当我进入时:

QuoteMgr.
(带句点的模块名称),它不会显示模块中的所有子例程和函数。它只显示:

Update_Level1
Update_Level12
Update_Level2
这些是模块中的公共常量


你能告诉我需要做什么吗?

这意味着你试图调用的例程需要引用表单的一个实例来访问例程。你可以像Alex说的那样引用一个实例,或者让例程“共享”,这样它就不需要实例了。为此,请将QuoteMgr.vb中的定义更改为

Friend Shared Sub StartGettingQuotesLevel2(ByVal oSymbol As String)

如果例程访问表单控件或模块级变量,将其切换为“共享”可能会开始显示编译器错误。这些将需要添加到参数列表中

编译器试图通过此错误消息告诉您什么

对非共享成员的引用需要对象引用

如果
StartGettingQuotesLevel2
子例程是实例方法,而不是共享方法或类方法,请参阅更详细的说明

要调用实例方法,需要有一个对象实例来调用它。在您的例子中,类类型为的对象实例
QuoteMgr
。如以下示例所示:

' create a new QuoteMgr object instance
Dim myQuoteMgr As QuoteMgr = New QuoteMgr()

' call its instance method with "abc" as its oSymbol argument.
myQuoteMgr.StartGettingQuotesLevel2("abc")
您可能只希望主窗体创建并使用单个
QuoteMgr
对象实例。在这种情况下,您可以将其作为主窗体的成员变量,并创建一次

Public Partial Class MainForm

    ' Create it as a private member variable of the main form
    Private m_QuoteMgr As QuoteMgr = New QuoteMgr()

    ' Use it when "some" button is pressed
    Private Sub btnSome_Click(sender As Object, e As EventArgs) Handles btnSome.Click
        m_QuoteMgr.StartGettingQuotesLevel2(txtSymbol.Text)
        ' And possibly do something with the results.
    End Sub        

End Class
此外,如果
QuoteMgr
类的实例依赖于其他对象实例执行其任务,则必须将它们作为构造函数的方法参数提供给
QuoteMgr
类的构造函数。构造函数(
子新建(…)
)如下所示:

Public Class QuoteMgr

    ' This is a constructor that takes two arguments
    ' - oMainSymbol: a string value
    ' - oKernel: an instance of the type Kernel
    Public Sub New(oMainSymbol As String, ByRef oKernel As Kernel)

        ' ....

    End Sub

End Class
这意味着,当你创建一个
QuoteMgr
实例时,你必须调用它的构造函数方法来满足它的需要,例如

' There must be an instance of Kernel created somewhere. 
Dim myKernel As Kernel = ....

' create a new QuoteMgr object instance with these arguments:
' - oMainSymbol = "SYMABC"
' - oKernel = myKernel
Dim myQuoteMgr As QuoteMgr = New QuoteMgr("SYMABC", myKernel)
一些其他建议

  • 我提供的解释是关于VB.NET语言的基本功能(例如,以粗体突出显示的术语)。我建议,在对现有代码进行任何更改之前,您(1)对其进行备份,(2)尝试阅读教程,并在较小的内容上进行练习
  • 编译器(实际上)总是正确的。当它给你一条错误信息时,仔细阅读它,它会指出错误所在的行,并告诉你它需要什么或缺少什么
  • 堆栈溢出的目的不是提供教程或代码。这是一个问答网站,在这里,最好的问题和答案处理特定的、描述的编程问题,简洁的答案是可能的

右键单击应用程序并转到属性。
请确保您的应用程序类型为“Windows窗体应用程序”。

本文可能也会有所帮助:这是一个子例程而不是函数,因此我输入了Friend sub StartGettingQuotesLevel2。但是错误仍然以主形式存在,行为:QuoteMgr.StartGettingQuotesLevel2(sSym)。感谢您的参考。看来“公开”应该让任何人都能看到。抱歉,我误读了你原来的帖子。如果例程位于
表单
(或
)中,则需要该表单的实例。或声明例程
朋友共享
(或
公共共享
)。如果例程依赖于包含表单中的控件,则可能需要重新编写该例程。
QuoteMgr
听起来像是一个类(而不是模块),需要创建一个实例。打开文件看看。谢谢。我尝试输入“Dim myQuoteMgr As QuoteMgr=New QuoteMgr()”,但收到错误消息:未为“Public Sub New”(oMainSymbol作为字符串,ByRef oKernel作为内核)的参数“oKernel”指定参数“.@AliceMeade-这意味着您需要为
oMainSymbol
oKernel
传递适当的值@AliceMeade I添加了一些额外的解释和更一般的建议。对于这个问题,我只能这样做。