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類型字符串中。