数据发送在不同联接模式下是不同的对于人工模式增加了联接的打开和关闭操作程序清单如下
procedure TFormPokeBtnClick(Sender: TObject)
begin
If DDEItem = then
begin
MessageDlg(Can not Poke DatamtWarning[mbOK])
Exit;
end;
if Automatic then
DDEClientConvPokeDataLines(DDEItemMemoLines)
else
begin
DDEClientConvOpenLink;
DDEClientConvPokeDataLines(DDEItemMemoLines)
DDEClientConvCloseLink;
end;
end;
打开Microsoft Office中的Excel装入一个文件把相关的单元选中拷贝到剪贴板上而后运行程序按下Paste Link按钮DDE联接就建立起来相关单元中的数据显示在Memo中之后可以进行模式转换数据申请申请发送等一系列工作运行后的屏幕显示如下图所示
用客户程序控制程序管理器
下面的例子用客户程序向程序管理器发送命令用于创建程序组程序项以及删除程序组
程序管理器提供了应用程序的DDE接口命令字符串应用程序利用这些命令字符串可以实现以下的功能
创建程序组
命令格式为
CreateGroup(程序组名[程序组所在的路径])
程序组不存在时进行创建如程序组存在则按照指定的路径激活
删除程序组
命令格式为
DeleteGroup(程序组名)
显示程序组
命令格式为
ShowGroup(程序组名显示标志)
显示标志用于控制程序组在程序管理器中以极大极小或正常方式显示
重新装入程序组
命令格式为
ReLoadGroup(程序组名)
该命令使程序管理器先删除而后再重新装入一个已有的程序组
向程序组中添加程序项
命令格式为
AddItem(命令行[描述[图标路径[图标序号[图标横坐标图标纵坐标[工作区目录[热键[是否最小化显示标志]]]]]]])
命令行控制程序项的执行可包括路径参数等其它参数分别对应在程序管理器中添加一个程序项时需要设置的参数和选项它们都有缺省设置因而是可选的
替换程序组中的程序项
命令格式为
ReplaceItem(程序项名)
该命令删除一个程序项并将所删除程序项的位置记录下来以后通过AddItem在这个所记录的位置增加新项目
从程序组中删除程序项
命令格式为
DeleteItem(程序项名)
从当前活动程序组中删除一个程序项
关闭程序管理器
命令格式为
ExitProgram(是否保存程序组信息标志)
从应用程序向程序管理器发送命令字符串的方法是基本一致的为简便起见在例程中只实现了其中仅包含一个字符串参数的情形读者可以很容易作进一步的扩展
程序设计界面如图所示包含一个DDE客户会话(DDEClientConv)部件和四个完成不同功能的按钮
DDEClientConv在设计时和程序管理器建立一个DDE会话其中DDE服务器和DDE主题 都为PROGMAN联接模式ConnectMode设置为ddeManual
我们把只有一个字符串参数的命令发送情况抽象出来形成下面的SendMacro函数
function TFormSendMacro(Name: String;Command: String) Boolean;
var
Macro: String;
Cmd: array[] of Char;
begin
Result := True;
if Name <> then
begin
Macro := Format([+Command+(%s)] [Name]) + ##;
StrPCopy (Cmd Macro)
DDEClientOpenLink;
if not DDEClientExecuteMacro(Cmd False) then
Result := False;
DDEClientCloseLink;
end;
end;
过程首先利用Format函数形成宏字符串
Macro := Format([+Command+(%s)] [Name]) + ##;
而后把Pascal类型的字符串拷贝到一个程序管理器可接受的PChar类型字符串中
DDE联接采用人工模式首先调用OpenLink方法而后调用ExecuteMacro方法发送命令如失败则返回False最后用CloseLink关闭联接
三个按钮CreateButtonAddButtonDeleteButton分别用于创建程序组添加程序项删除程序组它们的程序实现大同小异如下所示
创建程序组
procedure TFormCreateButtonClick(Sender: TObject)
var
Name: String;
begin
Name := InputBox(Input BoxInput Group Name)
if Name = then
MessageDlg(Group name can not be blank mtError [mbOK] )
else
if SendMacro(NameCreateGroup) = False then
MessageDlg(Unable to create group mtInformation [mbOK] )
end;
[] [] [] []