Visual Basic 6,依赖于变量的模块

时间:2014-01-09 14:19:29

标签: vb6

我不确定我要做的是什么,我有一个较旧的应用程序,我用来在com端口上运行硬件。我们刚刚引进了一种新设备,与旧设备完全相同。我正在尝试更新应用程序,以便它可以在任何一台设备上使用。我遇到的问题是新硬件上的com命令不同。

我想如何解决这个问题: 我的所有com函数都在一个模块中,我已经制作了第二个模块,其中包含所有相同名称的com函数,这些模块已经过定制以支持新机器。初始化和识别步骤是相同的​​,所以在表单加载时,我可以连接并询问我连接的机器。一旦我知道,我可以决定使用哪个模块,然后从那里开始。我的问题是,我试图实现它的方式不起作用,我开始怀疑它是否有可能。

(这种方法不起作用,但这里是我要做的一个例子)

dim Machine(1) as string
dim Number as integer

Number = 0
Machine(0) = Machine1
Machine(1) = Machine2

ComWrite ("*IDN?")
sleep(100)
Response = ComRead

if ComRead = A Then
     Number = 0
Elseif ComRead = B Then
     Number = 1
End if
Machine(Number).somecomfunction

第一个模块将命名为Machine1,第二个模块将命名为Machine2 显然这个方法会返回无效限定符的编译器错误,但我认为这可以让你知道我想要做什么。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:4)

您应该做的是定义一个接口,然后创建两个实现该接口的不同类。将模块中的所有现有函数转换为类而不是太难了。

这是一个例子。我创建了一个名为IMachine的接口类和两个实现该接口的类:MachineAMachineB。然后我创建了一个表单Form1,其中包含两个单选按钮(用于选择哪台计算机)和一个用于调用Reset方法的按钮。

显然你不应该在课堂上有MsgBox个陈述,但这是一个快速的演示方式。此外,您将提供自己的代码,类似于您的问题,以确定要实例化的机器类。


IMachine.cls:

Option Explicit

Public Sub Reset()

End Sub

MachineA.cls:

Option Explicit

Implements IMachine

Private Sub IMachine_Reset()
    MsgBox "RESET to MachineA"
End Sub

MachineB.cls:

Option Explicit

Implements IMachine

Private Sub IMachine_Reset()
    MsgBox "*RST to MachineB"
End Sub

Form1.frm:

Option Explicit

Private Sub ResetButton_Click()
    Dim m As IMachine

    If optMachine(0).Value = True Then
        Set m = New MachineA
    Else
        Set m = New MachineB
    End If

    Call m.Reset

End Sub

答案 1 :(得分:0)

您可以使用VB.NET获得更优雅的解决方案,但是当您使用VB6并且想要使用模块时,我认为最好的方法就是这样:

将所有常用例程放在一个模块ModuleCommon中,将设备特定例程放在单独的模块Machine1Machine2等中。

Public MachineType As Integer

Sub Main
    Call CommonInit 'this method is in ModuleCommon
    MachineType = FindType
    If MachineType = 1 Then
        Call Machine1Reset 'this method is in Module1
    Else
        Call Machine2Reset 'this method is in Module2
    End If
End Sub

您唯一的另一个选择是使用变量作为参数调用单个函数,该函数告诉它要发送哪个命令:

Public MachineType As Integer

Sub Main
    Call CommonInit 'this method is in ModuleCommon
    MachineType = FindType
    Call MachineReset(MachineType)
End Sub

然后在模块中:

Public Sub MachineReset(machineType as Integer)
    If MachineType = 1 Then
         'send "RESET"
    Else
         'send "RST"
    End If
End Sub