程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第七章-剪貼板和動態數據交換(二)(4)

第七章-剪貼板和動態數據交換(二)(4)

編輯:Delphi

7.4 DDE服務器程序的實現 

  DDE服務器程序響應DDE客戶的請求,一般地它包含了客戶程序希望獲取的數據。

創建一個DDE服務器程序,必須要把一個DDEServerItem部件添加到窗體中。DDEServerItem的text或Lines屬性包含了要聯接的數據。一般地 DDEServerItem部件又和另一個文本控件相聯系。當文本控件中的內容變化時則更新DDEServerItem 的text或Lines屬性的值。下面的一段程序把DDEServerItem和一個列表框相聯系。這一聯系是在列表框的OnChange事件中實現。 

procedure Form1.OnListBoxChange(Sender: TObject);

begin

DDEServerItem1.Lines := ListBox1.Items;

end; 

創建DDE服務器程序時也可以再加入一個DDEServerConv部件,並把兩個部件利用DDEServerItem的ServerConv屬性聯系起來。此時DDE主題成為部件DDEServerConv的名稱,而不是擁有DDEServerItem部件窗體的標題。

在下列情況下使用DDEServerConv部件成為必要:

1.擁有DDEServerItem 部件窗體的標題可能在運行時改變或可能有其它窗體擁有同樣的標題。在這種情況下DDE聯接可能無法建立;

2.DDE客戶程序可能會向你的服務器程序發送一條宏命令。在這種情況下只有擁有一個DDEServerConv部件才能響應OnMacroExecute事件並執行相應的動作。 

7.4.1 和DDE客戶程序建立聯接 

一般說來,建立DDE聯接是客戶程序的任務。但服務器程序可以把一個聯接拷貝到剪貼板上供客戶程序粘貼並建立DDE會話。步驟如下:

1.調用DDEServerItem部件的CopyToClipboard方法, 把Text(或Lines)屬性的值和DDE聯接信息拷貝到剪貼板上;

2.DDE客戶程序插入聯接的數據。一般地這是通過選擇適當的命令(如Edit|Paste Special或Edit|Paste Link)來實現的。

7.4.2 響應DDE事件 

部件DDEServerConv有三個事件:OnOpen、OnClose、OnExecuteMacro。前兩個事件在DDE會話建立和終止時觸發。同(7.3.7)中的介紹。

OnExecuteMacro事件用於響應客戶程序發送過來的宏指令。OnExecuteMacro事件處理過程有一個Msg參數,保存發送過來的指令串。用戶可以在該過程中決定如何響應這些宏指令。

DDEServerItem部件只有一個事件OnPokeData。這一事件用於響應客戶程序發送來的數據。如果客戶程序是Delphi程序,則客戶程序調用了PokeData或PokeDataLines方法。在這一事件的處理過程中用戶可以把發送來的數據保存到一個合適的地方。一般說來這應該就是DDEServerItem所聯系的文本控件。

下面的程序把發送來的數據保存到ListBox中。

procedure Form1.OnDDEServerItemPokeData(Serder: TObject);

begin

ListBox1.Items := DDEServerItem1.Lines;

end; 

7.4.3 DDE服務器應用例程 

下面我們創建一個DDE服務器例程和一個相應的DDE客戶例程。

DDE服務器例程可以完成的工作有:

1.把DDE聯接信息拷貝到剪貼板上供其它程序使用;

2.利用一個TMemo部件為其它程序提供數據源;

3.接收客戶程序發送來的數據;

4.根據客戶程序發送來的宏指令改變自身的運行狀態。

其中各部件的關鍵屬性如下: 

DDESrvrForm.ActiveControl = Memo1

DDESrvrForm.Menu = MainMenu1

Bevel1.Align = alTop

Memo1.Align = alClient

DDETestItem.ServerConv = DDETestTopic 

通過設置Bevel1、Memo1的Align屬性,可以保證窗口大小變化時仍能有較為美觀的屏幕顯示。

Memo1是服務器的數據源,DDE項目部件DDETestItem通過Memo1的OnChange事件與Memo1 建立聯系。 

procedure TDdeSrvrForm.doOnChange(Sender: TObject);

begin

if not FInPoke then

DDETestItem.Lines := Memo1.Lines;

end; 

其中FInPoke是一個布爾類型的私有數據成員,用於標志程序是否在處理客戶程序的數據發送。當數據是由客戶發送過來轉存到數據源時,則沒有必要再把數據傳給DDE項目部件。

把聯接信息拷貝到剪貼板,只需簡單調用DDETestItem的CopyToClipboard方法。 

procedure TDDESrvrForm.CopyClick(Sender: TObject);

begin

DDETestItem.CopyToClipboard;

end; 

這是通過菜單項Edit|Copy來調用的。

接收客戶程序發送來的數據,是在DDETestItem的OnPokeData事件處理過程中。在接收過程中改變FInPoke的值,以阻止數據的無效反送。 

procedure TDDESrvrForm.doOnPoke(Sender: TObject);

begin

FInPoke := True;

Memo1.Lines := DDETestItem.Lines;

FInPoke := False;

end; 

在DDE會話部件DDETestTopic的OnExecuteMacro事件處理過程中處理客戶發送來的宏指令。我們共定義了五種可以響應的宏指令:CopyDDE、Clear、WS_Normal、WS_MINIMIZED、WS_MAXIMIZED,分別用於拷貝聯接信息、清除Memo1中的內容以及改變窗口顯示狀態。

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客戶程序,主要是為了驗證上面的DDE服務器程序而設計的,但同時也提供了一個DDE客戶程序設計的完整實例。

程序把接收到的DDE數據保存在一個TMemo類部件DDEDat中,而欲發送給服務器的數據和宏指令在另一個TMemo類部件PokeDat中輸入。兩個按鈕PokeBtn、ExecuteBtn用於發送數據和宏指令。兩個菜單項File|New Link和Edit|Paste Link用於根據用戶的輸入建立新聯接和從剪貼板上粘貼DDE聯接。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved