控制服務器應用程序的執行
客戶程序控制服務器應用程序的一個方面是必要的時候客戶程序可以啟動服務器程序並裝載會話主題
而客戶程序控制服務器應用程序更重要的一點是向服務器發送服務器承認的宏命令來完成對服務器應用程序的各種操作服務器到底支持哪些宏命令可參閱服務器應用程序文檔
發送宏命令要使用DDEClientConv的兩個方法 ExecuteMacro和ExecuteMacroLines 它們的語法如下
function ExecuteMacro(Cmd: PChar; WaitFlag: Boolean) Boolean;
function ExecuteMacroLines(Cmd: TStrings;WaitFlag: Boolean) Boolean;
Cmd是欲發送的宏命令字符串或宏命令字符串鏈表WaitFlag決定了在DDE 服務器程序執行宏命令時客戶程序的行為如果WaitFlag設置為True則在服務器宏命令執行完畢前不允許對ExecuteMacroExecuteMacroLinesPokeDataPokeDataLines這些方法的成功調用它們都不向服務器發送數據並返回False如果WaitFlag設置為False則調用的方法在第一個宏執行完畢前即試圖向服務器發送數據
WaitFalg的設置也取決於服務器應用程序一些應用程序當在第一個宏執行完之前就試圖向它發送數據或命令時可能導致第一個宏執行失敗或導致不可預料的後果具體情況可查閱服務器應用程序文檔
函數返回值表示命令串是否被成功傳輸而宏命令執行是否成功客戶是無法檢測到的
格式化文本
DDEClientConv有一個布爾屬性FormartChars用於決定是否格式化文本所謂格式化文本是指從傳輸來的文本數據中過濾掉BackSpace() Tab() Linefeed() Return()等字符括號內是字符的ASCII碼許多時候這些字符將導致DDE客戶數據顯示的混亂
FormatChars的缺省值是False
響應DDE事件
部件DDEClientConv有兩個事件OnOpen和OnClose分別在DDE 會話建立和中止時觸發部件DDEClientItem有一個OnChange事件這一事件常用於DDE項目數據的轉儲和顯示如()節所示
在自動模式下OnOpen事件在包含DDEClientConv部件的窗口創建時觸發或在調用SetLink方法時觸發OnClose事件在客戶程序或服務器程序關閉時觸發
在人工模式下OnOpen事件在調用OpenLink 方法時觸發OnClose事件在調用ColseLink方法時觸發
利用客戶程序和Excel交換數據
下面我們建立一個DDE客戶程序並利用這一程序與Excel中的一個工作表交換數據程序設計界面
界面中包含一個DDE會話部件DDEClientConv和DDE項目部件DDEClientItem用於建立和維護DDE聯接一個RadioGroup控件和其中的兩個無線電按鈕AutoRadioManualRadio用於設置聯接模式一個GroupBox控件和其中的兩個按鈕RequestBtn和PokeBtn用於控制數據的申請和發送其中RequestBtn在自動模式下變灰一個文本框Memo用於保存DDE數據一個按鈕PasteBtn用於粘貼聯接信息並建立DDE聯接另外一個按鈕CloseBtn用於關閉系統
設計時把DDEClientConv的FormatChars屬性置為True這樣可以保留服務器傳來數據的顯示格式ConnectMode保留ddeAutomatic的缺省設置
程序在類TForm中定義了一個私有數據成員Automatic用於標志聯接模式三個字符串數據成員DDEServiceDDETopicDDEItem用於記錄聯接信息
窗口生成時進行變量和部件狀態的初始化
procedure TFormFormCreate(Sender: TObject)
begin
RequestBtnEnabled := False;
AutoRadioChecked := True;
Automatic := True;
end;
當聯接模式改變時程序進行相應的處理
自動模式轉換為人工模式
procedure TFormManualRadioClick(Sender: TObject)
begin
if Automatic then
begin
RequestBtnEnabled := ManualRadioChecked;
DDEClientConvConnectMode := ddeManual;
Automatic := False;
end;
end;
人工模式轉換為自動模式
procedure TFormAutoRadioClick(Sender: TObject)
begin
if not Automatic then
begin
RequestBtnEnabled := ManualRadioChecked;
If (DDEService = ) or (DDETopic = ) then
begin
MessageDlg( Can not Set LinkmtWarning[mbOK])
Exit;
end;
DDEClientConvSetLink (DDEService DDETopic)
DDEClientItemDdeConv := DDEClientConv;
DDEClientItemDDEItem := DDEItem;
DDEClientConvConnectMode := ddeAutomatic;
Automatic := True;
end;
end;
當從自動模式轉換到人工模式只需要簡單修改相應屬性即可而從人工模式轉換到自動模式則需要調用SetLink重新建立聯接否則往往會引發一個DDE異常
聯接的建立采用從剪貼板粘貼聯接信息的方式這是最具有靈活性的一種方法
procedure TFormPasteBtnClick(Sender: TObject)
begin
if GetPasteLinkInfo (DDEService DDETopic DDEItem) then
begin
DDEClientConvSetLink (DDEService DDETopic)
if Automatic then
begin
DDEClientItemDdeConv := DDEClientConv;
DDEClientItemDDEItem := DDEItem;
end;
end;
end;
GetPasteInfo是 DDEMan庫單元中定義的一個函數用於檢測剪貼板上是否有聯接信息並返回相應的DDE服務主題和項目
對於人工模式必須由客戶顯式向服務器申請數據在這種模式下DDE項目部件是多余的接收到的DDE聯接信息用一個字符串來記錄下面是實現代碼
procedure TFormRequestBtnClick(Sender: TObject)
var
TheData: PChar;
begin
If DDEItem = then
begin
MessageDlg(Can not Request DatamtWarning[mbOK])
Exit;
end;
TheData := StrAlloc()
DDEClientConvOpenLink;
TheData := DDEClientConvRequestData(DDEItem)
DDEClientConvCloseLink;
if TheData <> nil then
MemoText := StrPas(TheData)
StrDisPose(TheData)
end;
OpenLinkCloseLink方法用於打開和關閉聯接RequestData方法向服務器申請數據並返回到一個PChar字符串中字符串必須顯式分配內存並在退出時釋放
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25224.html