2012年1月17日 星期二

NDde 的簡易教學 (Server 部份)

之前在 NDde 的簡易教學 (Client 部份) 這篇文章中講到了 NDde Client 部份的實作。

這次要提的則是 Server 的部份,而會用到 Server 功能的應該算少數,所以這邊就簡單介紹一下囉。

相關下載元件、匯入參考的教學請直接參考上述的 Client 文章。



程式一開始一樣做 import 的動作,不一樣的是這邊 import 的是 server 的部份:


Imports NDde.Server


接下來實作一個 dde server 的 class,並直接繼承 DdeServer:


Private Class MyServer
Inherits DdeServer
End Class


而在這個 Class 裡面就是 dde server 所需要的重要部份了,下面這邊先給一個簡單的例子:


Private Class MyServer
Inherits DdeServer

Private WithEvents price1 As Label = Form1.price1
Private Sub price1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles price1.TextChanged
Me.Advise("test", "price1")
End Sub

Public Sub New(ByVal service As String)
MyBase.New(service)
End Sub

Public Overrides Sub Register()
MyBase.Register()
End Sub

Public Overrides Sub Unregister()
MyBase.Unregister()
End Sub

Protected Overrides Function OnBeforeConnect(ByVal topic As String) As Boolean
Return True
End Function

Protected Overrides Sub OnAfterConnect(ByVal conversation As DdeConversation)
End Sub

Protected Overrides Sub OnDisconnect(ByVal conversation As DdeConversation)
End Sub

Protected Overrides Function OnStartAdvise(ByVal conversation As DdeConversation, ByVal item As String, ByVal format As Integer) As Boolean
Return format = 1
End Function

Protected Overrides Sub OnStopAdvise(ByVal conversation As DdeConversation, ByVal item As String)
End Sub

Protected Overrides Function OnExecute(ByVal conversation As DdeConversation, ByVal command As String) As ExecuteResult
Return ExecuteResult.Processed
End Function

Protected Overrides Function OnPoke(ByVal conversation As DdeConversation, ByVal item As String, ByVal data As Byte(), ByVal format As Integer) As PokeResult
Return PokeResult.Processed
End Function

Protected Overrides Function OnRequest(ByVal conversation As DdeConversation, ByVal item As String, ByVal format As Integer) As RequestResult
If format = 1 Then
If item = "price1" Then
Return New RequestResult(System.Text.Encoding.ASCII.GetBytes(price1.Text))
End If
End If
Return RequestResult.NotProcessed
End Function

Protected Overrides Function OnAdvise(ByVal topic As String, ByVal item As String, ByVal format As Integer) As Byte()
If format = 1 Then
If item = "price1" And price1.Text <> 0 Then
End If
End If
Return Nothing
End Function

End Class


基本上在實作的 Class 裡面會像這樣…首先一開始的部份宣告了 price1 這個物件為 Label,並等於在 Form 上的一個名為 price1 的 Label。因為基本上兩個 Class 並不是同一個,所以這邊不能直接使用 Form 上的 price1,必需另外宣告。

再來是 Label_TextChanged 的事件,也就是 Label 文字發生改變時產生的事件,而在這個事件內,作了 dde 的 Advise 動作。可以看到上面的例子我在裡面作了 Advise("test", "price1") 這樣的指令。

在 DDE 的溝通裡面,有 Service、Topic 和 Item 三個主要的名稱,這邊 Advise 出來的是 Topic 和 Item 這二個。

接下來中間的程式碼部份則是 NDde Server 的一些基本 Function…直接放到程式碼內即可。

比較重要的是最後兩個 Function: OnRequest 和 OnAdvise 這兩個事件。

首先是 OnRequest,所謂的 request 在 dde 裡面就是當 client 連上 server 時,會做一個由 client 主動發出的資料要求指令,當然 client 可以要或不要,並不是必需的。不過如果 Server 上沒寫進這個 OnRequest Function,那當 client 作 request 時就不會有資料回覆了。

而這個 Function 的內容就是看 client 要求的是哪個 item,就把那個 item 的值回傳給 client。這邊也可以針對 Topic 來作判斷,用的是


conversation.Topic


的指令。可以使用上述的程式碼來額外判斷 topic 是不是一樣。

再來就是 OnAdvise,也就是由 Server 主動 Advise 資料給 Client。因為我們在這個 Class 的最前面放進了只有 Label 的文件改變,就執行 Advise 的動作,而這個 Advise 的動作接下來就會來到 OnAdvise 這個 Function,所以如果你有許多的 Advise,那當然在這個 Function 內就要做 item 的判斷了。也就是上述程式碼內的這樣…先判斷 item 是不是正確,如果正確就把該數值做回傳的動作,接下來 NDde 就會幫你把這個資料傳給 Client 端了。

Class 到這邊算是結束了…接下來是 Server 的註冊,註冊的程式碼就放在原本的 Class 內即可:



Dim server As DdeServer = New MyServer("ddeServer")

Try
server.Register()
Catch ex As Exception
End Try



用上述程式碼做 dde server 的註冊即可,接下來可以試著用 excel 連上你完成的 dde server,並把 price1 這個 label 文字作一些變動,就可以看到 excel 上的值會跟著程式內的 price1 這個 label 一起變動囉。

2 則留言:

  1. 您好:看到您的範例覺得非常好,只是我參考您的範例製作出來的還是有問題,請問您有完整的範例可以給我參考嗎?如果可以的話請寄給我mailto:benchen@micb2b.com
    感謝您

    回覆刪除
  2. 大哥您好,方便給完整project以進行研究嗎?我copy上述程式碼但無法運作,想了解錯在哪裡,3Q!我的電郵kevenpeter@gmail.com

    回覆刪除

留言請留下大名~謝謝。

Related Posts Plugin for WordPress, Blogger...