控制服务器应用程序的执行
客户程序控制服务器应用程序的一个方面是必要的时候客户程序可以启动服务器程序并装载会话主题
而客户程序控制服务器应用程序更重要的一点是向服务器发送服务器承认的宏命令来完成对服务器应用程序的各种操作服务器到底支持哪些宏命令可参阅服务器应用程序文档
发送宏命令要使用DDEClientConv的两个方法 ExecuteMacro和ExecuteMacroLines 它们的语法如下
function ExecuteMacro(Cmd: PChar; WaitFlag: Boolean) Boolean;
function ExecuteMacroLines(Cmd: TStrings;WaitFlag: Boolean) Boolean;
Cmd是欲发送的宏命令字符串或宏命令字符串链表WaitFlag决定了在DDE 服务器程序执行宏命令时客户程序的行为如果WaitFlag设置为True则在服务器宏命令执行完毕前不允许对ExecuteMacroExecuteMacroLinesPokeDataPokeDataLines这些方法的成功调用它们都不向服务器发送数据并返回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控件和其中的两个无线电按钮AutoRadioManualRadio用于设置联接模式一个GroupBox控件和其中的两个按钮RequestBtn和PokeBtn用于控制数据的申请和发送其中RequestBtn在自动模式下变灰一个文本框Memo用于保存DDE数据一个按钮PasteBtn用于粘贴联接信息并建立DDE联接另外一个按钮CloseBtn用于关闭系统
设计时把DDEClientConv的FormatChars属性置为True这样可以保留服务器传来数据的显示格式ConnectMode保留ddeAutomatic的缺省设置
程序在类TForm中定义了一个私有数据成员Automatic用于标志联接模式三个字符串数据成员DDEServiceDDETopicDDEItem用于记录联接信息
窗口生成时进行变量和部件状态的初始化
procedure TFormFormCreate(Sender: TObject)
begin
RequestBtnEnabled := False;
AutoRadioChecked := True;
Automatic := True;
end;
当联接模式改变时程序进行相应的处理
自动模式转换为人工模式
procedure TFormManualRadioClick(Sender: TObject)
begin
if Automatic then
begin
RequestBtnEnabled := ManualRadioChecked;
DDEClientConvConnectMode := ddeManual;
Automatic := False;
end;
end;
人工模式转换为自动模式
procedure TFormAutoRadioClick(Sender: TObject)
begin
if not Automatic then
begin
RequestBtnEnabled := ManualRadioChecked;
If (DDEService = ) or (DDETopic = ) then
begin
MessageDlg( Can not Set LinkmtWarning[mbOK])
Exit;
end;
DDEClientConvSetLink (DDEService DDETopic)
DDEClientItemDdeConv := DDEClientConv;
DDEClientItemDDEItem := DDEItem;
DDEClientConvConnectMode := ddeAutomatic;
Automatic := True;
end;
end;
当从自动模式转换到人工模式只需要简单修改相应属性即可而从人工模式转换到自动模式则需要调用SetLink重新建立联接否则往往会引发一个DDE异常
联接的建立采用从剪贴板粘贴联接信息的方式这是最具有灵活性的一种方法
procedure TFormPasteBtnClick(Sender: TObject)
begin
if GetPasteLinkInfo (DDEService DDETopic DDEItem) then
begin
DDEClientConvSetLink (DDEService DDETopic)
if Automatic then
begin
DDEClientItemDdeConv := DDEClientConv;
DDEClientItemDDEItem := DDEItem;
end;
end;
end;
GetPasteInfo是 DDEMan库单元中定义的一个函数用于检测剪贴板上是否有联接信息并返回相应的DDE服务主题和项目
对于人工模式必须由客户显式向服务器申请数据在这种模式下DDE项目部件是多余的接收到的DDE联接信息用一个字符串来记录下面是实现代码
procedure TFormRequestBtnClick(Sender: TObject)
var
TheData: PChar;
begin
If DDEItem = then
begin
MessageDlg(Can not Request DatamtWarning[mbOK])
Exit;
end;
TheData := StrAlloc()
DDEClientConvOpenLink;
TheData := DDEClientConvRequestData(DDEItem)
DDEClientConvCloseLink;
if TheData <> nil then
MemoText := StrPas(TheData)
StrDisPose(TheData)
end;
OpenLinkCloseLink方法用于打开和关闭联接RequestData方法向服务器申请数据并返回到一个PChar字符串中字符串必须显式分配内存并在退出时释放
[] [] [] []