7.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;