DELPHI基础教程:剪贴板和动态数据交换(一)[4]
DDE客户程序的实现
DDE客户程序启动DDE会话 向服务器请求并从服务器接收数据 同时还可以向服务器发送数据 命令 宏 改变服务器的状态并控制服务器的运行
联接模式(ConnectMode)
Delphi的DDE提供了两种联接模式 自动和人工 这可以通过DDEClinetConv 部件的ConnectMode属性进行设置 如下表所示
表 DDE的联接模式
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
值 意 义
───────────────────────────────
ddeAutomatic 在运行中当包含TDDEClientConv部件的窗口创建时联接自动建立
ddeManual 只有当调用OpenLink方法时联接才建立
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
不同联接模式 DDE客户程序的实现方式不同
对于自动模式
向窗体中加入DDEClientConv和DDEClientItem部件并命名
把DDEClientItem部件的DdeConv属性设置为DDEClientConv部件的名称 如果在设计时建立 则通过对象观察器进行选择 如果在运行时建立联系 则通过如下的一条语句设置属性的值 DDEClientItem DdeConv := 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中的DDEService DDETopic 属性包含了建立一个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( Excel System )
调用SetLink方法后 还需要设置DDEClientItem部件的DDEItem属性
比如 下面的语句联接Excel的Topics项目 用以获取当前活跃文件的文件名
DDEClietnItem DDEItem := Topics ;
当DDE联接建立后 联接的数据保存在DDEClientItem部件的Text和Lines 属性中 Text用于保存一个字符串(String) Lines用于保存一个字符串链表(TStrings)对象
为了显示联接数据 可以在DDEClientItem的OnChange事件中把数值赋给一个可视部件
下面的事件过程把联接数据实时地显示在一个编辑框中
procedure Form DDEClientItemChange(Sender: Tobject)
begin
Edit Text := DDEClientItem Text;
end;
运行状态下也可以从剪贴板上粘贴DDE联接信息 并调用SetLink建立DDE会话 下面的例子显示了当用户按下应用程序中的Paste Link按钮时 动态建立DDE会话的过程
procedure Form 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联接信息
数据申请
虽然自动模式快捷 方便 但仍有一些理由使用DDE的人工模式
服务器程序可能不支持自动数据传输 客户必须显式申请服务器更新一个特定的项目
节省通信费用 假如没有实时传输的要求 则人工模式可以大幅度降低通信的开销
若客户程序只用于控制服务器的运行 则往往没有必要使用自动模式
人工模式下客户程序的数据更新需要采用数据申请的方式 数据申请需要调用DDEClientConv部件的RequestData方法 RequestData有一个参数 指向要申请的DDE项目 RequestData返回一个Pchar类型的无结束符字符串 包含了申请到的文本 返回字符串占用的内存必须在程序终止前显式释放
在人工模式下 即使存在一个DDEClientItem部件且与DDEClientConv相联接 数据更新后DDEClientItem部件的Text Lines属性的值也不会改变
数据发送
数据发送与一般的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 Edit text)
DDEClientConv PokeData(DDEClientItem DDEItem TheText)
过程StrPCopy把一个Pascal类型的字符串拷贝到一个无结束符的PChar类型字符串中
返回目录 DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
Java程序性能优化 让你的Java程序更快 更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
lishixinzhi/Article/program/Delphi/201311/25231
2023-08-15 广告