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来实现则这一缺陷也并无很大的影响
[] [] [] []