Vb6 Visual Basic 6,与变量相关的模块

Vb6 Visual Basic 6,与变量相关的模块,vb6,Vb6,我不确定我正在尝试做什么是可能的,我有一个旧的应用程序,我使用它通过com端口运行硬件。我们刚刚引进了一种新的设备,它的功能与旧设备相同。我正在尝试更新应用程序,以便它可以在任何一台设备上使用。我遇到的问题是,较新硬件上的com命令不同 我想如何解决这个问题: 我的所有com函数都在一个模块中,我制作了第二个模块,其中包含所有同名的com函数,这些函数都是为支持新机器而定制的。初始化和识别步骤是相同的,所以在表单加载时,我可以连接并询问我连接的是哪台机器。一旦我知道了,我就可以决定使用哪个模块,

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

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

(此方法不起作用,但下面是我尝试做的示例)

第一个模块名为Machine1,第二个模块名为Machine2
显然,这个方法会为无效的限定符返回编译器错误,但我想这会让您了解我要做的事情。有什么方法可以做到这一点吗?

您可以使用VB.NET获得一个更优雅的解决方案,但由于您使用的是VB6,并且希望使用模块,我认为最好的方法是这样:

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

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

您可以使用VB.NET获得更优雅的解决方案,但由于您使用的是VB6,并且希望使用模块,我认为最好的方法是这样:

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

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

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

这里有一个例子。我创建了一个名为
IMachine
的接口类和两个实现该接口的类:
MachineA
MachineB
。然后我创建了一个表单
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

表格1.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

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

这里有一个例子。我创建了一个名为
IMachine
的接口类和两个实现该接口的类:
MachineA
MachineB
。然后我创建了一个表单
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

表格1.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

很抱歉没有说得更具体,模块中的com函数是为第一台机器编写的,它们不能在新机器上使用,这有意义吗?哪行代码会引发错误?很抱歉没有说得更具体,模块中的com函数是为第一台机器编写的,它们不能在新机器上使用,这有意义吗?哪一行代码会抛出错误?这不会起作用,至少这段代码的设计方式不会。例如,可以通过com向machineA发出重置命令,命令为“reset”,但是machineB需要发送“*RST”,旧函数只是MachineSet,您调用它,它就会这样做。现在是MachineA.MachineReset或MachineB.MachineReset,但是检查我在哪台机器上,然后每次我调用命令时决定使用哪一个模块是非常麻烦的。您不需要一直检查您在哪台机器上,只需检查一次,然后将其存储在变量中,如
MachineType
。谢谢您的回复,这些方法是可行的,但实现起来太笨拙,需要大量的代码重新编写。我可能没有在这里提供足够的信息,这个应用程序是相当大的,它太大的一个项目,试图浓缩在这个论坛上的一个快速答案的问题。我的道歉这行不通,至少这段代码的设计方式是行不通的。例如,可以通过com向machineA发出重置命令,命令为“reset”,但是machineB需要发送“*RST”,旧函数只是MachineSet,您调用它,它就会这样做。现在是MachineA.MachineReset或MachineB.MachineReset,但是检查我在哪台机器上,然后每次我调用命令时决定使用哪一个模块是非常麻烦的。您不需要一直检查您在哪台机器上,只需检查一次并将其存储在变量l中