其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

DELPHI基础教程:剪贴板和动态数据交换(一)[4]


发布日期:2020年07月04日
 
DELPHI基础教程:剪贴板和动态数据交换(一)[4]

DDE客户程序的实现

DDE客户程序启动DDE会话向服务器请求并从服务器接收数据同时还可以向服务器发送数据命令改变服务器的状态并控制服务器的运行

联接模式(ConnectMode)

Delphi的DDE提供了两种联接模式自动和人工这可以通过DDEClinetConv 部件的ConnectMode属性进行设置如下表所示

DDE的联接模式

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

值 意 义

───────────────────────────────

ddeAutomatic 在运行中当包含TDDEClientConv部件的窗口创建时联接自动建立

ddeManual 只有当调用OpenLink方法时联接才建立

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

不同联接模式DDE客户程序的实现方式不同

对于自动模式

向窗体中加入DDEClientConv和DDEClientItem部件并命名

把DDEClientItem部件的DdeConv属性设置为DDEClientConv部件的名称如果在设计时建立则通过对象观察器进行选择如果在运行时建立联系 则通过如下的一条语句设置属性的值DDEClientItemDdeConv := DDEClientConv ;

和服务器建立联系实现数据共享

对于人工模式

向窗体中加入DDEClientConv部件

和服务器建立联系

数据更新时调用RequestData方法申请并获得数据

和DDE服务器建立联系

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

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

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

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

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

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

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

选择OK 按钮此时Object Inspector中的DDEServiceDDETopic 属性包含了建立一个DDE联接的正确值

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

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

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

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

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

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

DDEClietnConv SetLink(ExcelSystem

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

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

DDEClietnItemDDEItem := Topics;

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

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

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

procedure FormDDEClientItemChange(Sender: Tobject)

begin

EditText := DDEClientItemText;

end;

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

procedure FormOnPasteLink(Sender: Tobject)

var

Service Topic Item: String;

begin

if GetPasteLinkInfo (Service Topic Item) then

begin

AppNameText := Service;

TopicNameText := Topic;

ItemNameText := Item;

DDEClientSetLink (Service Topic)

DDEClientItemDdeConv := DDEClient;

DDEClientItemDDEItem := ItemNameText;

end;

end;

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

数据申请

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

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

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

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

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

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

数据发送

数据发送与一般的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 Edittext)

DDEClientConvPokeData(DDEClientItemDDEItem TheText)

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

返回目录DELPHI基础教程

编辑推荐

Java程序设计培训视频教程

JEE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLEG数据库开发优化指南

Java程序性能优化让你的Java程序更快更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

[] [] [] []

               

上一篇:DELPHI基础教程:文件管理(三)[1]

下一篇:DELPHI基础教程:剪贴板和动态数据交换(一)[3]