程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第八章-對象鏈接與嵌入(一)(4)

第八章-對象鏈接與嵌入(一)(4)

編輯:Delphi

8.3.4.2 在剪貼板中使用OLE對象 

要把OLE對象粘貼到OLE應用程序中,必須用Windows的 RegisterClipboardFormat函數為鏈連對象、嵌入對象注冊兩種新的剪貼板格式。這些格式將在BOLEFormat記錄的fmtIdt域中被用到。

本章例程中, 程序在OnCreate事件中注冊OLE對象的剪貼板格式,以下代碼是主窗體的OnCreate事件: 

  procedure TOLEFrameForm.FormCreate(Sender: TObject);

begin

FEmbedClipFmt := RegisterClipboardFormat('Embedded Object');

FLinkClipFmt := RegisterClipboardFormat('Link Source');

Fmts[0].fmtId := FEmbedClipFmt;

Fmts[0].fmtMedium := BOLEMediumCalc(FEmbedClipFmt);

Fmts[0].fmtIsLinkable := False;

StrPCopy(Fmts[0].fmtName, '%s');

StrPCopy(Fmts[0].fmtResultName, '%s');

Fmts[1].fmtId := FLinkClipFmt;

Fmts[1].fmtMedium := BOLEMediumCalc(FLinkClipFmt);

Fmts[1].fmtIsLinkable := True;

StrPCopy(Fmts[1].fmtName, '%s');

StrPCopy(Fmts[1].fmtResultName, '%s');

RegisterFormAsOleDropTarget(Self, Fmts)

end; 

程序傳給RegistClipBroardFormat函數一個描述格式的參數,它返回一個Word類型的值。該值能唯一的辨識新注冊的格式。FEmbdeClipFmt,FlinkClipFmt 是TOLEFormat類的私有數據成員。 聲明如下:

TYPE

TOLEForaneForm = Class(TForm)

private

FEmbedClipFmt: Word;

FLinkClipFmt: Word;

function CreateChild: TOLEObjectForm;

public

Fmts: array[0..1] of BOleFormat;

end; 

在注冊剪貼板格式後, 還必須定義OLE 格式才能進行對象粘貼。 每種格式定義在BOLEFormat記錄中。 程序中可能注冊標准剪貼板格式並用這種格式進行粘貼。例如:注冊文本作為粘貼格式,將BOLEFormat記錄為fmtId域定義為CF_TEXT,fmt Medium 域定義為BOLE_MED_HGLOBOL。 BOLEMediumCalc 函數可以根據定義的剪貼板格式計算出fmtMedium值。在本章例程中,程序注冊了兩種格式,一種是鏈接OLE對象的格式,另一種是嵌入OLE對象的格式。

BOLEFormat類型定義在BOLEDefs單元中,BOLEMediumCalc函數定義在ToCtrl單元。因此主窗中的interface部分應加入這兩個單元。 

interface 

use…,BOLEDefs,ToCtrl,

在粘貼OLE對象前,應用程序必須知道在剪貼板中是否有OLE對象。

PasteSpecialEnabled函數可判斷粘貼對話框是否有效。如果剪貼板上有Fmts定義的任何一種格式,PasteSpecialEnable將返回真值, 粘貼對話框才能成功地調用。反之調用粘貼對話框將不發生任何事件。

以下代碼實現“編輯|粘貼”菜單項的功能: 

procedure TOLEObjectForm.PasteSpecial1Click(Sender: TObject);

var

ClipFmt: Word;

DataHand: THandle;

Info: Pointer;

begin

if PasteSpecialEnabled(Self, OLEFrameForm.Fmts) then

if PasteSpecialDlg(Self, OLEFrameForm.Fmts, 0,

ClipFmt, DataHand, Info) then

InitializeOLEObject(Info)

end; 

只有在粘貼對話框有效時“編輯|粘貼”菜單才有效,以下代碼實現此功能: 

procedure TOLEObjectForm.Edit1Click(Sender: TObject);

begin

PasteSpecial1.Enabled := PasteSpecialEnabled(Self, OLEFrameForm.Fmts)

end; 

8.3.5 釋放OLE對象 

從OLE服務器拖動OLE對象並將其放在OLE應用程序是一種方便的對象鏈接與嵌入的方法。通過拖放操作,用戶不需要使用插入對話框或粘貼對話框來定義OLE對象。而只需用鼠標鍵從OLE服務器中“抓”住OLE對象,拖至OLE應用程序,松開鼠標鍵,從而實現OLE對象的插入。 

8.3.5.1 注冊OLE釋放目標窗體 

為了接收一個釋放的OLE對象,必須有一個窗體在Windows中注冊成OLE釋放目標,用RegisterFormASOLEDropTarget函數可實現此功能。 

RegisterFormASOLEDropTarger(Form : TFrom;Const Fmts: array of BOlefrom).

其中Form是OLE對象的釋放目標窗體,在本章例程中,將子窗體傳遞給Form參數。

Fmts是對象格式的數組。它是BOLEFormat 類型的數組。 所有要釋放的數據必須用Fmts數組中相應BOLEFormat元素注冊。

在本章例程中,注冊的Fmts 數組與主窗體OnCreate事件 聲明的數組相同, 即:聯接對象格式和嵌入對象格式。如果想接收更多類型的釋放數據,就必須在Fmts數組中加入其它元素。例如應用程序要接收釋放的文本,Fmts需加第三個元素, 其fmtId 域為CF_TEXT,BOLEMedium域為BOLE_MED_HGLOBL.

拖放過程中不需要用BOLEFormat的fmtName,fmtResultName域,如果程序只進行拖放操作而不進行對象粘貼,可以不初始化兩個域。

在主窗體的OnCreate事件中可調用RegisterFormAsOLEDropTorget。 

procedure TOLEFrameForm,FormCreate(Sender : TObject);

begin…

Register FormASOleDropTarget(Self,Fmts)

end; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved