Vb6 Visual Basic 6,与变量相关的模块
我不确定我正在尝试做什么是可能的,我有一个旧的应用程序,我使用它通过com端口运行硬件。我们刚刚引进了一种新的设备,它的功能与旧设备相同。我正在尝试更新应用程序,以便它可以在任何一台设备上使用。我遇到的问题是,较新硬件上的com命令不同 我想如何解决这个问题: 我的所有com函数都在一个模块中,我制作了第二个模块,其中包含所有同名的com函数,这些函数都是为支持新机器而定制的。初始化和识别步骤是相同的,所以在表单加载时,我可以连接并询问我连接的是哪台机器。一旦我知道了,我就可以决定使用哪个模块,并从那里开始。我的问题是,他们认为我试图实现这一点的方式行不通,我开始怀疑这是否可行 (此方法不起作用,但下面是我尝试做的示例) 第一个模块名为Machine1,第二个模块名为Machine2Vb6 Visual Basic 6,与变量相关的模块,vb6,Vb6,我不确定我正在尝试做什么是可能的,我有一个旧的应用程序,我使用它通过com端口运行硬件。我们刚刚引进了一种新的设备,它的功能与旧设备相同。我正在尝试更新应用程序,以便它可以在任何一台设备上使用。我遇到的问题是,较新硬件上的com命令不同 我想如何解决这个问题: 我的所有com函数都在一个模块中,我制作了第二个模块,其中包含所有同名的com函数,这些函数都是为支持新机器而定制的。初始化和识别步骤是相同的,所以在表单加载时,我可以连接并询问我连接的是哪台机器。一旦我知道了,我就可以决定使用哪个模块,
显然,这个方法会为无效的限定符返回编译器错误,但我想这会让您了解我要做的事情。有什么方法可以做到这一点吗?您可以使用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中