Class VBA类实例化和作用域

Class VBA类实例化和作用域,class,ms-access,scope,instantiation,Class,Ms Access,Scope,Instantiation,我想创建一个类,该类将用作配置管理和服务助手。它将在XML文件中存储一些基本的连接设置,将其读入自己的属性,并服务于任何其他模块、表单、对象等。 我创建了一个类,如下所示: 选项比较数据库 选项显式 私有mstrSqlServerName作为字符串 '... 公共属性获取SqlServerName()作为字符串 SqlServerName=mstrSqlServerName 端属性 '... 私有子类_Initialize() readConfigFile 端接头 私有函数loadConfigF

我想创建一个类,该类将用作配置管理和服务助手。它将在XML文件中存储一些基本的连接设置,将其读入自己的属性,并服务于任何其他模块、表单、对象等。 我创建了一个类,如下所示:

选项比较数据库
选项显式
私有mstrSqlServerName作为字符串
'...
公共属性获取SqlServerName()作为字符串
SqlServerName=mstrSqlServerName
端属性
'...
私有子类_Initialize()
readConfigFile
端接头
私有函数loadConfigFile()作为MSXML2.DOMDocument60
关于错误转到函数错误
Dim XMLFileName作为字符串
作为IXmlDomeElement的Dim对象根
作为字符串的Dim strMsg
Dim oXMLFile作为MSXML2.DOMDocument60
'打开xml文件
设置oXMLFile=New MSXML2.DOMDocument60
XMLFileName=(Application.CurrentProject.Path&“\config.xml”)
使用oXMLFile
.validateOnParse=True
.SetProperty“SelectionLanguage”、“XPath”
.async=False
.Load(XMLFileName)
以
设置loadConfigFile=oXMLFile
端函数
公共子readConfigFile()
Dim oXMLFile作为MSXML2.DOMDocument60
设置oXMLFile=loadConfigFile
mstrSqlServerName=oXMLFile.selectSingleNode(“//config/database/SqlServerName”).Text
端接头
我已经在中间窗口中测试了我的类,并且一切都完美无瑕。然后 我创建了隐藏表单来实例化该类,如下所示:

'frmYouShouldNotSeeMe
选项比较数据库
选项显式
作为CLS配置的公共配置
专用子表单_加载()
设置配置=新的CLS配置
MsgBox提示符:=configuration.SqlServerName
端接头
现在,从其他模块/表单/报表等,我想调用配置项:

MsgBox configuration.SqlServerName
但当我试图编译我的项目时,它会说“编译错误,变量未定义”。简而言之:我找不到一种从数据库的其他对象使用实例化(命名)对象属性的方法。他们只是不知道它的存在。在中间窗口中,一切正常,我可以实例化对象并调用GET函数。我做错了什么?也许这正是OOP设计带来的,我只是不明白。实现这一目标的最佳方式是什么


您可以向类中添加两个公共函数

像这样:

公共函数SqlServerName()作为字符串
SqlServerName=oXMLFile.SelectSingleNode(“//config/database/SqlServerName”).Text
端函数
公共函数GetConfig(strNode作为字符串,strValue作为字符串)作为字符串
将strXPATH设置为字符串
strXMPATH=“//config/”&strNode&“/”&strValue
GetConfig=oXMLFile.SelectSingleNode(strXMPATH).Text
端函数
现在,在代码中,您可以使用:

Msgbox configuration.SqlServerName
或者,要获得任何配置,可以使用带有2个参数的helper functon

Msgbox配置(“数据库”、“SqlServerName”)
所以,这个班的公众成员必须由你来写。它不会通过“魔术”或出乎意料地公开来自该类的信息。您可以使用公共函数,当您创建此类公共函数时,它们将显示为inteli sense。(它们成为类的属性)。因此,您的语法不起作用,因为您没有公开所需内容的公共函数(或属性get)。您可以使用属性let/get,但是公共函数也可以很好地工作,如上所示

因此,要么为每个要公开的“东西”(节点)创建一个公共函数,要么使用上面的helper函数,然后可以通过接受2个参数的函数传递key+node值。以上两项都将成为课程的一部分,在编码过程中显示inteli sense-您可以根据上述内容向课程中自由添加更多公共成员

#编辑

示例代码显示了以下内容:

设置配置=新的CLS配置
MsgBox提示符:=configuration.SqlServerName
它必须是这样的:

dim配置作为新的CLS配置
MsgBox提示符:=configuration.SqlServerName
您可以在应用程序启动时设置一个名为configuration的全局变量,因此不必在表单代码中声明configuration变量

因此,您需要一个全局变量—在启动任何表单之前,在启动代码中设置它

因此,在标准代码模块中,您需要:

作为新CLS配置的公共配置
但是,代码的屏幕截图缺少configuation变量的创建

您提供的代码如下所示:

设置配置=新的CLS配置
MsgBox提示符:=configuration.SqlServerName
那么,您在何时何地将配置定义为全局作用域变量

您必须使用表单的本地作用域(实际上是加载事件)

dim配置作为新的CLS配置
MsgBox提示符:=configuration.SqlServerName
或者,如前所述,您可以在标准代码模块(不是表单模块,当然也不是类模块)中将“配置”声明为公共全局变量

如果您使用“new”关键字,则可以使用:

作为新CLS配置的公共配置
上述内容可以放在任何标准代码模块中,它的范围是全局的

在上述情况下,则在forms load事件中,这将起作用:

MsgBox提示符:=configuration.SqlServerName

您可以向类中添加两个公共函数

像这样:

公共函数SqlServerName()作为字符串
SqlServerName=oXMLFile.SelectSingleNode(“//config/database/SqlServerName”).Text
端函数
公共函数GetConfig(strNode作为字符串,strValue作为字符串)作为字符串
将strXPATH设置为字符串
strXMPATH=“//config/”&strNode&“/”&strValue
GetConfig=oXMLFile.SelectSingleNode(strXMPATH).Text
端函数
现在,在代码中,您可以使用:

Msgbox配置.Sql