創(chuàng)建程序組:
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;
添加程序項(xiàng):
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;
7.4 DDE服務(wù)器程序的實(shí)現(xiàn)
DDE服務(wù)器程序響應(yīng)DDE客戶的請(qǐng)求,一般地它包含了客戶程序希望獲取的數(shù)據(jù)。
創(chuàng)建一個(gè)DDE服務(wù)器程序,必須要把一個(gè)DDEServerItem部件添加到窗體中。DDEServerItem的text或Lines屬性包含了要聯(lián)接的數(shù)據(jù)。一般地 DDEServerItem部件又和另一個(gè)文本控件相聯(lián)系。當(dāng)文本控件中的內(nèi)容變化時(shí)則更新DDEServerItem 的text或Lines屬性的值。下面的一段程序把DDEServerItem和一個(gè)列表框相聯(lián)系。這一聯(lián)系是在列表框的OnChange事件中實(shí)現(xiàn)。
procedure Form1.OnListBoxChange(Sender: TObject);
begin
DDEServerItem1.Lines := ListBox1.Items;
end;
創(chuàng)建DDE服務(wù)器程序時(shí)也可以再加入一個(gè)DDEServerConv部件,并把兩個(gè)部件利用DDEServerItem的ServerConv屬性聯(lián)系起來。此時(shí)DDE主題成為部件DDEServerConv的名稱,而不是擁有DDEServerItem部件窗體的標(biāo)題。
在下列情況下使用DDEServerConv部件成為必要:
1.擁有DDEServerItem 部件窗體的標(biāo)題可能在運(yùn)行時(shí)改變或可能有其它窗體擁有同樣的標(biāo)題。在這種情況下DDE聯(lián)接可能無法建立;
2.DDE客戶程序可能會(huì)向你的服務(wù)器程序發(fā)送一條宏命令。在這種情況下只有擁有一個(gè)DDEServerConv部件才能響應(yīng)OnMacroExecute事件并執(zhí)行相應(yīng)的動(dòng)作。
7.4.1 和DDE客戶程序建立聯(lián)接
一般說來,建立DDE聯(lián)接是客戶程序的任務(wù)。但服務(wù)器程序可以把一個(gè)聯(lián)接拷貝到剪貼板上供客戶程序粘貼并建立DDE會(huì)話。步驟如下:
1.調(diào)用DDEServerItem部件的CopyToClipboard方法, 把Text(或Lines)屬性的值和DDE聯(lián)接信息拷貝到剪貼板上;
2.DDE客戶程序插入聯(lián)接的數(shù)據(jù)。一般地這是通過選擇適當(dāng)?shù)拿?如Edit|Paste Special或Edit|Paste Link)來實(shí)現(xiàn)的。
7.4.2 響應(yīng)DDE事件
部件DDEServerConv有三個(gè)事件:OnOpen、OnClose、OnExecuteMacro。前兩個(gè)事件在DDE會(huì)話建立和終止時(shí)觸發(fā)。同(7.3.7)中的介紹。
OnExecuteMacro事件用于響應(yīng)客戶程序發(fā)送過來的宏指令。OnExecuteMacro事件處理過程有一個(gè)Msg參數(shù),保存發(fā)送過來的指令串。用戶可以在該過程中決定如何響應(yīng)這些宏指令。
DDEServerItem部件只有一個(gè)事件OnPokeData。這一事件用于響應(yīng)客戶程序發(fā)送來的數(shù)據(jù)。如果客戶程序是Delphi程序,則客戶程序調(diào)用了PokeData或PokeDataLines方法。在這一事件的處理過程中用戶可以把發(fā)送來的數(shù)據(jù)保存到一個(gè)合適的地方。一般說來這應(yīng)該就是DDEServerItem所聯(lián)系的文本控件。
下面的程序把發(fā)送來的數(shù)據(jù)保存到ListBox中。
procedure Form1.OnDDEServerItemPokeData(Serder: TObject);
begin
ListBox1.Items := DDEServerItem1.Lines;
end;
7.4.3 DDE服務(wù)器應(yīng)用例程
下面我們創(chuàng)建一個(gè)DDE服務(wù)器例程和一個(gè)相應(yīng)的DDE客戶例程。
DDE服務(wù)器例程可以完成的工作有:
1.把DDE聯(lián)接信息拷貝到剪貼板上供其它程序使用;
2.利用一個(gè)TMemo部件為其它程序提供數(shù)據(jù)源;
3.接收客戶程序發(fā)送來的數(shù)據(jù);
4.根據(jù)客戶程序發(fā)送來的宏指令改變自身的運(yùn)行狀態(tài)。
其中各部件的關(guān)鍵屬性如下:
DDESrvrForm.ActiveControl = Memo1
DDESrvrForm.Menu = MainMenu1
Bevel1.Align = alTop
Memo1.Align = alClient
DDETestItem.ServerConv = DDETestTopic
通過設(shè)置Bevel1、Memo1的Align屬性,可以保證窗口大小變化時(shí)仍能有較為美觀的屏幕顯示。
Memo1是服務(wù)器的數(shù)據(jù)源,DDE項(xiàng)目部件DDETestItem通過Memo1的OnChange事件與Memo1 建立聯(lián)系。
procedure TDdeSrvrForm.doOnChange(Sender: TObject);
begin
if not FInPoke then
DDETestItem.Lines := Memo1.Lines;
end;
其中FInPoke是一個(gè)布爾類型的私有數(shù)據(jù)成員,用于標(biāo)志程序是否在處理客戶程序的數(shù)據(jù)發(fā)送。當(dāng)數(shù)據(jù)是由客戶發(fā)送過來轉(zhuǎn)存到數(shù)據(jù)源時(shí),則沒有必要再把數(shù)據(jù)傳給DDE項(xiàng)目部件。
把聯(lián)接信息拷貝到剪貼板,只需簡(jiǎn)單調(diào)用DDETestItem的CopyToClipboard方法。
procedure TDDESrvrForm.CopyClick(Sender: TObject);
begin
DDETestItem.CopyToClipboard;
end;
這是通過菜單項(xiàng)Edit|Copy來調(diào)用的。
接收客戶程序發(fā)送來的數(shù)據(jù),是在DDETestItem的OnPokeData事件處理過程中。在接收過程中改變FInPoke的值,以阻止數(shù)據(jù)的無效反送。
procedure TDDESrvrForm.doOnPoke(Sender: TObject);
begin
FInPoke := True;
Memo1.Lines := DDETestItem.Lines;
FInPoke := False;
end;
在DDE會(huì)話部件DDETestTopic的OnExecuteMacro事件處理過程中處理客戶發(fā)送來的宏指令。我們共定義了五種可以響應(yīng)的宏指令:CopyDDE、Clear、WS_Normal、WS_MINIMIZED、WS_MAXIMIZED,分別用于拷貝聯(lián)接信息、清除Memo1中的內(nèi)容以及改變窗口顯示狀態(tài)。
procedure TDdeSrvrForm.doMacro(Sender: TObject;Msg: TStrings);
var
Cmd: String;
i: Integer;
begin
Cmd := '';
if Msg.Count = 0 then Exit;
for I := 0 to Msg.Count-1 do
begin
Cmd := Msg.Strings[i];
if UpperCase(Cmd) = 'COPYDDE' then
DDETestItem.CopyToClipboard
else if UpperCase(Cmd) = 'CLEAR' then
Memo1.text: = ''
else if UpperCase(Cmd) = 'WS_NORMAL' then
WindowState := wsNormal
else if UpperCase(Cmd) = 'WS_MINIMIZED' then
WindowState := wsMinimized
else if UpperCase(Cmd) = 'WS_MAXIMIZED' then
WindowState := wsMaximized
else
MessageDlg('Invalid Command',mtWarning,[mbOK],0);
end;
end;
下面的DDE客戶程序,主要是為了驗(yàn)證上面的DDE服務(wù)器程序而設(shè)計(jì)的,但同時(shí)也提供了一個(gè)DDE客戶程序設(shè)計(jì)的完整實(shí)例。
程序把接收到的DDE數(shù)據(jù)保存在一個(gè)TMemo類部件DDEDat中,而欲發(fā)送給服務(wù)器的數(shù)據(jù)和宏指令在另一個(gè)TMemo類部件PokeDat中輸入。兩個(gè)按鈕PokeBtn、ExecuteBtn用于發(fā)送數(shù)據(jù)和宏指令。兩個(gè)菜單項(xiàng)File|New Link和Edit|Paste Link用于根據(jù)用戶的輸入建立新聯(lián)接和從剪貼板上粘貼DDE聯(lián)接。
DDE聯(lián)接的建立通過調(diào)用SetLink方法實(shí)現(xiàn)。
建立新聯(lián)接的實(shí)現(xiàn)代碼如下。
procedure TFormD.doNewLink(Sender: TObject);
begin
DDEClient.SetLink (AppName.Text, TopicName.Text);
DDEClientItem.DdeConv := DDEClient;
DDEClientItem.DDEItem := ItemName.Text;
end;
通過從剪貼板粘貼聯(lián)接信息來建立聯(lián)接的實(shí)現(xiàn)代碼如下。
procedure TFormD.Edit1Click(Sender: TObject);
var
Service, Topic, Item : String;
begin
PasteLink1.Enabled := GetPasteLinkInfo (Service, Topic, Item);
end;
procedure TFormD.doPasteLink(Sender: TObject);
var
Service, Topic, Item : String;
begin
if GetPasteLinkInfo (Service, Topic, Item) then
begin
AppName.Text := Service;
TopicName.Text := Topic;
ItemName.Text := Item;
DDEClient.SetLink (Service, Topic);
DDEClientItem.DdeConv := DDEClient;
DDEClientItem.DdeItem := ItemName.Text;
end;
end;
在DDEClientItem的OnChange事件處理過程中把接收到的事件保存在DDEDat中。
procedure TFormD.DDEClientItemChange(Sender: TObject);
begin
DDEDat.Lines := DDEClientItem.Lines;
end;
數(shù)據(jù)發(fā)送的實(shí)現(xiàn)代碼如下。
procedure TFormD.doPoke (Sender: TObject);
var
DDECli : TDDEClientConv;
begin
DDECli := DDEClientItem.DdeConv;
if DdeCli <> nil then
DDECli.PokeDataLines (DDEClientItem.DDEItem, PokeDat.Lines);
end;
宏指令發(fā)送的實(shí)現(xiàn)代碼如下。
procedure TFormD.doMacro (Sender: TObject);
var
DDECli: TDDEClientConv;
Cmd: String;
begin
DDECli := DDEClientItem.DdeConv;
if DDECli <> nil then
begin
Cmd := PokeDat.Text + #13#10;
DDECli.ExecuteMacroLines (PokeDat.Lines, True);
end;
end;
運(yùn)行以上兩個(gè)程序,建立DDE聯(lián)接。經(jīng)測(cè)試,數(shù)據(jù)傳輸、數(shù)據(jù)發(fā)送和宏指令的發(fā)送與執(zhí)行都達(dá)到預(yù)期要求。
7.4.4 小結(jié)
剪貼板和DDE是Windows下數(shù)據(jù)通信的兩種方法。Delphi以簡(jiǎn)便、友好的方式實(shí)現(xiàn)了相應(yīng)的功能,為用戶編程提供了方便。一般說來,剪貼板多用于靜態(tài)數(shù)據(jù)傳輸,而DDE用于動(dòng)態(tài)數(shù)據(jù)交換、控制其它程序運(yùn)行等場(chǎng)合。這些內(nèi)容對(duì)于多用戶環(huán)境下的程序開發(fā)是很重要的。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |