黄色在线观看视频-黄色在线免费看-黄色在线视频免费-黄色在线视频免费看-免费啪啪网-免费啪啪网站

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

2011年等考Delphi講義:剪貼板和動態數據交換

來源:考試吧Exam8.com) 2010-10-27 14:34:24 考試吧:中國教育培訓第一門戶 模擬考場
應用程序間的數據交換是象Windows 這樣的多任務環境的重要特性。

  窗口創建時,把該窗口登錄為剪貼板觀察器,添加到剪貼板觀察器鏈中,同時進行變量、部件和剪貼板的初始化。

  procedure TClipSaveForm.FormCreate(Sender: TObject);

  begin

  View := False;

  SpeedButton2.Down := True;

  MyBitmap := TBitmap.create;

  try

  MyBitmap.Width := 0;

  MyBitmap.Height := 0 ;

  except

  Application.terminate;

  end;

  Clipboard.Clear;

  NextViewerHandle := SetClipboardViewer(Handle);

  end;

  窗口關閉時,退出剪貼板觀察器鏈,并釋放內存:

  procedure TClipSaveForm.FormDestroy(Sender: TObject);

  begin

  ChangeClipboardChain(Handle,NextViewerHandle);

  MyBitmap.Free;

  end;

  在以上兩段程序中用到的兩個Windows API函數SetClipboardViewer和ChangeClipboardChain分別用于登錄和退出剪貼板觀察器鏈。

  程序保存位圖的功能是在消息響應過程WMDrawClipboard中實現的。該過程在剪貼板內容有變化時被調用。

  procedure TClipSaveForm.WMDrawClipboard(var Msg: TWMDrawClipboard);

  var

  FileName: String;

  begin

  If NextViewerHandle <> 0 then

  SendMessage(NextViewerHandle,msg.Msg,0,0);

  If ClipBoard.HasFormat(CF_BITMAP) then

  begin

  MyBitmap.Assign(Clipboard);

  If SaveDialog1.Execute then

  begin

  FileName := SaveDialog1.FileName;

  MyBitmap.SaveToFile(FileName);

  end;

  If View then

  begin

  WindowState := wsNormal;

  Image1.Picture.Bitmap := MyBitmap;

  end;

  end;

  Msg.Result := 0;

  end;

  程序首先判斷在剪貼板觀察器鏈中是否還存在下一個觀察器。如果有,則把消息傳遞下去,這是剪貼板觀察器程序的義務。而后判斷剪貼板上內容的格式是否為位圖。如是,則首先把剪貼板上內容保存到數據成員MyBitmap中,并激活一個文件保存對話框把位圖保存到文件中。如果View=True,則把窗口狀態(WindowState)設置為wsNormal,并把MyBitmap賦給Image部件的相應值,使用戶可以對剪貼板上的位圖進行觀察。

  消息響應過程WMChangeCBChain在剪貼板觀察器鏈上其它觀察器退出時被調用。根據被移出觀察器的不同位置決定了不同的處理方法。

  procedure TClipSaveForm.WMChangeCBChain(var Msg: TWMChangeCBChain);

  begin

  if Msg.Remove = NextViewerHandle then

  NextViewerHandle := Msg.Next

  else

  if NextViewerHandle <> 0 then

  SendMessage(NextViewerHandle,Msg.Msg,Msg.Remove,Msg.Next);

  Msg.Result := 0;

  end;

  窗口上有兩個加速按鈕,兩個按鈕。它們擊鍵(click)事件處理過程如下。每一程序段的意義是非常顯然的。

  procedure TClipSaveForm.Button1Click(Sender: TObject);

  begin

  Close;

  end;

  procedure TClipSaveForm.Button2Click(Sender: TObject);

  begin

  WindowState := wsMinimized;

  end;

  procedure TClipSaveForm.SpeedButton1Click(Sender: TObject);

  begin

  View := True;

  Image1.Picture.Bitmap := MyBitmap;

  end;

  procedure TClipSaveForm.SpeedButton2Click(Sender: TObject);

  begin

  View := False;

  Image1.Picture.Bitmap := nil;

  end;

  通過對這個程序的介紹,以下幾點是應該注意的:

  1.提供了一種自己截獲和處理剪貼板上內容的方法。讀者可以根據需要進一步擴充;

  2.提供了響應Windows消息的方法。在第三篇有關自定義部件開發的內容中,這一問題還要詳細論述;

  3.最后的一點啟示是:在Delphi程序開發中巧妙應用傳統的Windows方法(如消息處理、 API函數等)仍是很有必要的。而在應用這些方法中所體現的方便之處,正是Delphi勝過其它可視化開發工具的一個重要方面。

  7.2 Windows的DDE原理和 Dephi的DDE實現機制

  7.2.1 Windows的DDE原理

  Windows的DDE機制基于Windows的消息機制。兩個Windows應用程序通過相互之間傳遞DDE消息進行DDE會話(Conversation),從而完成數據的請求、應答、傳輸。這兩個應用程序分別稱為服務器(Server)和客戶(Client)。服務器是數據的提供者,客戶是數據的請求和接受者。

  DDE會話由客戶程序啟動。客戶程序把一條消息(WM_DDE_INITIATE)傳播給當前運行的所有Windows程序。這條消息指明了客戶程序所需要的一般數據(應用程序、主題)。擁有這些數據的DDE服務器可以響應這條被傳播的消息。此時,DDE會話就開始了。

  由于在每個主題中,DDE服務器可以支持一個或多個數據項,所以在客戶請求數據時應同時指明應用程序名、主題名和項目名。應用程序、主題、項目是DDE中三個最基本的概念。

  利用Windows本身提供的DDE消息和API進行DDE編程是一件相當棘手的問題。 雖然使用DDE管理庫(ddeml.dll)可以一定程度上減輕開發者的工作負擔,但開發DDE程序仍不是一件輕松的事情。

  此時Delphi出現了!Delphi通過其自身巧妙的設計使開發一個DDE應用程序同開發一個普通程序一樣地快捷、方便。

  7.2.2 Delphi的DDE實現機制簡介

  Delphi把所有的DDE功能做到四個部件中,它們是:

  ● TDDEClientConv : 用于客戶程序建立和維護一個DDE會話

  ● TDDEClientItem : 用于客戶程序建立和維護數據交換通道

  ● TDDEServerConv : 用于服務器程序響應DDE會話

  ● TDDEServerItem : 用于服務器程序維護數據交換通道

  前兩個部件用于生成一個DDE客戶程序,后兩個部件用于生成一個DDE服務器程序。如果一個應用程序同時擁有這些部件,則這一程序既可以充當DDE客戶,也可以充當DDE服務器。

  會話部件TDDEClientConv、TDDEServerConv用于建立和維護一個DDE會話。DDE會話包括DDE服務和DDE主題兩部分。

  DDE服務是DDE服務器的名稱,即在一般的Windows DDE機制中所講的應用程序名。一般說來這一名稱是DDE服務器應用程序執行文件名去掉 .EXE后綴。比如你的應用程序要和Word 6.0建立會話,則DDE服務為WINWORD。但也不盡然。比如你的應用程序要和Borland ReportSmith ( RPTSMITH.EXE ) 建立會話,則DDE 服務為 Report Smith。DDE服務到底如何,讀者可參看相關的DDE服務器應用程序文檔。

  DDE主題是一個包含了聯接信息的數據單元。一般說來DDE 主題是一個包括擴展名的完整文件名。例如和Excel中的一個文件建立DDE會話,則主題可能是

  Topic = 'c:\excel\Example\sale.xls'

  如果服務器是一個Delphi應用程序,缺省情況下主題是包含欲聯接數據窗體的標題。如果服務器使用了DDEServerConv部件,則要求使用部件DDEServerConv的名稱作為DDE主題。

  項目部件TDDEclientItem、TDDEServerItem用于建立和維護DDE數據的傳輸通道。 DDE項目中包含著實際欲傳輸的數據。DDE項目的格式取決于DDE服務器應用程序。一個可能的DDE項目例子是電子表格中的單元和數據庫表中的域。如果服務器是Delphi應用程序,則項目是連接的 DDEServerItem部件的名稱。

  Delphi的DDE實現機制方便、實用,但也有一個令人遺憾的缺陷:只能傳輸文本數據以及命令、宏,而不能傳輸圖像數據。在這一點上微軟公司推出的Visual Basic 要略勝一籌。不過在目前文本數據的使用仍是最廣泛的,而且圖像傳輸可以利用剪貼板和OLE來實現,則這一缺陷也并無很大的影響

  7.3 DDE客戶程序的實現

  DDE客戶程序啟動DDE會話,向服務器請求并從服務器接收數據。同時還可以向服務器發送數據、命令、宏,改變服務器的狀態并控制服務器的運行。

  7.3.1 聯接模式(ConnectMode)

  Delphi的DDE提供了兩種聯接模式:自動和人工。這可以通過DDEClinetConv 部件的ConnectMode屬性進行設置。如下表所示。

  表 7.5 DDE的聯接模式

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  值 意 義

  ───────────────────────────────

  ddeAutomatic 在運行中當包含TDDEClientConv部件的窗口創建時

  聯接自動建立

  ddeManual 只有當調用OpenLink方法時聯接才建立

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  不同聯接模式,DDE客戶程序的實現方式不同。

  對于自動模式:

  1. 向窗體中加入DDEClientConv和DDEClientItem部件并命名;

  2. 把DDEClientItem部件的DdeConv屬性設置為DDEClientConv部件的名稱;

  如果在設計時建立,則通過對象觀察器進行選擇;如果在運行時建立聯系, 則通過如下的一條語句設置屬性的值:

  DDEClientItem1.DdeConv := 'DDEClientConv1' ;

  3. 和服務器建立聯系,實現數據共享。

  對于人工模式:

  1.向窗體中加入DDEClientConv部件;

  2.和服務器建立聯系;

  3. 數據更新時調用RequestData方法申請并獲得數據。

  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屬性的值也不會改變。

