首頁 考試吧論壇 Exam8視線 考試商城 網絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載 | ||
![]() |
2011中考 | 2011高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試 MPA考試 | 中科院 |
|
![]() |
四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT 新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 法語 | 德語 | 韓語 |
|
![]() |
計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證 華為認證 | Java認證 |
|
![]() |
公務員 | 報關員 | 銀行從業資格 | 證券從業資格 | 期貨從業資格 | 司法考試 | 法律顧問 | 導游資格 報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師 人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業資格 | 廣告師職業水平 駕駛員 | 網絡編輯 |
|
![]() |
衛生資格 | 執業醫師 | 執業藥師 | 執業護士 | |
![]() |
會計從業資格考試(會計證) | 經濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師 注冊資產評估師 | 高級會計師 | ACCA | 統計師 | 精算師 | 理財規劃師 | 國際內審師 |
|
![]() |
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監理工程師 | 安全工程師 質量工程師 | 物業管理師 | 招標師 | 結構工程師 | 建筑師 | 房地產估價師 | 土地估價師 | 巖土師 設備監理師 | 房地產經紀人 | 投資項目管理師 | 土地登記代理人 | 環境影響評價師 | 環保工程師 城市規劃師 | 公路監理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師 |
|
![]() |
繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲 |
第七章 剪貼板和動態數據交換
應用程序間的數據交換是象Windows 這樣的多任務環境的重要特性。作為一種基于Windows的開發工具,Delphi支持如下四種數據交換方式:剪貼板、動態數據交換 ( DDE)、對象聯接與嵌入(OLE)以及動態聯接庫(DLLs)。這中間前三種方式最為常用,OLE功能最為強大,DDE次之。而剪貼板使用最為方便。在本章,我們只討論剪貼板和動態數據交換。利用OLE實現數據交換見下一章,利用動態聯接庫(DLLs)進行數據交換將在第十章中介紹。
7.1 剪貼板及其應用
本質上,剪貼板只是一個全局內存塊。當一個應用程序將數據傳送給剪貼板后,通過修改內存塊分配標志,把相關內存塊的所有權從應用程序移交給Windows自身。其它應用程序可以通過一個句柄找到這個內存塊,從而能夠從內存塊中讀取數據。這樣就實現了數據在不同應用程序間的傳輸。
剪貼板雖然功能較為簡單,且不能實現實時傳輸,但卻是更為復雜的DDE和OLE的基礎。對于一些只是偶爾需要使用其它應用程序數據的程序來說,使用剪貼板不失為一種方便、快捷的方式。
Delphi把剪貼板的大部分功能封裝到一個TClipboard類中,同時把使用頻度最高的文本傳輸功能(包括DBImage的圖像傳輸功能)置入相應部件作為部件的方法,從而使用戶可以十分方便地使用剪貼板進行編程。
7.1.1 使用剪貼板傳輸文本
剪貼板傳輸文本主要是應用如下的三個方法:CopyToClipboard、CutToClipboard 和PasteFromClipboard。包含這些方法的部件如下表所示。
表7.1 包含剪貼板方法的部件
━━━━━━━━━━━━━━━━━━━━━━━━━━━
方 法 部 件
———————————————————————————
TDBEdit TDBMemo
TDBImage
CopyToClipboard TEdit TMemo TMaskEdit
TOLEContainer
TDDEServerItem
———————————————————————————
TDBEdit TDBMemo
CutToClipboard TDBImage
TEdit TMemo TMaskEdit
———————————————————————————
TDBEdit TDBMemo
PasteFromClipboard TDBImage
TEdit TMemo TMaskEdit
━━━━━━━━━━━━━━━━━━━━━━━━━━━
除TDBImage外,其余全是有關文本的控件。
在把文本傳輸到剪貼板之前,文本必須被選中。
若選TMaskEdit的AutoSelect屬性為True,則當MaskEdit獲得輸入焦點時文本自動被選中;若選TEdit、TMemo的HideSelection屬性為True,則失去焦點時,文本選中狀態自動隱藏,重新獲得焦點時再顯示。
下面的語句把MaskEdit中選中的文本剪切到剪貼板:
MaskEdit .CutToClipboard;
下面的語句把剪貼板中的文本粘貼到Memo的當前光標處:
Memo.PasteFromClipboard;
利用剪貼板類也可以實現文本的傳輸,見(7.1.2)中的介紹。
7.1.2 剪貼板類
為方便剪貼板的操作,Delphi在Clipbrd庫單元中定義了一個TClipboard類,并且預定義了一個變量Clipboard作為類TClipboard的實例,從而使用戶在絕大多數場合不必自己去定義一個TClipboard的實例。
利用剪貼板類可以進行文本、圖像和部件的傳輸,剪貼板類為實現這些方法提供了相應的屬性和方法。表7.2、表7.3列出了TClipboard屬性和方法的意義。
表 7.2 TClipboard的屬性
━━━━━━━━━━━━━━━━━━━━━━━━━━━
屬 性 意 義
───────────────────────────
AsText 保存剪貼板的文本,只有運行時才可設置
FormatCount 可用剪貼板格式的數目
Formats 可用剪貼板格式鏈
━━━━━━━━━━━━━━━━━━━━━━━━━━━
表 7.3 TClipboard的方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
方 法 參 數 意 義
─────────────────────────────────────
Clear 無 清除剪貼板的內容
Assign Source:TPersistent 把Source參數指定的對象拷貝到剪貼板,常
用于圖形、圖像對象
Open 無打開剪貼板,阻止其它應用程序改變它的內容
Close 無 關閉打開的剪貼板
SetComponent Source:TPersistent 把部件拷貝到剪貼板
GetComponent Owner 從剪貼板取回一個部件并放置
Parent :TPersistent
SetAsHandle Format:Word 把指定格式數據的句柄交給剪貼板
返回類型:THandle
GetAsHandle Format:Word 返回剪貼板指定格式數據的句柄
返回類型:THandle
HasFormat Format:Word 判斷剪貼板是否擁有給定的格式
返回類型:Boolean
SetTextBuf Buffer:PChar 設置剪貼板的文本內容
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
剪貼板中可能的數據格式如下表。
表 7.4 剪貼板數據格式及其意義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
數據格式 意 義
──────────────────────────────
CF_TEXT 文本。每行以CF_LF結束,nil標志文本結束
CF_BITMAP Windows位圖
CF_METAFILE Windows元文件
CF_PICTURE TPicture類型的對象
CF_OBJECT 任何TPersistent類型的對象
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
利用TClipboard實現文本的傳輸使用AsText屬性和SetTextBuf方法。
AsText屬性為非控件部件的剪貼板操作提供了方便。如:
Clipboard. AsText := Form1.Caption ;
把Form1的標題拷貝到剪貼板。
Label1.Caption := Clipboard.AsText;
把剪貼板中的文本寫入Label1。
SetTextBuf用于把超過255個字符的字符串拷入剪貼板。
7.1.3 利用剪貼板傳輸圖像
7.1.3.1 拷貝
Image部件上的內容和窗體上的圖形可以直接拷貝到剪貼板。圖像拷貝利用Clipboard的Assign方法。
例如:
Clipboard.Assign(Image1.Picture);
把Image1上的圖像拷貝到剪貼板。
7.1.3.2 剪切
圖像的剪切是首先把圖像拷貝到剪貼板,而后在原位置用空白圖像進行覆蓋。
下面一段程序表示了圖像的剪切。
procedure TForm1.Cut1Click(Sender: TObject);
var
ARect: TRect;
begin
Clipboard.Assign(Image1.Picture);
with Image.Canvas do
begin
CopyMode := cmWhiteness;
ARect := Rect(0, 0, Image.Width, Image.Height);
CopyRect(ARect, Image.Canvas, ARect);
CopyMode := cmSrcCopy;
end;
end;
7.1.3.3 粘貼
從剪貼板上粘貼圖像,首先檢測剪貼板上的數據格式。如果格式為CF_BITMAP,則調用目標位圖的Assign 方法粘貼圖像。
程序清單如下。
procedure TForm1.PasteButtonClick(Sender: TObject);
var
Bitmap: TBitmap;
begin
if Clipboard.HasFormat(CF_BITMAP) then
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(Clipboard);
Image.Canvas.Draw(0, 0, Bitmap);
finally
Bitmap.Free;
end;
end;
end;
try...finally為資源保護塊,參第十二章。
7.1.4 建立自己的剪貼板觀察程序
在這一節中我們要建立一個自己的剪貼板觀察程序,用來保存截獲到剪貼板中的位圖。
Windows允許用戶建立自己的剪貼板觀察程序,并把該程序添加到一個剪貼板觀察器鏈中。在鏈中,位置靠前的程序有義務把有關剪貼板的消息傳遞到緊隨其后的觀察程序。而處于鏈首的程序由Windows的消息循環機制直接把剪貼板消息發送過來。
建立一個剪貼板觀察程序,首先該程序必須能響應相應的Windows消息。對于那些熟悉Microsoft公司Visual Basic的讀者來說,這是令他們頭疼而束手無策的地方。但Delphi在這方面卻有良好的表現:利用關鍵字message,用戶可以將一個過程定義為響應特定的Windows消息。如:
procedure WMDrawClipboard(var Msg:TWMDrawClipboard);
message WM_DRAWCLIPBOARD;
可以響應WM_DRAWCLIPBOARD消息。類TWMDrawClipboard是消息類Message 的子類。Delphi把所有的消息都重新進行了定義,使用戶在使用時可以直接引用其便于記憶的數據成員,而不必再自己動手去分解消息。雖然這并不能算作是一個重大的改進,但卻體現了Delphi處處為用戶方便著想的特點。
我們將要建立的程序目的是把截獲到剪貼板上的位圖保存下來。在本書的寫作過程中,這一工作是大量存在的。雖然利用Windows工具PaintBrush(畫筆),通過粘貼、保存等操作可以實現這一功能,但卻存在以下一些問題:
1.程序頻繁切換影響效率,當有大量位圖存在時更是如此;
2.畫筆有一個很討厭的缺陷:當剪貼板上的位圖比畫筆界面的客戶區大時,客戶區外的位圖被截斷。因而往往需要根據所截獲位圖的大小來調整畫筆客戶區的大小,并重新進行粘貼。而如果開始就把畫筆客戶區調整到足夠大,又會覆蓋掉屏幕上一些有用的信息。
為解決這些問題,我開發了下面的程序。程序啟動時,以極小化方式運行。此時只要剪貼板中存入位圖,則自動彈出一個對話框請求用戶保存。如果用戶希望查看確認,則可以雙擊運行程序圖標,選擇相應按鈕,剪貼板中的位圖就會顯示在屏幕上。
部件關鍵屬性設計如下:
ClipSaveForm:
Caption=‘Save Bitmap in Clipboard '
Panel1:
Align = ' Top '
Image1:
Align = ' Client '
SaveDialog1:
FileEditStyle = fsEdit
FileName = '*.bmp'
Filter = 'Bitmap Files(*.bmp)|*.bmp|Any Files(*.*)|*.*'
InitialDir = 'c:\bmp'
Title = 'Save Bitmap'
程序主窗口是TForm派生類TClipSaveForm的實例。TClipSaveForm通過定義一些私有數據成員和過程,使響應和處理Windows的相應消息成為可能。下面是TClipSaveForm的類定義:
type
TClipSaveForm = class(TForm)
SaveDialog1: TSaveDialog;
Image1: TImage;
Panel1: TPanel;
Button1: TButton;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
{ Private declarations }
MyBitmap: TBitmap; { 保存截獲的位圖 }
View: Boolean; { 判斷是否顯示 }
NextViewerHandle: HWND; { 下一剪貼板觀察器的句柄 }
procedure WMDrawClipboard(var Msg:TWMDrawClipboard);
message WM_DRAWCLIPBOARD;
procedure WMChangeCBChain(var Msg:TWMChangeCBChain);
message WM_CHANGECBCHAIN;
{ 響應Windows的剪貼板消息 }
public
{ Public declarations }
end;
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |