procedure TClipSaveFormFormCreate(Sender: TObject)
begin
View := False;
SpeedButtonDown := True;
MyBitmap := TBitmapcreate;
try
MyBitmapWidth := ;
MyBitmapHeight := ;
except
Applicationterminate;
end;
ClipboardClear;
NextViewerHandle := SetClipboardViewer(Handle)
end;
窗口關閉時退出剪貼板觀察器鏈並釋放內存
procedure TClipSaveFormFormDestroy(Sender: TObject)
begin
ChangeClipboardChain(HandleNextViewerHandle)
MyBitmapFree;
end;
在以上兩段程序中用到的兩個Windows API函數SetClipboardViewer和ChangeClipboardChain分別用於登錄和退出剪貼板觀察器鏈
程序保存位圖的功能是在消息響應過程WMDrawClipboard中實現的該過程在剪貼板內容有變化時被調用
procedure TClipSaveFormWMDrawClipboard(var Msg: TWMDrawClipboard)
var
FileName: String;
begin
If NextViewerHandle <> then
SendMessage(NextViewerHandlemsgMsg)
If ClipBoardHasFormat(CF_BITMAP) then
begin
MyBitmapAssign(Clipboard)
If SaveDialogExecute then
begin
FileName := SaveDialogFileName;
MyBitmapSaveToFile(FileName)
end;
If View then
begin
WindowState := wsNormal;
ImagePictureBitmap := MyBitmap;
end;
end;
MsgResult := ;
end;
程序首先判斷在剪貼板觀察器鏈中是否還存在下一個觀察器如果有則把消息傳遞下去這是剪貼板觀察器程序的義務而後判斷剪貼板上內容的格式是否為位圖如是則首先把剪貼板上內容保存到數據成員MyBitmap中並激活一個文件保存對話框把位圖保存到文件中如果View=True則把窗口狀態(WindowState)設置為wsNormal並把MyBitmap賦給Image部件的相應值使用戶可以對剪貼板上的位圖進行觀察
消息響應過程WMChangeCBChain在剪貼板觀察器鏈上其它觀察器退出時被調用根據被移出觀察器的不同位置決定了不同的處理方法
procedure TClipSaveFormWMChangeCBChain(var Msg: TWMChangeCBChain)
begin
if MsgRemove = NextViewerHandle then
NextViewerHandle := MsgNext
else
if NextViewerHandle <> then
SendMessage(NextViewerHandleMsgMsgMsgRemoveMsgNext)
MsgResult := ;
end;
窗口上有兩個加速按鈕兩個按鈕它們擊鍵(click)事件處理過程如下每一程序段的意義是非常顯然的
procedure TClipSaveFormButtonClick(Sender: TObject)
begin
Close;
end;
procedure TClipSaveFormButtonClick(Sender: TObject)
begin
WindowState := wsMinimized;
end;
procedure TClipSaveFormSpeedButtonClick(Sender: TObject)
begin
View := True;
ImagePictureBitmap := MyBitmap;
end;
procedure TClipSaveFormSpeedButtonClick(Sender: TObject)
begin
View := False;
ImagePictureBitmap := nil;
end;
通過對這個程序的介紹以下幾點是應該注意的
提供了一種自己截獲和處理剪貼板上內容的方法讀者可以根據需要進一步擴充
提供了響應Windows消息的方法在第三篇有關自定義部件開發的內容中這一問題還要詳細論述
最後的一點啟示是在Delphi程序開發中巧妙應用傳統的Windows方法(如消息處理 API函數等)仍是很有必要的而在應用這些方法中所體現的方便之處正是Delphi勝過其它可視化開發工具的一個重要方面
Windows的DDE原理和 Dephi的DDE實現機制
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管理庫(ddemldll)可以一定程度上減輕開發者的工作負擔但開發DDE程序仍不是一件輕松的事情
此時Delphi出現了!Delphi通過其自身巧妙的設計使開發一個DDE應用程序同開發一個普通程序一樣地快捷方便
Delphi的DDE實現機制簡介
Delphi把所有的DDE功能做到四個部件中它們是
● TDDEClientConv : 用於客戶程序建立和維護一個DDE會話
● TDDEClientItem : 用於客戶程序建立和維護數據交換通道
● TDDEServerConv : 用於服務器程序響應DDE會話
● TDDEServerItem : 用於服務器程序維護數據交換通道
前兩個部件用於生成一個DDE客戶程序後兩個部件用於生成一個DDE服務器程序如果一個應用程序同時擁有這些部件則這一程序既可以充當DDE客戶也可以充當DDE服務器
會話部件TDDEClientConvTDDEServerConv用於建立和維護一個DDE會話DDE會話包括DDE服務和DDE主題兩部分
DDE服務是DDE服務器的名稱即在一般的Windows DDE機制中所講的應用程序名一般說來這一名稱是DDE服務器應用程序執行文件名去掉 EXE後綴比如你的應用程序要和Word 建立會話則DDE服務為WINWORD但也不盡然比如你的應用程序要和Borland ReportSmith ( RPTSMITHEXE ) 建立會話則DDE 服務為 Report SmithDDE服務到底如何讀者可參看相關的DDE服務器應用程序文檔
DDE主題是一個包含了聯接信息的數據單元一般說來DDE 主題是一個包括擴展名的完整文件名例如和Excel中的一個文件建立DDE會話則主題可能是
Topic = c:\excel\Example\salexls
如果服務器是一個Delphi應用程序缺省情況下主題是包含欲聯接數據窗體的標題如果服務器使用了DDEServerConv部件則要求使用部件DDEServerConv的名稱作為DDE主題
項目部件TDDEclientItemTDDEServerItem用於建立和維護DDE數據的傳輸通道 DDE項目中包含著實際欲傳輸的數據DDE項目的格式取決於DDE服務器應用程序一個可能的DDE項目例子是電子表格中的單元和數據庫表中的域如果服務器是Delphi應用程序則項目是連接的 DDEServerItem部件的名稱
Delphi的DDE實現機制方便實用但也有一個令人遺憾的缺陷只能傳輸文本數據以及命令宏而不能傳輸圖像數據在這一點上微軟公司推出的Visual Basic 要略勝一籌不過在目前文本數據的使用仍是最廣泛的而且圖像傳輸可以利用剪貼板和OLE來實現則這一缺陷也並無很大的影響
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25230.html