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