首頁 考試吧論壇 Exam8視線 考試商城 網絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載 | ||
![]() |
2011中考 | 2011高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試 MPA考試 | 中科院 |
|
![]() |
四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT 新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 法語 | 德語 | 韓語 |
|
![]() |
計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證 華為認證 | Java認證 |
|
![]() |
公務員 | 報關員 | 銀行從業資格 | 證券從業資格 | 期貨從業資格 | 司法考試 | 法律顧問 | 導游資格 報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師 人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業資格 | 廣告師職業水平 駕駛員 | 網絡編輯 |
|
![]() |
衛生資格 | 執業醫師 | 執業藥師 | 執業護士 | |
![]() |
會計從業資格考試(會計證) | 經濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師 注冊資產評估師 | 高級會計師 | ACCA | 統計師 | 精算師 | 理財規劃師 | 國際內審師 |
|
![]() |
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監理工程師 | 安全工程師 質量工程師 | 物業管理師 | 招標師 | 結構工程師 | 建筑師 | 房地產估價師 | 土地估價師 | 巖土師 設備監理師 | 房地產經紀人 | 投資項目管理師 | 土地登記代理人 | 環境影響評價師 | 環保工程師 城市規劃師 | 公路監理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師 |
|
![]() |
繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲 |
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類型字符串中。
7.3.5 控制服務器應用程序的執行
客戶程序控制服務器應用程序的一個方面是:必要的時候客戶程序可以啟動服務器程序,并裝載會話主題。
而客戶程序控制服務器應用程序更重要的一點是向服務器發送服務器承認的宏命令,來完成對服務器應用程序的各種操作。服務器到底支持哪些宏命令,可參閱服務器應用程序文檔。
發送宏命令要使用DDEClientConv的兩個方法 ExecuteMacro和ExecuteMacroLines ,它們的語法如下:
function ExecuteMacro(Cmd: PChar; WaitFlag: Boolean): Boolean;
function ExecuteMacroLines(Cmd: TStrings;WaitFlag: Boolean): Boolean;
Cmd是欲發送的宏命令字符串或宏命令字符串鏈表。WaitFlag決定了在DDE 服務器程序執行宏命令時客戶程序的行為。如果WaitFlag設置為True,則在服務器宏命令執行完畢前,不允許對ExecuteMacro、ExecuteMacroLines、PokeData、PokeDataLines這些方法的成功調用,它們都不向服務器發送數據并返回False。如果WaitFlag設置為False,則調用的方法在第一個宏執行完畢前即試圖向服務器發送數據。
WaitFalg的設置也取決于服務器應用程序。一些應用程序當在第一個宏執行完之前就試圖向它發送數據或命令時,可能導致第一個宏執行失敗或導致不可預料的后果。具體情況可查閱服務器應用程序文檔。
函數返回值表示命令串是否被成功傳輸。而宏命令執行是否成功客戶是無法檢測到的。
7.3.6 格式化文本
DDEClientConv有一個布爾屬性FormartChars,用于決定是否格式化文本。所謂格式化文本是指從傳輸來的文本數據中過濾掉BackSpace(8)、 Tab(7) 、Linefeed(10) 、Return(13)等字符。括號內是字符的ASCII碼。許多時候這些字符將導致DDE客戶數據顯示的混亂。
FormatChars的缺省值是False。
7.3.7 響應DDE事件
部件DDEClientConv有兩個事件OnOpen和OnClose,分別在DDE 會話建立和中止時觸發。部件DDEClientItem有一個OnChange事件。這一事件常用于DDE項目數據的轉儲和顯示,如(7.3.1)節所示。
在自動模式下,OnOpen事件在包含DDEClientConv部件的窗口創建時觸發,或在調用SetLink方法時觸發,OnClose事件在客戶程序或服務器程序關閉時觸發。
在人工模式下,OnOpen事件在調用OpenLink 方法時觸發,OnClose事件在調用ColseLink方法時觸發。
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中。之后可以進行模式轉換、數據申請、申請發送等一系列工作。運行后的屏幕顯示如下圖所示。
7.3.9 用客戶程序控制程序管理器
下面的例子用客戶程序向程序管理器發送命令,用于創建程序組、程序項以及刪除程序組。
程序管理器提供了應用程序的DDE接口命令字符串,應用程序利用這些命令字符串可以實現以下的功能:
1.創建程序組
命令格式為:
CreateGroup(程序組名[,程序組所在的路徑])
程序組不存在時進行創建;如程序組存在則按照指定的路徑激活。
2.刪除程序組
命令格式為:
DeleteGroup(程序組名)
3.顯示程序組
命令格式為;
ShowGroup(程序組名,顯示標志)
顯示標志用于控制程序組在程序管理器中以極大、極小或正常方式顯示。
4.重新裝入程序組
命令格式為:
ReLoadGroup(程序組名)
該命令使程序管理器先刪除而后再重新裝入一個已有的程序組。
5.向程序組中添加程序項
命令格式為:
AddItem(命令行[,描述[,圖標路徑[,圖標序號[,圖標橫坐標,圖標縱坐標[,工作區目錄[,熱鍵[,是否最小化顯示標志]]]]]]])
命令行控制程序項的執行,可包括路徑、參數等。其它參數分別對應在程序管理器中添加一個程序項時需要設置的參數和選項。它們都有缺省設置,因而是可選的。
6.替換程序組中的程序項
命令格式為:
ReplaceItem(程序項名)
該命令刪除一個程序項,并將所刪除程序項的位置記錄下來,以后通過AddItem在這個所記錄的位置增加新項目。
7.從程序組中刪除程序項
命令格式為:
DeleteItem(程序項名)
從當前活動程序組中刪除一個程序項。
8.關閉程序管理器
命令格式為:
ExitProgram(是否保存程序組信息標志)
從應用程序向程序管理器發送命令字符串的方法是基本一致的。為簡便起見,在例程中只實現了其中僅包含一個字符串參數的情形,讀者可以很容易作進一步的擴展。
程序設計界面如圖所示,包含一個DDE客戶會話(DDEClientConv)部件和四個完成不同功能的按鈕。
DDEClientConv在設計時和程序管理器建立一個DDE會話,其中DDE服務器和DDE主題 都為PROGMAN。聯接模式ConnectMode設置為ddeManual。
我們把只有一個字符串參數的命令發送情況抽象出來,形成下面的SendMacro函數。
function TForm1.SendMacro(Name: String;Command: String): Boolean;
var
Macro: String;
Cmd: array[0..255] of Char;
begin
Result := True;
if Name <> '' then
begin
Macro := Format('['+Command+'(%s)]', [Name]) + #13#10;
StrPCopy (Cmd, Macro);
DDEClient.OpenLink;
if not DDEClient.ExecuteMacro(Cmd, False) then
Result := False;
DDEClient.CloseLink;
end;
end;
過程首先利用Format函數形成宏字符串:
Macro := Format('['+Command+'(%s)]', [Name]) + #13#10;
而后把Pascal類型的字符串拷貝到一個程序管理器可接受的PChar類型字符串中。
DDE聯接采用人工模式。首先調用OpenLink方法。而后調用ExecuteMacro方法發送命令,如失敗則返回False。最后用CloseLink關閉聯接。
三個按鈕CreateButton、AddButton、DeleteButton分別用于創建程序組、添加程序項、刪除程序組。它們的程序實現大同小異,如下所示。
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |