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

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

編輯:Delphi

7.3.8 利用客戶程序和Excel交換數據   

下面我們建立一個DDE客戶程序,並利用這一程序與Excel中的一個工作表交換數據。程序設計界面

界面中包含一個DDE會話部件DDEClientConv1和DDE項目部件DDEClientItem1,用於建立和維護DDE聯接;一個RadioGroup控件和其中的兩個無線電按鈕AutoRadio、ManualRadio,用於設置聯接模式;一個GroupBox控件和其中的兩個按鈕RequestBtn和PokeBtn,用於控制數據的申請和發送,其中RequestBtn在自動模式下變灰;一個文本框Memo1用於保存DDE數據;一個按鈕PasteBtn用於粘貼聯接信息並建立DDE聯接;另外一個按鈕CloseBtn用於關閉系統。

設計時把DDEClientConv1的FormatChars屬性置為True,這樣可以保留服務器傳來數據的顯示格式;ConnectMode保留ddeAutomatic的缺省設置。

程序在類TForm1中定義了一個私有數據成員Automatic,用於標志聯接模式;三個字符串數據成員DDEService、DDETopic、DDEItem用於記錄聯接信息。

窗口生成時進行變量和部件狀態的初始化。 

procedure TForm1.FormCreate(Sender: TObject);

begin

RequestBtn.Enabled := False;

AutoRadio.Checked := True;

Automatic := True;

end; 

當聯接模式改變時,程序進行相應的處理。

自動模式轉換為人工模式: 

procedure TForm1.ManualRadioClick(Sender: TObject);

begin

if Automatic then

begin

RequestBtn.Enabled := ManualRadio.Checked;

DDEClientConv1.ConnectMode := ddeManual;

Automatic := False;

end;

end; 

人工模式轉換為自動模式:

procedure TForm1.AutoRadioClick(Sender: TObject);

begin

if not Automatic then

begin

RequestBtn.Enabled := ManualRadio.Checked;

If (DDEService = '') or (DDETopic = '') then

begin

MessageDlg(' Can not Set Link.',mtWarning,[mbOK],0);

Exit;

end;

DDEClientConv1.SetLink (DDEService, DDETopic);

DDEClientItem1.DdeConv := DDEClientConv1;

DDEClientItem1.DDEItem := DDEItem;

DDEClientConv1.ConnectMode := ddeAutomatic;

Automatic := True;

end;

end; 

當從自動模式轉換到人工模式,只需要簡單修改相應屬性即可;而從人工模式轉換到自動模式,則需要調用SetLink重新建立聯接,否則往往會引發一個DDE異常。

聯接的建立采用從剪貼板粘貼聯接信息的方式,這是最具有靈活性的一種方法。

procedure TForm1.PasteBtnClick(Sender: TObject);

begin

if GetPasteLinkInfo (DDEService, DDETopic, DDEItem) then

begin

DDEClientConv1.SetLink (DDEService, DDETopic);

if Automatic then

begin

DDEClientItem1.DdeConv := DDEClientConv1;

DDEClientItem1.DDEItem := DDEItem;

end;

end;

end; 

GetPasteInfo是 DDEMan庫單元中定義的一個函數,用於檢測剪貼板上是否有聯接信息並返回相應的DDE服務、主題和項目。

對於人工模式,必須由客戶顯式向服務器申請數據。在這種模式下DDE項目部件是多余的,接收到的DDE聯接信息用一個字符串來記錄。下面是實現代碼。 

procedure TForm1.RequestBtnClick(Sender: TObject);

var

TheData: PChar;

begin

If DDEItem = '' then

begin

MessageDlg('Can not Request Data',mtWarning,[mbOK],0);

Exit;

end;

TheData := StrAlloc(79);

DDEClientConv1.OpenLink;

TheData := DDEClientConv1.RequestData(DDEItem);

DDEClientConv1.CloseLink;

if TheData <> nil then

Memo1.Text := StrPas(TheData);

StrDisPose(TheData);

end;

OpenLink、CloseLink方法用於打開和關閉聯接。RequestData方法向服務器申請數據並返回到一個PChar字符串中。字符串必須顯式分配內存並在退出時釋放。

數據發送在不同聯接模式下是不同的。對於人工模式,增加了聯接的打開和關閉操作。程序清單如下。 

procedure TForm1.PokeBtnClick(Sender: TObject);

begin

If DDEItem = '' then

begin

MessageDlg('Can not Poke Data.',mtWarning,[mbOK],0);

Exit;

end;

if Automatic then

DDEClientConv1.PokeDataLines(DDEItem,Memo1.Lines)

else

begin

DDEClientConv1.OpenLink;

DDEClientConv1.PokeDataLines(DDEItem,Memo1.Lines);

DDEClientConv1.CloseLink;

end;

end; 

打開Microsoft Office中的Excel,裝入一個文件,把相關的單元選中,拷貝到剪貼板上。而後運行程序,按下Paste Link按鈕,DDE聯接就建立起來,相關單元中的數據顯示在Memo1中。之後可以進行模式轉換、數據申請、申請發送等一系列工作。運行後的屏幕顯示如下圖所示。

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