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

如题所述

第1个回答  2022-10-18

   控制服务器应用程序的执行

  客户程序控制服务器应用程序的一个方面是 必要的时候客户程序可以启动服务器程序 并装载会话主题

  而客户程序控制服务器应用程序更重要的一点是向服务器发送服务器承认的宏命令 来完成对服务器应用程序的各种操作 服务器到底支持哪些宏命令 可参阅服务器应用程序文档

  发送宏命令要使用DDEClientConv的两个方法 ExecuteMacro和ExecuteMacroLines 它们的语法如下

  function ExecuteMacro(Cmd: PChar; WaitFlag: Boolean) Boolean;

  function ExecuteMacroLines(Cmd: TStrings;WaitFlag: Boolean) Boolean;

  Cmd是欲发送的宏命令字符串或宏命令字符串链表 WaitFlag决定了在DDE 服务器程序执行宏命令时客户程序的行为 如果WaitFlag设置为True 则在服务器宏命令执行完毕前 不允许对ExecuteMacro ExecuteMacroLines PokeData PokeDataLines这些方法的成功调用 它们都不向服务器发送数据并返回False 如果WaitFlag设置为False 则调用的方法在第一个宏执行完毕前即试图向服务器发送数据

  WaitFalg的设置也取决于服务器应用程序 一些应用程序当在第一个宏执行完之前就试图向它发送数据或命令时 可能导致第一个宏执行失败或导致不可预料的后果 具体情况可查阅服务器应用程序文档

  函数返回值表示命令串是否被成功传输 而宏命令执行是否成功客户是无法检测到的

   格式化文本

  DDEClientConv有一个布尔属性FormartChars 用于决定是否格式化文本 所谓格式化文本是指从传输来的文本数据中过滤掉BackSpace( ) Tab( ) Linefeed( ) Return( )等字符 括号内是字符的ASCII码 许多时候这些字符将导致DDE客户数据显示的混乱

  FormatChars的缺省值是False

   响应DDE事件

  部件DDEClientConv有两个事件OnOpen和OnClose 分别在DDE 会话建立和中止时触发 部件DDEClientItem有一个OnChange事件 这一事件常用于DDE项目数据的转储和显示 如( )节所示

  在自动模式下 OnOpen事件在包含DDEClientConv部件的窗口创建时触发 或在调用SetLink方法时触发 OnClose事件在客户程序或服务器程序关闭时触发

  在人工模式下 OnOpen事件在调用OpenLink 方法时触发 OnClose事件在调用ColseLink方法时触发

   利用客户程序和Excel交换数据

  下面我们建立一个DDE客户程序 并利用这一程序与Excel中的一个工作表交换数据 程序设计界面

  界面中包含一个DDE会话部件DDEClientConv 和DDE项目部件DDEClientItem 用于建立和维护DDE联接 一个RadioGroup控件和其中的两个无线电按钮AutoRadio ManualRadio 用于设置联接模式 一个GroupBox控件和其中的两个按钮RequestBtn和PokeBtn 用于控制数据的申请和发送 其中RequestBtn在自动模式下变灰 一个文本框Memo 用于保存DDE数据 一个按钮PasteBtn用于粘贴联接信息并建立DDE联接 另外一个按钮CloseBtn用于关闭系统

  设计时把DDEClientConv 的FormatChars属性置为True 这样可以保留服务器传来数据的显示格式 ConnectMode保留ddeAutomatic的缺省设置

  程序在类TForm 中定义了一个私有数据成员Automatic 用于标志联接模式 三个字符串数据成员DDEService DDETopic DDEItem用于记录联接信息

  窗口生成时进行变量和部件状态的初始化

  procedure TForm FormCreate(Sender: TObject)

  begin

  RequestBtn Enabled := False;

  AutoRadio Checked := True;

  Automatic := True;

  end;

  当联接模式改变时 程序进行相应的处理

  自动模式转换为人工模式

  procedure TForm ManualRadioClick(Sender: TObject)

  begin

  if Automatic then

  begin

  RequestBtn Enabled := ManualRadio Checked;

  DDEClientConv ConnectMode := ddeManual;

  Automatic := False;

  end;

  end;

  人工模式转换为自动模式

  procedure TForm AutoRadioClick(Sender: TObject)

  begin

  if not Automatic then

  begin

  RequestBtn Enabled := ManualRadio Checked;

  If (DDEService = ) or (DDETopic = ) then

  begin

  MessageDlg( Can not Set Link mtWarning [mbOK] )

  Exit;

  end;

  DDEClientConv SetLink (DDEService DDETopic)

  DDEClientItem DdeConv := DDEClientConv ;

  DDEClientItem DDEItem := DDEItem;

  DDEClientConv ConnectMode := ddeAutomatic;

  Automatic := True;

  end;

  end;

  当从自动模式转换到人工模式 只需要简单修改相应属性即可 而从人工模式转换到自动模式 则需要调用SetLink重新建立联接 否则往往会引发一个DDE异常

  联接的建立采用从剪贴板粘贴联接信息的方式 这是最具有灵活性的一种方法

  procedure TForm PasteBtnClick(Sender: TObject)

  begin

  if GetPasteLinkInfo (DDEService DDETopic DDEItem) then

  begin

  DDEClientConv SetLink (DDEService DDETopic)

  if Automatic then

  begin

  DDEClientItem DdeConv := DDEClientConv ;

  DDEClientItem DDEItem := DDEItem;

  end;

  end;

  end;

  GetPasteInfo是 DDEMan库单元中定义的一个函数 用于检测剪贴板上是否有联接信息并返回相应的DDE服务 主题和项目

  对于人工模式 必须由客户显式向服务器申请数据 在这种模式下DDE项目部件是多余的 接收到的DDE联接信息用一个字符串来记录 下面是实现代码

  procedure TForm RequestBtnClick(Sender: TObject)

  var

  TheData: PChar;

  begin

  If DDEItem = then

  begin

  MessageDlg( Can not Request Data mtWarning [mbOK] )

  Exit;

  end;

  TheData := StrAlloc( )

  DDEClientConv OpenLink;

  TheData := DDEClientConv RequestData(DDEItem)

  DDEClientConv CloseLink;

  if TheData <> nil then

  Memo Text := StrPas(TheData)

  StrDisPose(TheData)

  end;

  OpenLink CloseLink方法用于打开和关闭联接 RequestData方法向服务器申请数据并返回到一个PChar字符串中 字符串必须显式分配内存并在退出时释放

lishixinzhi/Article/program/Delphi/201311/25224

相似回答