是否可以在VB6 / VBA中发送和存储类型引用?

时间:2020-03-06 14:39:25  来源:igfitidea点击:

我正在VB6应用程序上工作,我想将Type作为参考发送并以另一种形式存储。这可能吗?

发送它没问题,我只使用ByRef关键字:

public Sub SetStopToEdit(ByRef currentStop As StopType)

但是,当我尝试使用Set将currentStop存储在接收模块中时,在运行程序时出现"需要对象"错误:

Private stopToEdit As StopTypeModule.StopType
' ... Lots of code
Set stopToEdit = currentStop

在模块(不是类模块)中," StopType"的定义如下:

Public Type StopType
    MachineName As String
    StartDate As Date
    StartTime As String
    Duration As Double
End Type

是否可以存储发送的引用,还是必须将StopType转换为类?

虽然只设置局部变量即可:

stopToEdit = currentStop

稍后更改stopToEdit时,该更改在发送给SetStopToEdit的变量中不可见。

解决方案

什么是StopType?它是如何定义的?类型是VB6-Record的东西吗?如果是这样(并且可能的话),我们应该将其重新定义为一个类,并仅使用它们,否则会遇到Collections的问题。

尝试删除Set关键字字符串,整数和数字,但是如果我没记错的话,也没有设置Records,而是将它们设为Let,但这是隐式的:

stopToEdit = currentStop

编辑:如果我们想更改传入的(ByRef)记录,请为元素复制执行一个手动元素,而不是重新分配应做的整个事情。

同时:不要! ByRef(在VB中默认为可悲)不是很酷(用我的儿子来解释)。尝试设计函数,以便它们不更改传入的参数,这就是我们要返回的值...

我们需要将其重构为一个类。

这里的困惑在于StopType并非像对象那样的引用,而是表现得更像内置类型(如LONG)。当我们这样做时:

stopToEdit = currentStop

我们仅复制currentStop。如果随后更改了stopToEdit,则需要将其复制回:

currentStop = stopToEdit

这样,值将被传回Sub。