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类型字符串中。