?? 020.htm
字號:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基礎教程-->第七章 剪貼板和動態數據交換(二)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基礎教程 第七章 剪貼板和動態數據交換(二)">
<META NAME="description" CONTENT=" - DELPHI基礎教程 - 第七章 剪貼板和動態數據交換(二)">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋體"}
.tt2 {font: 12pt/15pt "宋體"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 background="bg.gif" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%" background="bg.gif"><strong><A HREF="021.htm" ><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="019.htm" ><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR>
<A HREF="index.html" ><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁</font></A><BR>
</strong>
</TD>
<TD class="tt2" background="bg.gif" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷體_GB2312">第七章 剪貼板和動態數據交換(二)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p>7.3.5 <font face="宋體" lang="ZH-CN">控制服務器應用程序的執行 </p>
</font><p><font face="宋體" lang="ZH-CN">
客戶程序控制服務器應用程序的一個方面是:必要的時候客戶程序可以啟動服務器程序,并裝載會話主題。</p>
</font><p><font face="宋體" lang="ZH-CN">
而客戶程序控制服務器應用程序更重要的一點是向服務器發送服務器承認的宏命令,來完成對服務器應用程序的各種操作。服務器到底支持哪些宏命令,可參閱服務器應用程序文檔。</p>
</font><p><font face="宋體" lang="ZH-CN">
發送宏命令要使用</font>DDEClientConv<font
face="宋體" lang="ZH-CN">的兩個方法</font> ExecuteMacro<font face="宋體"
lang="ZH-CN">和</font>ExecuteMacroLines <font face="宋體" lang="ZH-CN">,它們的語法如下: </p>
</font><p>function ExecuteMacro(Cmd: PChar; WaitFlag: Boolean): Boolean;</p>
<p>function ExecuteMacroLines(Cmd: TStrings;WaitFlag: Boolean): Boolean; </p>
<p> Cmd<font face="宋體" lang="ZH-CN">是欲發送的宏命令字符串或宏命令字符串鏈表。</font>WaitFlag<font
face="宋體" lang="ZH-CN">決定了在</font>DDE <font face="宋體" lang="ZH-CN">服務器程序執行宏命令時客戶程序的行為。如果</font>WaitFlag<font
face="宋體" lang="ZH-CN">設置為</font>True<font face="宋體" lang="ZH-CN">,則在服務器宏命令執行完畢前,不允許對</font>ExecuteMacro<font
face="宋體" lang="ZH-CN">、</font>ExecuteMacroLines<font face="宋體" lang="ZH-CN">、</font>PokeData<font
face="宋體" lang="ZH-CN">、</font>PokeDataLines<font face="宋體" lang="ZH-CN">這些方法的成功調用,它們都不向服務器發送數據并返回</font>False<font
face="宋體" lang="ZH-CN">。如果</font>WaitFlag<font face="宋體" lang="ZH-CN">設置為</font>False<font
face="宋體" lang="ZH-CN">,則調用的方法在第一個宏執行完畢前即試圖向服務器發送數據。</p>
</font><p> WaitFalg<font face="宋體"
lang="ZH-CN">的設置也取決于服務器應用程序。一些應用程序當在第一個宏執行完之前就試圖向它發送數據或命令時,可能導致第一個宏執行失敗或導致不可預料的后果。具體情況可查閱服務器應用程序文檔。</p>
</font><p><font face="宋體" lang="ZH-CN">
函數返回值表示命令串是否被成功傳輸。而宏命令執行是否成功客戶是無法檢測到的。 </p>
</font><p>7.3.6 <font face="宋體" lang="ZH-CN">格式化文本 </p>
</font><p> DDEClientConv<font face="宋體"
lang="ZH-CN">有一個布爾屬性</font>FormartChars<font face="宋體" lang="ZH-CN">,用于決定是否格式化文本。所謂格式化文本是指從傳輸來的文本數據中過濾掉</font>BackSpace(8)<font
face="宋體" lang="ZH-CN">、</font> Tab(7) <font face="宋體" lang="ZH-CN">、</font>Linefeed(10)
<font face="宋體" lang="ZH-CN">、</font>Return(13)<font face="宋體" lang="ZH-CN">等字符。括號內是字符的</font>ASCII<font
face="宋體" lang="ZH-CN">碼。許多時候這些字符將導致</font>DDE<font
face="宋體" lang="ZH-CN">客戶數據顯示的混亂。</p>
<p> </font>FormatChars<font face="宋體" lang="ZH-CN">的缺省值是</font>False<font
face="宋體" lang="ZH-CN">。 </p>
</font><p>7.3.7 <font face="宋體" lang="ZH-CN">響應</font>DDE<font face="宋體"
lang="ZH-CN">事件 </p>
</font><p><font face="宋體" lang="ZH-CN">
部件</font>DDEClientConv<font face="宋體"
lang="ZH-CN">有兩個事件</font>OnOpen<font face="宋體" lang="ZH-CN">和</font>OnClose<font
face="宋體" lang="ZH-CN">,分別在</font>DDE <font face="宋體" lang="ZH-CN">會話建立和中止時觸發。部件</font>DDEClientItem<font
face="宋體" lang="ZH-CN">有一個</font>OnChange<font face="宋體" lang="ZH-CN">事件。這一事件常用于</font>DDE<font
face="宋體" lang="ZH-CN">項目數據的轉儲和顯示,如</font>(7.3.1)<font
face="宋體" lang="ZH-CN">節所示。</p>
</font><p><font face="宋體" lang="ZH-CN">
在自動模式下,</font>OnOpen<font
face="宋體" lang="ZH-CN">事件在包含</font>DDEClientConv<font face="宋體"
lang="ZH-CN">部件的窗口創建時觸發,或在調用</font>SetLink<font
face="宋體" lang="ZH-CN">方法時觸發,</font>OnClose<font face="宋體"
lang="ZH-CN">事件在客戶程序或服務器程序關閉時觸發。</p>
</font><p><font face="宋體" lang="ZH-CN">
在人工模式下,</font>OnOpen<font
face="宋體" lang="ZH-CN">事件在調用</font>OpenLink <font face="宋體" lang="ZH-CN">方法時觸發,</font>OnClose<font
face="宋體" lang="ZH-CN">事件在調用</font>ColseLink<font face="宋體" lang="ZH-CN">方法時觸發。 </p>
</font><p>7.3.8 <font face="宋體" lang="ZH-CN">利用客戶程序和</font>Excel<font
face="宋體" lang="ZH-CN">交換數據 </p>
</font><p><font face="宋體" lang="ZH-CN">
下面我們建立一個</font>DDE<font face="宋體"
lang="ZH-CN">客戶程序,并利用這一程序與</font>Excel<font face="宋體"
lang="ZH-CN">中的一個工作表交換數據。程序設計界面</font></p>
<p><font face="宋體" lang="ZH-CN"> 界面中包含一個</font>DDE<font
face="宋體" lang="ZH-CN">會話部件</font>DDEClientConv1<font face="宋體"
lang="ZH-CN">和</font>DDE<font face="宋體" lang="ZH-CN">項目部件</font>DDEClientItem1<font
face="宋體" lang="ZH-CN">,用于建立和維護</font>DDE<font face="宋體"
lang="ZH-CN">聯接;一個</font>RadioGroup<font face="宋體" lang="ZH-CN">控件和其中的兩個無線電按鈕</font>AutoRadio<font
face="宋體" lang="ZH-CN">、</font>ManualRadio<font face="宋體" lang="ZH-CN">,用于設置聯接模式;一個</font>GroupBox<font
face="宋體" lang="ZH-CN">控件和其中的兩個按鈕</font>RequestBtn<font
face="宋體" lang="ZH-CN">和</font>PokeBtn<font face="宋體" lang="ZH-CN">,用于控制數據的申請和發送,其中</font>RequestBtn<font
face="宋體" lang="ZH-CN">在自動模式下變灰;一個文本框</font>Memo1<font
face="宋體" lang="ZH-CN">用于保存</font>DDE<font face="宋體" lang="ZH-CN">數據;一個按鈕</font>PasteBtn<font
face="宋體" lang="ZH-CN">用于粘貼聯接信息并建立</font>DDE<font face="宋體"
lang="ZH-CN">聯接;另外一個按鈕</font>CloseBtn<font face="宋體" lang="ZH-CN">用于關閉系統。</p>
</font><p><font face="宋體" lang="ZH-CN">
設計時把</font>DDEClientConv1<font
face="宋體" lang="ZH-CN">的</font>FormatChars<font face="宋體" lang="ZH-CN">屬性置為</font>True<font
face="宋體" lang="ZH-CN">,這樣可以保留服務器傳來數據的顯示格式;</font>ConnectMode<font
face="宋體" lang="ZH-CN">保留</font>ddeAutomatic<font face="宋體" lang="ZH-CN">的缺省設置。</p>
</font><p><font face="宋體" lang="ZH-CN">
程序在類</font>TForm1<font face="宋體"
lang="ZH-CN">中定義了一個私有數據成員</font>Automatic<font face="宋體"
lang="ZH-CN">,用于標志聯接模式;三個字符串數據成員</font>DDEService<font
face="宋體" lang="ZH-CN">、</font>DDETopic<font face="宋體" lang="ZH-CN">、</font>DDEItem<font
face="宋體" lang="ZH-CN">用于記錄聯接信息。</p>
<p>窗口生成時進行變量和部件狀態的初始化。 </p>
</font><p>procedure TForm1.FormCreate(Sender: TObject);</p>
<p>begin</p>
<p>RequestBtn.Enabled := False;</p>
<p>AutoRadio.Checked := True;</p>
<p>Automatic := True;</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN">當聯接模式改變時,程序進行相應的處理。</font></p>
<p><font face="宋體" lang="ZH-CN">自動模式轉換為人工模式: </p>
</font><p>procedure TForm1.ManualRadioClick(Sender: TObject);</p>
<p>begin</p>
<p>if Automatic then</p>
<p>begin</p>
<p>RequestBtn.Enabled := ManualRadio.Checked;</p>
<p>DDEClientConv1.ConnectMode := ddeManual;</p>
<p>Automatic := False;</p>
<p>end;</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN">人工模式轉換為自動模式:</p>
</font><p>procedure TForm1.AutoRadioClick(Sender: TObject);</p>
<p>begin</p>
<p>if not Automatic then</p>
<p>begin</p>
<p>RequestBtn.Enabled := ManualRadio.Checked;</p>
<p>If (DDEService = '') or (DDETopic = '') then</p>
<p>begin</p>
<p>MessageDlg(' Can not Set Link.',mtWarning,[mbOK],0);</p>
<p>Exit;</p>
<p>end;</p>
<p>DDEClientConv1.SetLink (DDEService, DDETopic);</p>
<p>DDEClientItem1.DdeConv := DDEClientConv1;</p>
<p>DDEClientItem1.DDEItem := DDEItem;</p>
<p>DDEClientConv1.ConnectMode := ddeAutomatic;</p>
<p>Automatic := True;</p>
<p>end;</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN">
當從自動模式轉換到人工模式,只需要簡單修改相應屬性即可;而從人工模式轉換到自動模式,則需要調用</font>SetLink<font
face="宋體" lang="ZH-CN">重新建立聯接,否則往往會引發一個</font>DDE<font
face="宋體" lang="ZH-CN">異常。</p>
<p>聯接的建立采用從剪貼板粘貼聯接信息的方式,這是最具有靈活性的一種方法。</p>
</font><p>procedure TForm1.PasteBtnClick(Sender: TObject);</p>
<p>begin</p>
<p>if GetPasteLinkInfo (DDEService, DDETopic, DDEItem) then</p>
<p>begin</p>
<p>DDEClientConv1.SetLink (DDEService, DDETopic);</p>
<p>if Automatic then</p>
<p>begin</p>
<p>DDEClientItem1.DdeConv := DDEClientConv1;</p>
<p>DDEClientItem1.DDEItem := DDEItem;</p>
<p>end;</p>
<p>end;</p>
<p>end; </p>
<p> GetPasteInfo<font face="宋體" lang="ZH-CN">是</font>
DDEMan<font face="宋體" lang="ZH-CN">庫單元中定義的一個函數,用于檢測剪貼板上是否有聯接信息并返回相應的</font>DDE<font
face="宋體" lang="ZH-CN">服務、主題和項目。</p>
</font><p><font face="宋體" lang="ZH-CN">
對于人工模式,必須由客戶顯式向服務器申請數據。在這種模式下</font>DDE<font
face="宋體" lang="ZH-CN">項目部件是多余的,接收到的</font>DDE<font
face="宋體" lang="ZH-CN">聯接信息用一個字符串來記錄。下面是實現代碼。 </p>
</font><p>procedure TForm1.RequestBtnClick(Sender: TObject);</p>
<p>var</p>
<p>TheData: PChar;</p>
<p>begin</p>
<p>If DDEItem = '' then</p>
<p>begin</p>
<p>MessageDlg('Can not Request Data',mtWarning,[mbOK],0);</p>
<p>Exit;</p>
<p>end;</p>
<p>TheData := StrAlloc(79);</p>
<p>DDEClientConv1.OpenLink;</p>
<p>TheData := DDEClientConv1.RequestData(DDEItem);</p>
<p>DDEClientConv1.CloseLink;</p>
<p>if TheData <> nil then</p>
<p>Memo1.Text := StrPas(TheData);</p>
<p>StrDisPose(TheData);</p>
<p>end;</p>
<p> OpenLink<font face="宋體" lang="ZH-CN">、</font>CloseLink<font
face="宋體" lang="ZH-CN">方法用于打開和關閉聯接。</font>RequestData<font
face="宋體" lang="ZH-CN">方法向服務器申請數據并返回到一個</font>PChar<font
face="宋體" lang="ZH-CN">字符串中。字符串必須顯式分配內存并在退出時釋放。</p>
</font><p><font face="宋體" lang="ZH-CN">
數據發送在不同聯接模式下是不同的。對于人工模式,增加了聯接的打開和關閉操作。程序清單如下。 </p>
</font><p>procedure TForm1.PokeBtnClick(Sender: TObject);</p>
<p>begin</p>
<p>If DDEItem = '' then</p>
<p>begin</p>
<p>MessageDlg('Can not Poke Data.',mtWarning,[mbOK],0);</p>
<p>Exit;</p>
<p>end;</p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -