?? 019.htm
字號:
face="宋體" lang="ZH-CN">賦給</font>Image<font face="宋體" lang="ZH-CN">部件的相應值,使用戶可以對剪貼板上的位圖進行觀察。</p>
</font><p><font face="宋體" lang="ZH-CN">
消息響應過程</font>WMChangeCBChain<font
face="宋體" lang="ZH-CN">在剪貼板觀察器鏈上其它觀察器退出時被調用。根據被移出觀察器的不同位置決定了不同的處理方法。</p>
</font><p>procedure TClipSaveForm.WMChangeCBChain(var Msg: TWMChangeCBChain);</p>
<p>begin</p>
<p>if Msg.Remove = NextViewerHandle then</p>
<p>NextViewerHandle := Msg.Next</p>
<p>else</p>
<p>if NextViewerHandle <> 0 then</p>
<p>SendMessage(NextViewerHandle,Msg.Msg,Msg.Remove,Msg.Next);</p>
<p>Msg.Result := 0;</p>
<p>end;</p>
<p><font face="宋體" lang="ZH-CN">窗口上有兩個加速按鈕,兩個按鈕。它們擊鍵</font>(click)<font
face="宋體" lang="ZH-CN">事件處理過程如下。每一程序段的意義是非常顯然的。 </p>
</font><p>procedure TClipSaveForm.Button1Click(Sender: TObject);</p>
<p>begin</p>
<p>Close;</p>
<p>end;</p>
<p>procedure TClipSaveForm.Button2Click(Sender: TObject);</p>
<p>begin</p>
<p>WindowState := wsMinimized;</p>
<p>end;</p>
<p>procedure TClipSaveForm.SpeedButton1Click(Sender: TObject);</p>
<p>begin</p>
<p>View := True;</p>
<p>Image1.Picture.Bitmap := MyBitmap;</p>
<p>end; </p>
<p>procedure TClipSaveForm.SpeedButton2Click(Sender: TObject);</p>
<p>begin</p>
<p>View := False;</p>
<p>Image1.Picture.Bitmap := nil;</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN">通過對這個程序的介紹,以下幾點是應該注意的:</p>
</font><p>1.<font face="宋體" lang="ZH-CN">提供了一種自己截獲和處理剪貼板上內容的方法。讀者可以根據需要進一步擴充;</p>
</font><p>2.<font face="宋體" lang="ZH-CN">提供了響應</font>Windows<font
face="宋體" lang="ZH-CN">消息的方法。在第三篇有關自定義部件開發的內容中,這一問題還要詳細論述;</p>
</font><p>3.<font face="宋體" lang="ZH-CN">最后的一點啟示是:在</font>Delphi<font
face="宋體" lang="ZH-CN">程序開發中巧妙應用傳統的</font>Windows<font
face="宋體" lang="ZH-CN">方法</font>(<font face="宋體" lang="ZH-CN">如消息處理、</font>
API<font face="宋體" lang="ZH-CN">函數等</font>)<font face="宋體" lang="ZH-CN">仍是很有必要的。而在應用這些方法中所體現的方便之處,正是</font>Delphi<font
face="宋體" lang="ZH-CN">勝過其它可視化開發工具的一個重要方面。 </p>
</font><p>7.2 Windows<font face="宋體" lang="ZH-CN">的</font>DDE<font face="宋體"
lang="ZH-CN">原理和</font> Dephi<font face="宋體" lang="ZH-CN">的</font>DDE<font
face="宋體" lang="ZH-CN">實現機制 </p>
</font><p>7.2.1 Windows<font face="宋體" lang="ZH-CN">的</font>DDE<font face="宋體"
lang="ZH-CN">原理 </p>
</font><p> Windows<font face="宋體"
lang="ZH-CN">的</font>DDE<font face="宋體" lang="ZH-CN">機制基于</font>Windows<font
face="宋體" lang="ZH-CN">的消息機制。兩個</font>Windows<font face="宋體"
lang="ZH-CN">應用程序通過相互之間傳遞</font>DDE<font face="宋體"
lang="ZH-CN">消息進行</font>DDE<font face="宋體" lang="ZH-CN">會話</font>(Conversation)<font
face="宋體" lang="ZH-CN">,從而完成數據的請求、應答、傳輸。這兩個應用程序分別稱為服務器</font>(Server)<font
face="宋體" lang="ZH-CN">和客戶</font>(Client)<font face="宋體" lang="ZH-CN">。服務器是數據的提供者,客戶是數據的請求和接受者。</p>
</font><p> DDE<font face="宋體" lang="ZH-CN">會話由客戶程序啟動。客戶程序把一條消息</font>(WM_DDE_INITIATE)<font
face="宋體" lang="ZH-CN">傳播給當前運行的所有</font>Windows<font face="宋體"
lang="ZH-CN">程序。這條消息指明了客戶程序所需要的一般數據</font>(<font
face="宋體" lang="ZH-CN">應用程序、主題</font>)<font face="宋體" lang="ZH-CN">。擁有這些數據的</font>DDE<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><font face="宋體" lang="ZH-CN">
利用</font>Windows<font face="宋體"
lang="ZH-CN">本身提供的</font>DDE<font face="宋體" lang="ZH-CN">消息和</font>API<font
face="宋體" lang="ZH-CN">進行</font>DDE<font face="宋體" lang="ZH-CN">編程是一件相當棘手的問題。</font>
<font face="宋體" lang="ZH-CN">雖然使用</font>DDE<font face="宋體" lang="ZH-CN">管理庫</font>(ddeml.dll)<font
face="宋體" lang="ZH-CN">可以一定程度上減輕開發者的工作負擔,但開發</font>DDE<font
face="宋體" lang="ZH-CN">程序仍不是一件輕松的事情。</p>
</font><p><font face="宋體" lang="ZH-CN">
此時</font>Delphi<font face="宋體"
lang="ZH-CN">出現了!</font>Delphi<font face="宋體" lang="ZH-CN">通過其自身巧妙的設計使開發一個</font>DDE<font
face="宋體" lang="ZH-CN">應用程序同開發一個普通程序一樣地快捷、方便。 </p>
</font><p>7.2.2 Delphi<font face="宋體" lang="ZH-CN">的</font>DDE<font face="宋體"
lang="ZH-CN">實現機制簡介 </p>
</font><p>Delphi<font face="宋體" lang="ZH-CN">把所有的</font>DDE<font face="宋體"
lang="ZH-CN">功能做到四個部件中,它們是</font>:</p>
<p><font face="宋體" lang="ZH-CN">●</font> TDDEClientConv <font face="宋體"
lang="ZH-CN">:</font> <font face="宋體" lang="ZH-CN">用于客戶程序建立和維護一個</font>DDE<font
face="宋體" lang="ZH-CN">會話</p>
<p>●</font> TDDEClientItem <font face="宋體" lang="ZH-CN">:</font> <font
face="宋體" lang="ZH-CN">用于客戶程序建立和維護數據交換通道</p>
<p>●</font> TDDEServerConv <font face="宋體" lang="ZH-CN">:</font> <font
face="宋體" lang="ZH-CN">用于服務器程序響應</font>DDE<font face="宋體"
lang="ZH-CN">會話</p>
<p>●</font> TDDEServerItem <font face="宋體" lang="ZH-CN">:</font> <font
face="宋體" lang="ZH-CN">用于服務器程序維護數據交換通道 </p>
<p> 前兩個部件用于生成一個</font>DDE<font face="宋體" lang="ZH-CN">客戶程序,后兩個部件用于生成一個</font>DDE<font
face="宋體" lang="ZH-CN">服務器程序。如果一個應用程序同時擁有這些部件,則這一程序既可以充當</font>DDE<font
face="宋體" lang="ZH-CN">客戶,也可以充當</font>DDE<font face="宋體"
lang="ZH-CN">服務器。</p>
</font><p><font face="宋體" lang="ZH-CN">
會話部件</font>TDDEClientConv<font
face="宋體" lang="ZH-CN">、</font>TDDEServerConv<font face="宋體" lang="ZH-CN">用于建立和維護一個</font>DDE<font
face="宋體" lang="ZH-CN">會話。</font>DDE<font face="宋體" lang="ZH-CN">會話包括</font>DDE<font
face="宋體" lang="ZH-CN">服務和</font>DDE<font face="宋體" lang="ZH-CN">主題兩部分。</p>
</font><p> DDE<font face="宋體" lang="ZH-CN">服務是</font>DDE<font
face="宋體" lang="ZH-CN">服務器的名稱,即在一般的</font>Windows DDE<font
face="宋體" lang="ZH-CN">機制中所講的應用程序名。一般說來這一名稱是</font>DDE<font
face="宋體" lang="ZH-CN">服務器應用程序執行文件名去掉</font> .EXE<font
face="宋體" lang="ZH-CN">后綴。比如你的應用程序要和</font>Word 6.0<font
face="宋體" lang="ZH-CN">建立會話,則</font>DDE<font face="宋體" lang="ZH-CN">服務為</font>WINWORD<font
face="宋體" lang="ZH-CN">。但也不盡然。比如你的應用程序要和</font>Borland
ReportSmith ( RPTSMITH.EXE ) <font face="宋體" lang="ZH-CN">建立會話,則</font>DDE
<font face="宋體" lang="ZH-CN">服務為</font> Report Smith<font face="宋體"
lang="ZH-CN">。</font>DDE<font face="宋體" lang="ZH-CN">服務到底如何,讀者可參看相關的</font>DDE<font
face="宋體" lang="ZH-CN">服務器應用程序文檔。</p>
</font><p> DDE<font face="宋體" lang="ZH-CN">主題是一個包含了聯接信息的數據單元。一般說來</font>DDE
<font face="宋體" lang="ZH-CN">主題是一個包括擴展名的完整文件名。例如和</font>Excel<font
face="宋體" lang="ZH-CN">中的一個文件建立</font>DDE<font face="宋體"
lang="ZH-CN">會話,則主題可能是 </p>
</font><p>Topic = 'c:\excel\Example\sale.xls' </p>
<p><font face="宋體" lang="ZH-CN">
如果服務器是一個</font>Delphi<font
face="宋體" lang="ZH-CN">應用程序,缺省情況下主題是包含欲聯接數據窗體的標題。如果服務器使用了</font>DDEServerConv<font
face="宋體" lang="ZH-CN">部件,則要求使用部件</font>DDEServerConv<font
face="宋體" lang="ZH-CN">的名稱作為</font>DDE<font face="宋體" lang="ZH-CN">主題。</p>
</font><p><font face="宋體" lang="ZH-CN">
項目部件</font>TDDEclientItem<font
face="宋體" lang="ZH-CN">、</font>TDDEServerItem<font face="宋體" lang="ZH-CN">用于建立和維護</font>DDE<font
face="宋體" lang="ZH-CN">數據的傳輸通道。</font> DDE<font face="宋體"
lang="ZH-CN">項目中包含著實際欲傳輸的數據。</font>DDE<font face="宋體"
lang="ZH-CN">項目的格式取決于</font>DDE<font face="宋體" lang="ZH-CN">服務器應用程序。一個可能的</font>DDE<font
face="宋體" lang="ZH-CN">項目例子是電子表格中的單元和數據庫表中的域。如果服務器是</font>Delphi<font
face="宋體" lang="ZH-CN">應用程序,則項目是連接的</font> DDEServerItem<font
face="宋體" lang="ZH-CN">部件的名稱。</p>
</font><p> Delphi<font face="宋體"
lang="ZH-CN">的</font>DDE<font face="宋體" lang="ZH-CN">實現機制方便、實用,但也有一個令人遺憾的缺陷:只能傳輸文本數據以及命令、宏,而不能傳輸圖像數據。在這一點上微軟公司推出的</font>Visual
Basic <font face="宋體" lang="ZH-CN">要略勝一籌。不過在目前文本數據的使用仍是最廣泛的,而且圖像傳輸可以利用剪貼板和</font>OLE<font
face="宋體" lang="ZH-CN">來實現,則這一缺陷也并無很大的影響 </p>
</font><p align="center">7.3 DDE<font face="宋體" lang="ZH-CN">客戶程序的實現</p>
</font><p> DDE<font face="宋體" lang="ZH-CN">客戶程序啟動</font>DDE<font
face="宋體" lang="ZH-CN">會話,向服務器請求并從服務器接收數據。同時還可以向服務器發送數據、命令、宏,改變服務器的狀態并控制服務器的運行。 </p>
</font><p>7.3.1 <font face="宋體" lang="ZH-CN">聯接模式</font>(ConnectMode)</p>
<font face="宋體" lang="ZH-CN"><p> </font>Delphi<font face="宋體" lang="ZH-CN">的</font>DDE<font
face="宋體" lang="ZH-CN">提供了兩種聯接模式:自動和人工。這可以通過</font>DDEClinetConv
<font face="宋體" lang="ZH-CN">部件的</font>ConnectMode<font face="宋體"
lang="ZH-CN">屬性進行設置。如下表所示。 </p>
</font><p><font face="宋體" lang="ZH-CN">表</font> 7.5 DDE<font face="宋體"
lang="ZH-CN">的聯接模式</font></p>
<p><font face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p> 值 意 義</font></p>
<p><font face="宋體" lang="ZH-CN">───────────────────────────────</p>
<p> </font>ddeAutomatic <font face="宋體" lang="ZH-CN">在運行中當包含</font>TDDEClientConv<font
face="宋體" lang="ZH-CN">部件的窗口創建時</font></p>
<p><font face="宋體" lang="ZH-CN">聯接自動建立</p>
<p> </font>ddeManual <font face="宋體" lang="ZH-CN">只有當調用</font>OpenLink<font
face="宋體" lang="ZH-CN">方法時聯接才建立</font></p>
<p><font face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p>不同聯接模式,</font>DDE<font face="宋體" lang="ZH-CN">客戶程序的實現方式不同。</p>
<p>對于自動模式:</p>
</font><p>1. <font face="宋體" lang="ZH-CN">向窗體中加入</font>DDEClientConv<font
face="宋體" lang="ZH-CN">和</font>DDEClientItem<font face="宋體" lang="ZH-CN">部件并命名;</p>
</font><p>2. <font face="宋體" lang="ZH-CN">把</font>DDEClientItem<font face="宋體"
lang="ZH-CN">部件的</font>DdeConv<font face="宋體" lang="ZH-CN">屬性設置為</font>DDEClientConv<font
face="宋體" lang="ZH-CN">部件的名稱;</p>
<p>如果在設計時建立,則通過對象觀察器進行選擇;如果在運行時建立聯系,</font>
<font face="宋體" lang="ZH-CN">則通過如下的一條語句設置屬性的值: </p>
</font><p>DDEClientItem1.DdeConv := 'DDEClientConv1' ; </p>
<p>3. <font face="宋體" lang="ZH-CN">和服務器建立聯系,實現數據共享。</p>
<p>對于人工模式:</p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -