首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實(shí)用文檔 求職招聘 論文下載
2011中考 | 2011高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級(jí) | 職稱英語 | 商務(wù)英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
新概念英語 | 成人英語三級(jí) | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學(xué)習(xí) | 法語 | 德語 | 韓語
計(jì)算機(jī)等級(jí)考試 | 軟件水平考試 | 職稱計(jì)算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
華為認(rèn)證 | Java認(rèn)證
公務(wù)員 | 報(bào)關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問 | 導(dǎo)游資格
報(bào)檢員 | 教師資格 | 社會(huì)工作者 | 外銷員 | 國際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價(jià)格鑒證師
人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
駕駛員 | 網(wǎng)絡(luò)編輯
衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格考試會(huì)計(jì)證) | 經(jīng)濟(jì)師 | 會(huì)計(jì)職稱 | 注冊(cè)會(huì)計(jì)師 | 審計(jì)師 | 注冊(cè)稅務(wù)師
注冊(cè)資產(chǎn)評(píng)估師 | 高級(jí)會(huì)計(jì)師 | ACCA | 統(tǒng)計(jì)師 | 精算師 | 理財(cái)規(guī)劃師 | 國際內(nèi)審師
一級(jí)建造師 | 二級(jí)建造師 | 造價(jià)工程師 | 造價(jià)員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價(jià)師 | 土地估價(jià)師 | 巖土師
設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項(xiàng)目管理師 | 土地登記代理人 | 環(huán)境影響評(píng)價(jià)師 | 環(huán)保工程師
城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價(jià)師 | 安全評(píng)價(jià)師 | 電氣工程師 | 注冊(cè)測(cè)繪師 | 注冊(cè)計(jì)量師
繽紛校園 | 實(shí)用文檔 | 英語學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲

2011年等考Delphi講義:剪貼板和動(dòng)態(tài)數(shù)據(jù)交換

應(yīng)用程序間的數(shù)據(jù)交換是象Windows 這樣的多任務(wù)環(huán)境的重要特性。

  創(chuàng)建程序組:

  procedure TForm1.CreateButtonClick(Sender: TObject);

  var

  Name: String;

  begin

  Name := InputBox('Input Box','Input Group Name','');

  if Name = '' then

  MessageDlg('Group name can not be blank.', mtError, [mbOK], 0)

  else

  if SendMacro(Name,'CreateGroup') = False then

  MessageDlg('Unable to create group.', mtInformation, [mbOK], 0);

  end;

  添加程序項(xiàng):

  procedure TForm1.AddButtonClick(Sender: TObject);

  var

  Name: String;

  begin

  Name := InputBox('Input Box','Input Application full_Path name','');

  if Name = '' then

  MessageDlg('Application name can not be blank.', mtError, [mbOK], 0)

  else

  if SendMacro(Name,'AddItem') = False then

  MessageDlg('Unable to Add Item.', mtInformation, [mbOK], 0);

  end;

  刪除程序組:

  procedure TForm1.DeleteButtonClick(Sender: TObject);

  var

  Name: String;

  begin

  Name := InputBox('Input Box','Input Group Name to be Deleted','');

  if Name = '' then

  MessageDlg('Group name can not be blank.', mtError, [mbOK], 0)

  else

  if SendMacro(Name,'DeleteGroup') = False then

  MessageDlg('Unable to create group.', mtInformation, [mbOK], 0);

  end;

  7.4 DDE服務(wù)器程序的實(shí)現(xiàn)

  DDE服務(wù)器程序響應(yīng)DDE客戶的請(qǐng)求,一般地它包含了客戶程序希望獲取的數(shù)據(jù)。

  創(chuàng)建一個(gè)DDE服務(wù)器程序,必須要把一個(gè)DDEServerItem部件添加到窗體中。DDEServerItem的text或Lines屬性包含了要聯(lián)接的數(shù)據(jù)。一般地 DDEServerItem部件又和另一個(gè)文本控件相聯(lián)系。當(dāng)文本控件中的內(nèi)容變化時(shí)則更新DDEServerItem 的text或Lines屬性的值。下面的一段程序把DDEServerItem和一個(gè)列表框相聯(lián)系。這一聯(lián)系是在列表框的OnChange事件中實(shí)現(xiàn)。

  procedure Form1.OnListBoxChange(Sender: TObject);

  begin

  DDEServerItem1.Lines := ListBox1.Items;

  end;

  創(chuàng)建DDE服務(wù)器程序時(shí)也可以再加入一個(gè)DDEServerConv部件,并把兩個(gè)部件利用DDEServerItem的ServerConv屬性聯(lián)系起來。此時(shí)DDE主題成為部件DDEServerConv的名稱,而不是擁有DDEServerItem部件窗體的標(biāo)題。

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

  1.擁有DDEServerItem 部件窗體的標(biāo)題可能在運(yùn)行時(shí)改變或可能有其它窗體擁有同樣的標(biāo)題。在這種情況下DDE聯(lián)接可能無法建立;

  2.DDE客戶程序可能會(huì)向你的服務(wù)器程序發(fā)送一條宏命令。在這種情況下只有擁有一個(gè)DDEServerConv部件才能響應(yīng)OnMacroExecute事件并執(zhí)行相應(yīng)的動(dòng)作。

  7.4.1 和DDE客戶程序建立聯(lián)接

  一般說來,建立DDE聯(lián)接是客戶程序的任務(wù)。但服務(wù)器程序可以把一個(gè)聯(lián)接拷貝到剪貼板上供客戶程序粘貼并建立DDE會(huì)話。步驟如下:

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

  2.DDE客戶程序插入聯(lián)接的數(shù)據(jù)。一般地這是通過選擇適當(dāng)?shù)拿?如Edit|Paste Special或Edit|Paste Link)來實(shí)現(xiàn)的。

  7.4.2 響應(yīng)DDE事件

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

  OnExecuteMacro事件用于響應(yīng)客戶程序發(fā)送過來的宏指令。OnExecuteMacro事件處理過程有一個(gè)Msg參數(shù),保存發(fā)送過來的指令串。用戶可以在該過程中決定如何響應(yīng)這些宏指令。

  DDEServerItem部件只有一個(gè)事件OnPokeData。這一事件用于響應(yīng)客戶程序發(fā)送來的數(shù)據(jù)。如果客戶程序是Delphi程序,則客戶程序調(diào)用了PokeData或PokeDataLines方法。在這一事件的處理過程中用戶可以把發(fā)送來的數(shù)據(jù)保存到一個(gè)合適的地方。一般說來這應(yīng)該就是DDEServerItem所聯(lián)系的文本控件。

  下面的程序把發(fā)送來的數(shù)據(jù)保存到ListBox中。

  procedure Form1.OnDDEServerItemPokeData(Serder: TObject);

  begin

  ListBox1.Items := DDEServerItem1.Lines;

  end;

  7.4.3 DDE服務(wù)器應(yīng)用例程

  下面我們創(chuàng)建一個(gè)DDE服務(wù)器例程和一個(gè)相應(yīng)的DDE客戶例程。

  DDE服務(wù)器例程可以完成的工作有:

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

  2.利用一個(gè)TMemo部件為其它程序提供數(shù)據(jù)源;

  3.接收客戶程序發(fā)送來的數(shù)據(jù);

  4.根據(jù)客戶程序發(fā)送來的宏指令改變自身的運(yùn)行狀態(tài)。

  其中各部件的關(guān)鍵屬性如下:

  DDESrvrForm.ActiveControl = Memo1

  DDESrvrForm.Menu = MainMenu1

  Bevel1.Align = alTop

  Memo1.Align = alClient

  DDETestItem.ServerConv = DDETestTopic

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

  Memo1是服務(wù)器的數(shù)據(jù)源,DDE項(xiàng)目部件DDETestItem通過Memo1的OnChange事件與Memo1 建立聯(lián)系。

  procedure TDdeSrvrForm.doOnChange(Sender: TObject);

  begin

  if not FInPoke then

  DDETestItem.Lines := Memo1.Lines;

  end;

  其中FInPoke是一個(gè)布爾類型的私有數(shù)據(jù)成員,用于標(biāo)志程序是否在處理客戶程序的數(shù)據(jù)發(fā)送。當(dāng)數(shù)據(jù)是由客戶發(fā)送過來轉(zhuǎn)存到數(shù)據(jù)源時(shí),則沒有必要再把數(shù)據(jù)傳給DDE項(xiàng)目部件。

  把聯(lián)接信息拷貝到剪貼板,只需簡(jiǎn)單調(diào)用DDETestItem的CopyToClipboard方法。

  procedure TDDESrvrForm.CopyClick(Sender: TObject);

  begin

  DDETestItem.CopyToClipboard;

  end;

  這是通過菜單項(xiàng)Edit|Copy來調(diào)用的。

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

  procedure TDDESrvrForm.doOnPoke(Sender: TObject);

  begin

  FInPoke := True;

  Memo1.Lines := DDETestItem.Lines;

  FInPoke := False;

  end;

  在DDE會(huì)話部件DDETestTopic的OnExecuteMacro事件處理過程中處理客戶發(fā)送來的宏指令。我們共定義了五種可以響應(yīng)的宏指令:CopyDDE、Clear、WS_Normal、WS_MINIMIZED、WS_MAXIMIZED,分別用于拷貝聯(lián)接信息、清除Memo1中的內(nèi)容以及改變窗口顯示狀態(tài)。

  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客戶程序,主要是為了驗(yàn)證上面的DDE服務(wù)器程序而設(shè)計(jì)的,但同時(shí)也提供了一個(gè)DDE客戶程序設(shè)計(jì)的完整實(shí)例。

  程序把接收到的DDE數(shù)據(jù)保存在一個(gè)TMemo類部件DDEDat中,而欲發(fā)送給服務(wù)器的數(shù)據(jù)和宏指令在另一個(gè)TMemo類部件PokeDat中輸入。兩個(gè)按鈕PokeBtn、ExecuteBtn用于發(fā)送數(shù)據(jù)和宏指令。兩個(gè)菜單項(xiàng)File|New Link和Edit|Paste Link用于根據(jù)用戶的輸入建立新聯(lián)接和從剪貼板上粘貼DDE聯(lián)接。

  DDE聯(lián)接的建立通過調(diào)用SetLink方法實(shí)現(xiàn)。

  建立新聯(lián)接的實(shí)現(xiàn)代碼如下。

  procedure TFormD.doNewLink(Sender: TObject);

  begin

  DDEClient.SetLink (AppName.Text, TopicName.Text);

  DDEClientItem.DdeConv := DDEClient;

  DDEClientItem.DDEItem := ItemName.Text;

  end;

  通過從剪貼板粘貼聯(lián)接信息來建立聯(lián)接的實(shí)現(xiàn)代碼如下。

  procedure TFormD.Edit1Click(Sender: TObject);

  var

  Service, Topic, Item : String;

  begin

  PasteLink1.Enabled := GetPasteLinkInfo (Service, Topic, Item);

  end;

  procedure TFormD.doPasteLink(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;

  在DDEClientItem的OnChange事件處理過程中把接收到的事件保存在DDEDat中。

  procedure TFormD.DDEClientItemChange(Sender: TObject);

  begin

  DDEDat.Lines := DDEClientItem.Lines;

  end;

  數(shù)據(jù)發(fā)送的實(shí)現(xiàn)代碼如下。

  procedure TFormD.doPoke (Sender: TObject);

  var

  DDECli : TDDEClientConv;

  begin

  DDECli := DDEClientItem.DdeConv;

  if DdeCli <> nil then

  DDECli.PokeDataLines (DDEClientItem.DDEItem, PokeDat.Lines);

  end;

  宏指令發(fā)送的實(shí)現(xiàn)代碼如下。

  procedure TFormD.doMacro (Sender: TObject);

  var

  DDECli: TDDEClientConv;

  Cmd: String;

  begin

  DDECli := DDEClientItem.DdeConv;

  if DDECli <> nil then

  begin

  Cmd := PokeDat.Text + #13#10;

  DDECli.ExecuteMacroLines (PokeDat.Lines, True);

  end;

  end;

  運(yùn)行以上兩個(gè)程序,建立DDE聯(lián)接。經(jīng)測(cè)試,數(shù)據(jù)傳輸、數(shù)據(jù)發(fā)送和宏指令的發(fā)送與執(zhí)行都達(dá)到預(yù)期要求。

  7.4.4 小結(jié)

  剪貼板和DDE是Windows下數(shù)據(jù)通信的兩種方法。Delphi以簡(jiǎn)便、友好的方式實(shí)現(xiàn)了相應(yīng)的功能,為用戶編程提供了方便。一般說來,剪貼板多用于靜態(tài)數(shù)據(jù)傳輸,而DDE用于動(dòng)態(tài)數(shù)據(jù)交換、控制其它程序運(yùn)行等場(chǎng)合。這些內(nèi)容對(duì)于多用戶環(huán)境下的程序開發(fā)是很重要的。

上一頁  1 2 3 4 5  下一頁
  相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題
       預(yù)告:名師解析2010年9月計(jì)算機(jī)等級(jí)考試試題答案
       2010年9月計(jì)算機(jī)等級(jí)考試成績查詢時(shí)間及入口
       2010年9月計(jì)算機(jī)等考成績查詢短信免費(fèi)提醒開通
文章搜索
版權(quán)聲明:如果計(jì)算機(jī)等級(jí)考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級(jí)考試網(wǎng)內(nèi)容,請(qǐng)注明出處。