在线现看午夜福利片|女人16久久免费视频|鲁丝片一区鲁丝片二区鲁丝|一区二区三区欧美在线

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

            2011年等考Delphi講義:剪貼板和動態(tài)數據交換

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

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

              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,則把窗口狀態(tài)(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消息的方法。在第三篇有關自定義部件開發(fā)的內容中,這一問題還要詳細論述;

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

              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)可以一定程度上減輕開發(fā)者的工作負擔,但開發(fā)DDE程序仍不是一件輕松的事情。

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

              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服務器應用程序執(zhí)行文件名去掉 .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會話,向服務器請求并從服務器接收數據。同時還可以向服務器發(fā)送數據、命令、宏,改變服務器的狀態(tài)并控制服務器的運行。

              7.3.1 聯接模式(ConnectMode)

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

              表 7.5 DDE的聯接模式

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

              值 意 義

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

              ddeAutomatic 在運行中當包含TDDEClientConv部件的窗口創(chuàng)建時

              聯接自動建立

              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的值。過程執(zhí)行后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;

              運行狀態(tài)下也可以從剪貼板上粘貼DDE聯接信息,并調用SetLink建立DDE會話。下面的例子顯示了當用戶按下應用程序中的Paste Link按鈕時,動態(tài)建立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.節(jié)省通信費用。假如沒有實時傳輸的要求,則人工模式可以大幅度降低通信的開銷;

              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,我們將會及時處理。如轉載本計算機等級考試網內容,請注明出處。