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

7.3.2 和DDE服务器建立联系 

和DDE服务器建立联系,既可以在设计时进行,也可以在运行时进行。

在设计时,DDE联接可以通过剪贴板进行粘贴。具体步骤如下:

1. 激活服务器程序,并选中你的客户程序欲联接的数据;

2. 把数据和DDE联接信息拷贝到剪贴板上。一般说来这只需要选择服务器应用程序的 Edit|Copy 菜单;

3. 在Delphi IDE的设计窗体中选中DDEClientConv部件;

4. 在Object Inspector(对象观察器)中单击DDEService属性或DDETopic属性,然后再单击Ellipsis按钮,打开DDE Info对话框;

5.选择Paste Link按钮。此时App编辑框和Topic编辑框被自动填充。如果Paste Link按钮变灰,说明你准备用作服务器的应用程序不支持DDE或者DDE信息没有被成功地拷贝到剪贴板上;

6.选择OK 按钮。此时Object Inspector中的DDEService、DDETopic 属性包含了建立一个DDE联接的正确值。

对于人工模式以下步骤是不需要的。

7.选中DDEClientItem部件,并在Object Inspector中设置DdeConv属性为已完成联接的DDEClientConv部件名称;

8.假如剪贴板上的DDE 联接信息仍保留的话,从Object Inspector的下拉列表框中选择 DDEItem 属性的值。否则输入正确的值。

在运行时,调用 SetLink 方法来建立DDE联接。

SetLink有两个String类型的参数,分别用来接受DDEService和DDETopic的值。过程执行后DDEClientConv部件的DDEService 和DDeTopic属性被设置。要注意的是:在运行时直接设置DDEService和DDETopic的值并不能建立一个DDE联接,而必须调用SetLink 方法进行初始化。

比如,下面的语句和Excel的System主题建立联接: 

DDEClietnConv. SetLink('Excel','System'); 

调用SetLink方法后,还需要设置DDEClientItem部件的DDEItem属性。

比如,下面的语句联接Excel的Topics项目,用以获取当前活跃文件的文件名: 

DDEClietnItem.DDEItem := 'Topics'; 

当DDE联接建立后,联接的数据保存在DDEClientItem部件的Text和Lines 属性中,Text用于保存一个字符串(String),Lines用于保存一个字符串链表(TStrings)对象。

为了显示联接数据,可以在DDEClientItem的OnChange事件中把数值赋给一个可视部件。

下面的事件过程把联接数据实时地显示在一个编辑框中。

  procedure Form1.DDEClientItemChange(Sender: Tobject);

begin

Edit1.Text := DDEClientItem1.Text;

end; 

运行状态下也可以从剪贴板上粘贴DDE联接信息,并调用SetLink建立DDE会话。下面的例子显示了当用户按下应用程序中的Paste Link按钮时,动态建立DDE会话的过程。 

procedure Form1.OnPasteLink(Sender: Tobject);

var

Service, Topic, Item: String;

begin

if GetPasteLinkInfo (Service, Topic, Item) then

begin

AppName.Text := Service;

TopicName.Text := Topic;

ItemName.Text := Item;

DDEClient.SetLink (Service, Topic);

DDEClientItem.DdeConv := DDEClient;

DDEClientItem.DDEItem := ItemName.Text;

end;

end; 

GetPasteLinkInfo是DDEMan 库单元中定义的一个过程。如果返回True,则DDE联接信息保存在三个参数中;如果返回False,说明剪贴板上没有正确格式的DDE联接信息。 

7.3.3 数据申请 

虽然自动模式快捷、方便,但仍有一些理由使用DDE的人工模式:

1.服务器程序可能不支持自动数据传输,客户必须显式申请服务器更新一个特定的项目;

2.节省通信费用。假如没有实时传输的要求,则人工模式可以大幅度降低通信的开销;

3.若客户程序只用于控制服务器的运行,则往往没有必要使用自动模式。

人工模式下客户程序的数据更新需要采用数据申请的方式。数据申请需要调用DDEClientConv部件的RequestData方法。RequestData有一个参数,指向要申请的DDE项目。RequestData返回一个Pchar类型的无结束符字符串,包含了申请到的文本。返回字符串占用的内存必须在程序终止前显式释放。

在人工模式下,即使存在一个DDEClientItem部件且与DDEClientConv相联接,数据更新后DDEClientItem部件的Text、Lines属性的值也不会改变。 

7.3.4 数据发送 

数据发送与一般的DDE数据流向正好相反,是把数据从DDE客户应用程序发送到DDE服务器应用程序。

数据发送使用DDEClientConv部件的两个方法PokeData 和 PokeDataLines, 它们的语法是: 

function PokeData (Item: String ; Data: PChar): Boolean;

function PokeDataLines (Item: String ; Data: TStrings): Boolean; 

参数Item是DDE服务器中被联接的项目,Data是要发送的数据。如果数据是一个字符串,则把它转化为PChar类型并调用PokeData方法;如果数据是一个字符串链表对象,可调用PokeDataLines方法。

方法的返回值标志数据传送是否成功。因为有一些DDE服务器应用程序并不接收发送的数据。

下面的语句把编辑框中的内容发送给服务器: 

StrPCopy(TheText , Edit1.text);

DDEClientConv1.PokeData(DDEClientItem1.DDEItem , TheText); 

过程StrPCopy把一个Pascal类型的字符串拷贝到一个无结束符的PChar类型字符串中。 

时间: 2024-09-16 08:22:33

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

第七章-剪贴板和动态数据交换(一)(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

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

消息响应过程WMChangeCBChain在剪贴板观察器链上其它观察器退出时被调用.根据被移出观察器的不同位置决定了不同的处理方法. procedure TClipSaveForm.WMChangeCBChain(var Msg: TWMChangeCBChain); begin if Msg.Remove = NextViewerHandle then NextViewerHandle := Msg.Next else if NextViewerHandle <> 0 then SendMe

第七章-剪贴板和动态数据交换(一)(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(程序组名,显示标志)