上一頁  1 2 3 4 5 下一頁
  相關推薦:2010年9月計算機等級考試試題及答案解析專題
       預告:名師解析2010年9月計算機等級考試試題答案
       2010年9月計算機等級考試成績查詢時間及入口
       2010年9月計算機等考成績查詢短信免費提醒開通
文章搜索
版權聲明:如果計算機等級考試網所轉載內容不慎侵犯了您的權益,請與我們聯系800@exam8.com,我們將會及時處理。如轉載本計算機等級考試網內容,請注明出處。
主站蜘蛛池模板: 一级有奶水毛片免费看 | 国产一国产一级毛片视频在线 | 天天色天天操天天 | 狠狠干天天爱 | 欧美精品久久一区二区三区 | 国产一级片网址 | 欧美日本一区亚洲欧美一区 | 亚洲一区在线观看视频 | 手机小视频在线观看 | 午夜激情在线视频 | 男女www视频在线看网站 | 成人午夜毛片 | 男人最爱看的网站 | 国产免费一区2区3区4区 | 国产精品视频白浆免费视频 | 国产在线一区在线视频 | 俄罗斯午夜影院 | 97国产蝌蚪视频在线观看 | 成人性视频在线三级 | 欧美高清xxxx性 | 波多野结衣中出在线 | 亚洲日本va中文字幕在线不卡 | 亚洲精品无码不卡在线播放he | 日韩免费大片 | 国产成人精品999在线 | 一级毛片免费的 | 亚洲欧美日韩国产专区一区 | 日本一区二区三区视频在线观看 | 丰满毛片 | 一级做a爱片就在线看 | 欧美精品成人 | 欧美成人精品不卡视频在线观看 | a级大片免费看 | 成人性一级视频在线观看 | 特黄色毛片 | 成人午夜在线观看国产 | 疯狂吮乳小说 | 国产日韩欧美中文 | 天天看天天摸天天操 | 日韩99在线 | 超人碰碰碰人人成碰人 |