2014-01-09 28 views
1

我不確定我想要做什麼是可能的,我有一個較舊的應用程序,用於通過com端口運行硬件。我們剛剛引進了一臺新設備,與舊設備的功能相同。我正在嘗試更新應用程序,以便可以在任一設備上使用它。我遇到的問題是新硬件上的com命令是不同的。Visual Basic 6,依賴於變量的模塊

我想如何解決這個問題: 我所有的com函數都在一個模塊中,我做了第二個模塊,它具有所有相同名稱的com函數,這些模塊都是爲了支持新機器而定製的。初始化和ident步驟是相同的​​,所以在表單加載時,我可以連接並詢問我連接的是什麼機器。一旦我知道了,我可以決定使用哪個模塊,然後從那裏開始。我的問題是,他們的方式我試圖實現這是行不通的,我開始懷疑它是否可能。

(這個方法不起作用,但這裏是我特林做的樣品)

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和第二將機器2 顯然這個方法返回編譯器錯誤的無效限定符,但我認爲這給你一個我想要做的事情的想法。有沒有辦法做到這一點?

+0

我是不是更具體的遺憾,在COM功能該模塊是爲第一臺機器編寫的,它們不能在新機器上使用,這是否有意義? – user113948

+0

哪一行代碼會引發錯誤? – abhi

回答

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 
+0

完美的作品!謝謝 – user113948

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 
+0

這不起作用,至少不是這種代碼的設計方式。例如,machineA可以通過命令「RESET」發出一個復位命令,但是machineB需要發送「* RST」,舊功能只是MachineReset,你可以調用它並執行它。現在它的MachineA.MachineReset或MachineB.MachineReset,但檢查我在哪臺機器上,然後決定每次使用哪個模塊時,我會調用一個命令,這是很多的開銷 – user113948

+0

您不需要始終檢查您在哪臺機器上,檢查一次並將其存儲在像'MachineType'這樣的變量中。 –

+0

感謝您的回覆Matt,這些方法很有用,但實現太笨拙,需要大量重新編寫大量代碼。我可能在這裏沒有提供足夠的信息,這個應用程序是相當大的,它的一個項目太大,試圖壓縮這個問題,在這個論壇上快速回答。我的歉意 – user113948