首页 / 软件开发 / Delphi / 第七章-剪贴板和动态数据交换(一)(6)
第七章-剪贴板和动态数据交换(一)(6)2007-05-077.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);beginEdit1.Text := DDEClientItem1.Text;end; 运行状态下也可以从剪贴板上粘贴DDE联接信息,并调用SetLink建立DDE会话。下面的例子显示了当用户按下应用程序中的Paste Link按钮时,动态建立DDE会话的过程。 procedure Form1.OnPasteLink(Sender: Tobject);varService, Topic, Item: String;beginif GetPasteLinkInfo (Service, Topic, Item) thenbeginAppName.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类型字符串中。