第七章-剪贴板和动态数据交换(一)(5)

消息响应过程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方法申请并获得数据。 

时间: 2024-09-11 23:24:53

第七章-剪贴板和动态数据交换(一)(5)的相关文章

第七章-剪贴板和动态数据交换(一)(1)

应用程序间的数据交换是象Windows这样的多任务环境的重要特性.作为一种基于Windows的开发工具,Delphi支持如下四种数据交换方式:剪贴板.动态数据交换(DDE).对象联接与嵌入(OLE)以及动态联接库(DLLs).这中间前三种方式最为常用,OLE功能最为强大,DDE次之.而剪贴板使用最为方便.在本章,我们只讨论剪贴板和动态数据交换.利用OLE实现数据交换见下一章,利用动态联接库(DLLs)进行数据交换将在第十章中介绍. 7.1剪贴板及其应用 本质上,剪贴板只是一个全局内存块.当一个应

第七章-剪贴板和动态数据交换(二)(5)

DDE联接的建立通过调用SetLink方法实现. 建立新联接的实现代码如下. procedure TFormD.doNewLink(Sender: TObject); begin DDEClient.SetLink (AppName.Text, TopicName.Text); DDEClientItem.DdeConv := DDEClient; DDEClientItem.DDEItem := ItemName.Text; end; 通过从剪贴板粘贴联接信息来建立联接的实现代码如下. pro

第七章-剪贴板和动态数据交换(一)(3)

7.1.3.3 粘贴 从剪贴板上粘贴图像,首先检测剪贴板上的数据格式.如果格式为CF_BITMAP,则调用目标位图的Assign 方法粘贴图像. 程序清单如下. procedure TForm1.PasteButtonClick(Sender: TObject); var Bitmap: TBitmap; begin if Clipboard.HasFormat(CF_BITMAP) then begin Bitmap := TBitmap.Create; try Bitmap.Assign(C

第七章-剪贴板和动态数据交换(二)(4)

7.4 DDE服务器程序的实现 DDE服务器程序响应DDE客户的请求,一般地它包含了客户程序希望获取的数据. 创建一个DDE服务器程序,必须要把一个DDEServerItem部件添加到窗体中.DDEServerItem的text或Lines属性包含了要联接的数据.一般地 DDEServerItem部件又和另一个文本控件相联系.当文本控件中的内容变化时则更新DDEServerItem 的text或Lines属性的值.下面的一段程序把DDEServerItem和一个列表框相联系.这一联系是在列表框的

第七章-剪贴板和动态数据交换(二)(2)

7.3.8 利用客户程序和Excel交换数据 下面我们建立一个DDE客户程序,并利用这一程序与Excel中的一个工作表交换数据.程序设计界面 界面中包含一个DDE会话部件DDEClientConv1和DDE项目部件DDEClientItem1,用于建立和维护DDE联接:一个RadioGroup控件和其中的两个无线电按钮AutoRadio.ManualRadio,用于设置联接模式:一个GroupBox控件和其中的两个按钮RequestBtn和PokeBtn,用于控制数据的申请和发送,其中Reque

第七章-剪贴板和动态数据交换(一)(6)

7.3.2 和DDE服务器建立联系 和DDE服务器建立联系,既可以在设计时进行,也可以在运行时进行. 在设计时,DDE联接可以通过剪贴板进行粘贴.具体步骤如下: 1. 激活服务器程序,并选中你的客户程序欲联接的数据: 2. 把数据和DDE联接信息拷贝到剪贴板上.一般说来这只需要选择服务器应用程序的 Edit|Copy 菜单: 3. 在Delphi IDE的设计窗体中选中DDEClientConv部件: 4. 在Object Inspector(对象观察器)中单击DDEService属性或DDET

第七章-剪贴板和动态数据交换(一)(4)

为解决这些问题,我开发了下面的程序.程序启动时,以极小化方式运行.此时只要剪贴板中存入位图,则自动弹出一个对话框请求用户保存.如果用户希望查看确认,则可以双击运行程序图标,选择相应按钮,剪贴板中的位图就会显示在屏幕上. 部件关键属性设计如下: ClipSaveForm: Caption='Save Bitmap in Clipboard ' Panel1: Align = ' Top ' Image1: Align = ' Client ' SaveDialog1: FileEditStyle

第七章-剪贴板和动态数据交换(一)(2)

表 7.3 TClipboard的方法 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 方 法 参 数 意 义 ───────────────────────────────────── Clear 无 清除剪贴板的内容 Assign Source:TPersistent 把Source参数指定的对象拷贝到剪贴板,常 用于图形.图像对象 Open 无打开剪贴板,阻止其它应用程序改变它的内容 Close 无 关闭打开的剪贴板 SetComponent Source:TP

第七章-剪贴板和动态数据交换(二)(3)

7.3.9 用客户程序控制程序管理器 下面的例子用客户程序向程序管理器发送命令,用于创建程序组.程序项以及删除程序组. 程序管理器提供了应用程序的DDE接口命令字符串,应用程序利用这些命令字符串可以实现以下的功能: 1.创建程序组 命令格式为: CreateGroup(程序组名[,程序组所在的路径]) 程序组不存在时进行创建:如程序组存在则按照指定的路径激活. 2.删除程序组 命令格式为: DeleteGroup(程序组名) 3.显示程序组 命令格式为: ShowGroup(程序组名,显示标志)