Welcome

首页 / 软件开发 / Delphi / 第七章-剪贴板和动态数据交换(二)(3)

第七章-剪贴板和动态数据交换(二)(3)2007-05-077.3.9 用客户程序控制程序管理器

下面的例子用客户程序向程序管理器发送命令,用于创建程序组、程序项以及删除程序组。

程序管理器提供了应用程序的DDE接口命令字符串,应用程序利用这些命令字符串可以实现以下的功能:

1.创建程序组

命令格式为:

CreateGroup(程序组名[,程序组所在的路径])

程序组不存在时进行创建;如程序组存在则按照指定的路径激活。

2.删除程序组

命令格式为:

DeleteGroup(程序组名)

3.显示程序组

命令格式为;

ShowGroup(程序组名,显示标志)

显示标志用于控制程序组在程序管理器中以极大、极小或正常方式显示。

4.重新装入程序组

命令格式为:

ReLoadGroup(程序组名)

该命令使程序管理器先删除而后再重新装入一个已有的程序组。

5.向程序组中添加程序项

命令格式为:

AddItem(命令行[,描述[,图标路径[,图标序号[,图标横坐标,图标纵坐标[,工作区目录[,热键[,是否最小化显示标志]]]]]]])

命令行控制程序项的执行,可包括路径、参数等。其它参数分别对应在程序管理器中添加一个程序项时需要设置的参数和选项。它们都有缺省设置,因而是可选的。

6.替换程序组中的程序项

命令格式为:

ReplaceItem(程序项名)

该命令删除一个程序项,并将所删除程序项的位置记录下来,以后通过AddItem在这个所记录的位置增加新项目。

7.从程序组中删除程序项

命令格式为:

DeleteItem(程序项名)

从当前活动程序组中删除一个程序项。

8.关闭程序管理器

命令格式为:

ExitProgram(是否保存程序组信息标志)

从应用程序向程序管理器发送命令字符串的方法是基本一致的。为简便起见,在例程中只实现了其中仅包含一个字符串参数的情形,读者可以很容易作进一步的扩展。

程序设计界面如图所示,包含一个DDE客户会话(DDEClientConv)部件和四个完成不同功能的按钮。

DDEClientConv在设计时和程序管理器建立一个DDE会话,其中DDE服务器和DDE主题 都为PROGMAN。联接模式ConnectMode设置为ddeManual。

我们把只有一个字符串参数的命令发送情况抽象出来,形成下面的SendMacro函数。

function TForm1.SendMacro(Name: String;Command: String): Boolean;

var

Macro: String;

Cmd: array[0..255] of Char;

begin

Result := True;

if Name <> "" then

begin

Macro := Format("["+Command+"(%s)]", [Name]) + #13#10;

StrPCopy (Cmd, Macro);

DDEClient.OpenLink;

if not DDEClient.ExecuteMacro(Cmd, False) then

Result := False;

DDEClient.CloseLink;

end;

end;

过程首先利用Format函数形成宏字符串:

Macro := Format("["+Command+"(%s)]", [Name]) + #13#10;

而后把Pascal类型的字符串拷贝到一个程序管理器可接受的PChar类型字符串中。

DDE联接采用人工模式。首先调用OpenLink方法。而后调用ExecuteMacro方法发送命令,如失败则返回False。最后用CloseLink关闭联接。

三个按钮CreateButton、AddButton、DeleteButton分别用于创建程序组、添加程序项、删除程序组。它们的程序实现大同小异,如下所示。

创建程序组:

procedure TForm1.CreateButtonClick(Sender: TObject);

var

Name: String;

begin

Name := InputBox("Input Box","Input Group Name","");

if Name = "" then

MessageDlg("Group name can not be blank.", mtError, [mbOK], 0)

else

if SendMacro(Name,"CreateGroup") = False then

MessageDlg("Unable to create group.", mtInformation, [mbOK], 0);

end;

添加程序项:

procedure TForm1.AddButtonClick(Sender: TObject);

var

Name: String;

begin

Name := InputBox("Input Box","Input Application full_Path name","");

if Name = "" then

MessageDlg("Application name can not be blank.", mtError, [mbOK], 0)

else

if SendMacro(Name,"AddItem") = False then

MessageDlg("Unable to Add Item.", mtInformation, [mbOK], 0);

end;

删除程序组:

procedure TForm1.DeleteButtonClick(Sender: TObject);

var

Name: String;

begin

Name := InputBox("Input Box","Input Group Name to be Deleted","");

if Name = "" then

MessageDlg("Group name can not be blank.", mtError, [mbOK], 0)

else

if SendMacro(Name,"DeleteGroup") = False then

MessageDlg("Unable to create group.", mtInformation, [mbOK], 0);

end;