DDE客戶程序的實現
DDE客戶程序啟動DDE會話向服務器請求並從服務器接收數據同時還可以向服務器發送數據命令宏改變服務器的狀態並控制服務器的運行
聯接模式(ConnectMode)
Delphi的DDE提供了兩種聯接模式自動和人工這可以通過DDEClinetConv 部件的ConnectMode屬性進行設置如下表所示
表 DDE的聯接模式
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
值 意 義
───────────────────────────────
ddeAutomatic 在運行中當包含TDDEClientConv部件的窗口創建時聯接自動建立
ddeManual 只有當調用OpenLink方法時聯接才建立
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
不同聯接模式DDE客戶程序的實現方式不同
對於自動模式
向窗體中加入DDEClientConv和DDEClientItem部件並命名
把DDEClientItem部件的DdeConv屬性設置為DDEClientConv部件的名稱如果在設計時建立則通過對象觀察器進行選擇如果在運行時建立聯系 則通過如下的一條語句設置屬性的值DDEClientItemDdeConv := DDEClientConv ;
和服務器建立聯系實現數據共享
對於人工模式
向窗體中加入DDEClientConv部件
和服務器建立聯系
數據更新時調用RequestData方法申請並獲得數據
和DDE服務器建立聯系
和DDE服務器建立聯系既可以在設計時進行也可以在運行時進行
在設計時DDE聯接可以通過剪貼板進行粘貼具體步驟如下
激活服務器程序並選中你的客戶程序欲聯接的數據
把數據和DDE聯接信息拷貝到剪貼板上一般說來這只需要選擇服務器應用程序的 Edit|Copy 菜單
在Delphi IDE的設計窗體中選中DDEClientConv部件
在Object Inspector(對象觀察器)中單擊DDEService屬性或DDETopic屬性然後再單擊Ellipsis按鈕打開DDE Info對話框
選擇Paste Link按鈕此時App編輯框和Topic編輯框被自動填充如果Paste Link按鈕變灰說明你准備用作服務器的應用程序不支持DDE或者DDE信息沒有被成功地拷貝到剪貼板上
選擇OK 按鈕此時Object Inspector中的DDEServiceDDETopic 屬性包含了建立一個DDE聯接的正確值
對於人工模式以下步驟是不需要的
選中DDEClientItem部件並在Object Inspector中設置DdeConv屬性為已完成聯接的DDEClientConv部件名稱
假如剪貼板上的DDE 聯接信息仍保留的話從Object Inspector的下拉列表框中選擇 DDEItem 屬性的值否則輸入正確的值
在運行時調用 SetLink 方法來建立DDE聯接
SetLink有兩個String類型的參數分別用來接受DDEService和DDETopic的值過程執行後DDEClientConv部件的DDEService 和DDeTopic屬性被設置要注意的是在運行時直接設置DDEService和DDETopic的值並不能建立一個DDE聯接而必須調用SetLink 方法進行初始化
比如下面的語句和Excel的System主題建立聯接
DDEClietnConv SetLink(ExcelSystem)
調用SetLink方法後還需要設置DDEClientItem部件的DDEItem屬性
比如下面的語句聯接Excel的Topics項目用以獲取當前活躍文件的文件名
DDEClietnItemDDEItem := Topics;
當DDE聯接建立後聯接的數據保存在DDEClientItem部件的Text和Lines 屬性中Text用於保存一個字符串(String)Lines用於保存一個字符串鏈表(TStrings)對象
為了顯示聯接數據可以在DDEClientItem的OnChange事件中把數值賦給一個可視部件
下面的事件過程把聯接數據實時地顯示在一個編輯框中
procedure FormDDEClientItemChange(Sender: Tobject)
begin
EditText := DDEClientItemText;
end;
運行狀態下也可以從剪貼板上粘貼DDE聯接信息並調用SetLink建立DDE會話下面的例子顯示了當用戶按下應用程序中的Paste Link按鈕時動態建立DDE會話的過程
procedure FormOnPasteLink(Sender: Tobject)
var
Service Topic Item: String;
begin
if GetPasteLinkInfo (Service Topic Item) then
begin
AppNameText := Service;
TopicNameText := Topic;
ItemNameText := Item;
DDEClientSetLink (Service Topic)
DDEClientItemDdeConv := DDEClient;
DDEClientItemDDEItem := ItemNameText;
end;
end;
GetPasteLinkInfo是DDEMan 庫單元中定義的一個過程如果返回True則DDE聯接信息保存在三個參數中如果返回False說明剪貼板上沒有正確格式的DDE聯接信息
數據申請
雖然自動模式快捷方便但仍有一些理由使用DDE的人工模式
服務器程序可能不支持自動數據傳輸客戶必須顯式申請服務器更新一個特定的項目
節省通信費用假如沒有實時傳輸的要求則人工模式可以大幅度降低通信的開銷
若客戶程序只用於控制服務器的運行則往往沒有必要使用自動模式
人工模式下客戶程序的數據更新需要采用數據申請的方式數據申請需要調用DDEClientConv部件的RequestData方法RequestData有一個參數指向要申請的DDE項目RequestData返回一個Pchar類型的無結束符字符串包含了申請到的文本返回字符串占用的內存必須在程序終止前顯式釋放
在人工模式下即使存在一個DDEClientItem部件且與DDEClientConv相聯接數據更新後DDEClientItem部件的TextLines屬性的值也不會改變
數據發送
數據發送與一般的DDE數據流向正好相反是把數據從DDE客戶應用程序發送到DDE服務器應用程序
數據發送使用DDEClientConv部件的兩個方法PokeData 和 PokeDataLines 它們的語法是
function PokeData (Item: String ; Data: PChar) Boolean;
function PokeDataLines (Item: String ; Data: TStrings) Boolean;
參數Item是DDE服務器中被聯接的項目Data是要發送的數據如果數據是一個字符串則把它轉化為PChar類型並調用PokeData方法如果數據是一個字符串鏈表對象可調用PokeDataLines方法
方法的返回值標志數據傳送是否成功因為有一些DDE服務器應用程序並不接收發送的數據
下面的語句把編輯框中的內容發送給服務器
StrPCopy(TheText Edittext)
DDEClientConvPokeData(DDEClientItemDDEItem TheText)
過程StrPCopy把一個Pascal類型的字符串拷貝到一個無結束符的PChar類型字符串中
返回目錄DELPHI基礎教程
編輯推薦
Java程序設計培訓視頻教程
JEE高級框架實戰培訓視頻教程
Visual C++音頻/視頻技術開發與實戰
Oracle索引技術
ORACLEG數據庫開發優化指南
Java程序性能優化讓你的Java程序更快更穩定
C嵌入式編程設計模式
Android游戲開發實踐指南
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25231.html