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

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

編輯:Delphi

7.3.2 和DDE服務器建立聯系 

和DDE服務器建立聯系,既可以在設計時進行,也可以在運行時進行。

在設計時,DDE聯接可以通過剪貼板進行粘貼。具體步驟如下:

1. 激活服務器程序,並選中你的客戶程序欲聯接的數據;

2. 把數據和DDE聯接信息拷貝到剪貼板上。一般說來這只需要選擇服務器應用程序的 Edit|Copy 菜單;

3. 在Delphi IDE的設計窗體中選中DDEClientConv部件;

4. 在Object Inspector(對象觀察器)中單擊DDEService屬性或DDETopic屬性,然後再單擊Ellipsis按鈕,打開DDE Info對話框;

5.選擇Paste Link按鈕。此時App編輯框和Topic編輯框被自動填充。如果Paste Link按鈕變灰,說明你准備用作服務器的應用程序不支持DDE或者DDE信息沒有被成功地拷貝到剪貼板上;

6.選擇OK 按鈕。此時Object Inspector中的DDEService、DDETopic 屬性包含了建立一個DDE聯接的正確值。

對於人工模式以下步驟是不需要的。

7.選中DDEClientItem部件,並在Object Inspector中設置DdeConv屬性為已完成聯接的DDEClientConv部件名稱;

8.假如剪貼板上的DDE 聯接信息仍保留的話,從Object Inspector的下拉列表框中選擇 DDEItem 屬性的值。否則輸入正確的值。

在運行時,調用 SetLink 方法來建立DDE聯接。

SetLink有兩個String類型的參數,分別用來接受DDEService和DDETopic的值。過程執行後DDEClientConv部件的DDEService 和DDeTopic屬性被設置。要注意的是:在運行時直接設置DDEService和DDETopic的值並不能建立一個DDE聯接,而必須調用SetLink 方法進行初始化。

比如,下面的語句和Excel的System主題建立聯接: 

DDEClietnConv. SetLink('Excel','System'); 

調用SetLink方法後,還需要設置DDEClientItem部件的DDEItem屬性。

比如,下面的語句聯接Excel的Topics項目,用以獲取當前活躍文件的文件名: 

DDEClietnItem.DDEItem := 'Topics'; 

當DDE聯接建立後,聯接的數據保存在DDEClientItem部件的Text和Lines 屬性中,Text用於保存一個字符串(String),Lines用於保存一個字符串鏈表(TStrings)對象。

為了顯示聯接數據,可以在DDEClientItem的OnChange事件中把數值賦給一個可視部件。

下面的事件過程把聯接數據實時地顯示在一個編輯框中。

  procedure Form1.DDEClientItemChange(Sender: Tobject);

begin

Edit1.Text := DDEClientItem1.Text;

end; 

運行狀態下也可以從剪貼板上粘貼DDE聯接信息,並調用SetLink建立DDE會話。下面的例子顯示了當用戶按下應用程序中的Paste Link按鈕時,動態建立DDE會話的過程。 

procedure Form1.OnPasteLink(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; 

GetPasteLinkInfo是DDEMan 庫單元中定義的一個過程。如果返回True,則DDE聯接信息保存在三個參數中;如果返回False,說明剪貼板上沒有正確格式的DDE聯接信息。 

7.3.3 數據申請 

雖然自動模式快捷、方便,但仍有一些理由使用DDE的人工模式:

1.服務器程序可能不支持自動數據傳輸,客戶必須顯式申請服務器更新一個特定的項目;

2.節省通信費用。假如沒有實時傳輸的要求,則人工模式可以大幅度降低通信的開銷;

3.若客戶程序只用於控制服務器的運行,則往往沒有必要使用自動模式。

人工模式下客戶程序的數據更新需要采用數據申請的方式。數據申請需要調用DDEClientConv部件的RequestData方法。RequestData有一個參數,指向要申請的DDE項目。RequestData返回一個Pchar類型的無結束符字符串,包含了申請到的文本。返回字符串占用的內存必須在程序終止前顯式釋放。

在人工模式下,即使存在一個DDEClientItem部件且與DDEClientConv相聯接,數據更新後DDEClientItem部件的Text、Lines屬性的值也不會改變。 

7.3.4 數據發送 

數據發送與一般的DDE數據流向正好相反,是把數據從DDE客戶應用程序發送到DDE服務器應用程序。

數據發送使用DDEClientConv部件的兩個方法PokeData 和 PokeDataLines, 它們的語法是: 

function PokeData (Item: String ; Data: PChar): Boolean;

function PokeDataLines (Item: String ; Data: TStrings): Boolean; 

參數Item是DDE服務器中被聯接的項目,Data是要發送的數據。如果數據是一個字符串,則把它轉化為PChar類型並調用PokeData方法;如果數據是一個字符串鏈表對象,可調用PokeDataLines方法。

方法的返回值標志數據傳送是否成功。因為有一些DDE服務器應用程序並不接收發送的數據。

下面的語句把編輯框中的內容發送給服務器: 

StrPCopy(TheText , Edit1.text);

DDEClientConv1.PokeData(DDEClientItem1.DDEItem , TheText); 

過程StrPCopy把一個Pascal類型的字符串拷貝到一個無結束符的PChar類型字符串中。 

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