TOLEContainer部件的用法詳解

TOLEContainer部件

  要創建OLE對象,需在窗體中加入OLE包容器部件。 應用程序部件包含鏈接或嵌入的對象。用該部件可顯示在OLE服務器編輯的數據。部件的ObjClass,ObjDoc,ObjItem 屬性分別定義OLE類、文件、項目。要定義OLE對象是否本地激活,使用InPlaceActive 屬性。如果OLE對象可以本地激活,OLE服務器菜單將與OLE應用程序的菜單進行融合,GroupIndex屬性的值將決定菜單融合情況。

8.2.2 OLE對象創建的步驟:

  1.在窗體中增加OLE包容器部件;

  2.在Object inspector中單擊ObjClass或ObjDoc屬性的省略按鈕,將出現插入對象對話框;

    3.如果要插入的OLE 對象已存儲在文件中,選擇“Creat From File”,而後定義該對象的文件名和路徑名。如果是鏈接對象,則選擇鏈接檢查框。 如果是嵌入對象,選擇“Creat new”,並在對象類型列表框中選擇OLE對象;

  4.選擇OK按鈕;

  如果是創建新對象,OLE服務器將激活,則可對OLE對象進行編輯,完成編輯後關閉OLE服務器。典型的例子是單擊服務器中的“File”或“File|Update”菜單。

  5.此時ObjClass屬性中包含了相應的值,如果OLE對象從已存在的文件中創建或插入一

個鏈接對象,ObjDoc屬性包含了OLE文件。

  在設計對象狀態時也可以粘貼OLE對象,其步驟如下:

  1.激活服務器應用程序,選擇OLE包容器部件;

  2.在服務器中,將數據或對象拷貝到剪切板;

  3.進入Delphi集成開發環境,選擇OLE包容器部件;

  4.在 Object inspector窗體中選擇ObjItem屬性的省略(…)按鈕;

  5.在列表中選擇OLE對象;

  6.選擇“Paste"創建一個嵌入對象或選擇"Pastelink"創建鏈接對象;

  7.選擇OK。

OLE包容器部件在此時初始化。如果粘貼一個嵌入對象,ObjClass屬性將包含適當的值。如果粘貼一鏈接對象,ObjClass,ObjDoc,ObjItem屬性將全部定義。OLE 應用程序部件包含代表OLE對象的圖片。

  如果OLE服務器程序支持OLE對象的拖放功能,則在設計狀態從服務器中拖動對象至應用程序,應用程序將創建鏈接對象,具體步驟:

  1.激活服務器,並Delphi集成開放環境中選擇要鏈接的對象;

  2.按隹鼠標左鍵拖動OLE對象至設計狀態的窗體;

  3.鬆開鼠鍵釋放OLE對象。

  窗體將創建OLE應用程序並進行初始化。

8.3 OLE應用程序的開發

  Delphi可以在設計狀態和運行狀態創建OLE對象,上一節介紹的是在設計狀態如何創建OLE對象,這一節將通過例程介紹如何在運行狀態創建OLE對象、粘貼對象、拖動對象,以及OLE 對象的文件操作。我們開發的 OLE.dpr是一個OLE應用程序的實例

8.3.1 OLE應用程序界面開發

  OLE.dpr採用了多文檔界面,父窗體有菜單,工具條,狀態條,子窗體有一個OLE包容器部件,下面分別加以介紹。

8.3.1.1 OLE應用程序的菜單

  OLE應用程序的菜單與其它應用程序的主菜單大體一致,如果應用程序中有支持本地激活的OLE 2.0對象,則要進行菜單融合。查閱OLE 服務器的資料可知道服務器是否支持本地激活。

  OLE應用程序菜單的GroupIndex屬性決定融合菜單的位置,即融合菜單是更換主菜單,還是插入至應用程序的主菜單中。

  OLE服務器,將融合三組菜單:Edit,View,Help,每組菜單分配了唯一的組索引值。在OLE應用程序中任何索引值爲1,3,5的菜單組在菜單融合時被OLE服務器中具有相應索引值的菜 單更換。在本例程中,編輯菜單項在菜單融合時被服務器的"Edit"替換。如圖8.3。 要想保存應用程序中的菜單,分配有異於1,3,5的索引值。

表8.3 融合後的菜單

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

菜單  索引值    功能描述       來源(OLE激活時)

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

文件   0   使用文件和退出程序      OLE應用程序

Edit 1 編輯OLE對象         OLE服務器

對象   2 操作未激活的OLE對象     OLE應用程序

View 3 修改OLE對象的觀測方式    OLE服務器

窗體  4 操縱窗體           OLE應用程序

Help 5 訪問服務器在線幫助      OLE服務器

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

8.3.1.2 OLE工具條和狀態條

  當OLE對象被本地激活時,OLE服務器將試圖用自己的工具條和狀態條替換OLE應用程序的。如果應用程序想要本地激活, 就應該在應用程序中編寫相應的代碼讓服務器使用工具條和狀態條。要做到這點,必須:

  ● 設置工具條和狀態條

  ● 在應用程序中加入狀態條

   通過修改面板部件的屬性創建工具條和狀態條。

  當OLE對象被本地激活時,面板或其他對齊控制將與OLE服務器程序進行協調。 這意味

OLE服務器可以替換OLE應用程序窗體中任何對齊控制,但鎖定的控制不能被替換。例如,

如果面板的align屬性是alTop,alleft,alBottom,alIngh時,控制未鎖定,OLE服務器可以替換。要使應用程序的工具條、狀態條不被替換,可將locked屬性設置成真值。

  當OLE 對象被激活,OLE 服務器在狀態條中顯示有關信息時,OLE 應用程序部件的OnStatusLineEvent事件發生,一個文本字符會將從OLE服務器傳至該事件句柄。 OnStatusLineEvent事件句柄的MSG參數接受文本字符。

以下代碼用以狀態條接收OLE服務器的信息:

procedure TOLEObjectForm.OleContainerStatusLineEvent(Sender: TObject;

Msg: String);

begin

OLEFrameForm.StatusBarPanel.Caption := Msg

end;

8.3.2 插入OLE對象

    運行狀態時進行對象鏈接與插入也要用到插入對話框,Delphi中沒有插入對話框部件,但可調用InsertOLEObjectDlg 函數來顯示對話框。

8.3.2.1 InsertOLEObjectDlg函數聲明如下:

function InsertOleObjectDlg(Form: TForm; HelpContext: THelpContext;

var PInitInfo: Pointer): Boolean;

  其中參數Form是擁有插入對話框的窗體,一般將擁有OLE包容器部件的窗體名字傳給Form.

參數Helplontext爲插入對象對話框定義在線幫助,如果應用程序沒有在線幫助, HelpContext的值爲零,對話框中將不出現幫助按鈕。

  參數PInitInfo是一個無類型指針,該指針指向一個包含初始化OLE 部件信息的內部數據結構。InsertOLEObjectDlg修改這個指針以指向一個有效的數據結構,該結構包含了對話框列表中被選擇的OLE 對象初始化信息。當該指針被使用後,應調用ReleaseOLEInitInfo過程釋放初始化信息所佔用的內存。

  當用戶選擇OK 按鈕關閉插入對象對話框,InsertOLEObjectDlg 返回真值,並把 PInitInfo指向包含OLE對象的初始化信息的數據結構。

8.3.2.2 初始化OLE包容器部件

  爲了使OLE包容器部件包含OLE對象,必須對部件進行初始化。 初始化主要是定義部件的OLE類。如果定義了OLE文件和OLE項目,初始化完成後,OLE 應用程序部件將包含OLE對象。

  調用InsertOLEObjetDlg函數可在其參數PInitInfo獲得關於OLE對象初始化的信息時,把它傳遞給OLE包容器部件的PInitInfo屬性,OLE包容部件的ObjClass,ObjDoc,ObjItem屬性將被自動定義。

  初始化完成後,OLE對象被擊活。OLE服務器將獲得控制,用戶可通過OLE服務器對OLE對象進行編輯。當程序凍結OLE對象,OLE包容器部件將包含一幅圖像或位圖代表OLE對象。定義OLE包容器部件的AutoActive屬性可重新激活OLE對象,缺省情況下,雙擊OLE包容器部件可擊活OLE對象。

  例程中初始OLE對象的代碼如下:

procedure TOLEObjectForm.InitializeOLEObject(Info: Pointer);

begin

OLEContainer.PInitInfo := Info;

ReleaseOLEInitInfo(Info)

end;

  該過程先將初始化指針傳給OLE包容器部件的PInitInfo屬性,而後釋放其內存空間。

  當用戶單擊例程中的“編輯 | 插入”菜單項,將彈出插入對象對話框,選擇對象類型後, OLE對象被激活,該過程的代碼如下:

  procedure TOLEObjectForm.InsertObject1Click(Sender: TObject);

var

Info: Pointer;

begin

if InsertOLEObjectDlg(OLEFrameForm, 0, Info) then

InitializeOLEObject(Info);

end;

8.3.3 凍結OLE對象

  如果OLE對象是OLE 1.0服務器創建,對象將在OLE服務器中被擊活,焦點和控制移到OLE服務器中。要凍結一個由OLE 1.0創建的對象選擇"File | Exit"菜單項。

  如果OLE 2.0服務器支持本地激活,激活OLE對象後OLE服務器將進行菜單融合,並轉換工具條和狀態條。要凍結對象,只需在應用程序窗體中異於OLE包容器部件的任何地方單擊鼠

標鍵即可。

  另一種凍結對象的方法是把OLE包容器部件的Active屬性設置成假值。在例程中,“對象|凍結”菜單項實現凍結功能。代碼如下:

  procedure TOLEObjectForm.Deactivate1Click(Sender: TObject);

begin

OLEContainer.Active := False

end;

8.3.4 粘貼OLE對象

  一些OLE服務器允許用戶把OLE對象複製到剪貼板,如果一個OLE對象複製到剪貼板上,OLE應用程序可通過初始化OLE包容器部件來粘貼OLE對象。

8.3.4.1 粘貼對話框

  把OLE對象粘貼到OLE包容器部件,要使用粘貼對話框,Delphi 中沒有粘貼對話框部件,但可用PasteSpecialDlg函數顯示粘貼對話框。

  PasteSpecialDlg 函數聲明如下:

   function PasteSpecialDlg(Form :TForm;Const First:arrang; HelpConcert: THelpCOntext;var Forrmat : Word; var Hardle : THanlle var PInitInfo :Point ) : Boolean;

PasteSpecialDlg參數定義如下:

  參數Form是擁有粘貼對話框的窗體,應把包含OLE包容器部件的窗體名字傳遞給Form。

    參數Format是註冊對象格式的數組,每組格式是BOLEFormat類型的數組成員。例如應用程序可註冊兩種對象格式。爲嵌入對象註冊FEmbedClipFmt ,爲鏈接對象註冊FlinkClipFmt。

BOLEFormat 聲明如下:

  BOLEFormat: Record

fmtID : Word;

fmtName : array[0..31] of char;

fmtResultName : array[0..31] of char;

fmtMediun : BOleMedium;

fmIsLInkble : Bool;

end;

    fmtID是對象的剪貼板格式ID號,fmtID 可以是標準的剪貼板格式:CF_TEXT,CF_BIFMAP。使用OLE 對象時, 需註冊新的剪貼板格式來處理OLE 對象。Windows的API中 的RegisterClipbordFormat函數註冊格式。

    fmtName表示是對象的名字,用以定義出現在粘貼對話框中列表框 內的對象名稱。在例程中,把“%S”匹配給fmtName,OLE服務器自動地把格式化的名字代替“%S”參數。例如,如果OLE服務器是畫筆,在程序運行時“Paintbrush Picture Object”將代替“%S”。

  fmtResultName,定義出現在粘貼對話框中結果檢查框內的名字。在例程中, 把“%S”傳給了fmtResultName。OLE服務器自動地把格式結果名稱代替“%S”參數。例如,如果OLE服務器是畫筆,程序運行時“Paintbrush Picture”將代替“%S”。

  fmtMedium是BOLEMedium類型,是Windows決定對象格式的數據類型。例如,OLE 聯

接對象的格式是BOLE_MED_STREAM。OLE嵌入對象的格式是BOLE_MED_STORAGE。BOLEMedium函數可計算出需要的BOLEMedium類型。

  fmtIsLinkale決定對象格式是否可聯連。聯連對象的fmtIsLinkable爲真值。嵌入對象的fmtIsLinkable爲假值。

  參數HelpContext 爲粘貼對話框定義在線幫助。如果應用程序沒有在線幫助,HelpContext的值爲零,對話框中將不出現幫助按鈕。

  參數Form用以定義剪粘板上的格式,是由PasteSpecialDlg函數進行修改。因爲使用粘貼對話框時,應用程序並不知道剪貼板的格式。因而用Format來處理剪貼板的數據。在本章例程中。 PasteSpecialDlg 函數把format 變量修改成FEmbedClipFmt 或FLinkClipFmt格式,這兩種格式是在主窗體的OnCreate事件中定義的。如果剪貼板上的數據不是OLE對象,Format將被修改成其它類型的格式,如CF_TEXT等。

  參數Landle定義剪貼板上的數據句柄。由PasteSpecialDlg函數進行修改。 當剪貼板的數據類型不是OLE對象時,需用Handle參數訪問剪貼板數據。Handle是句柄類型。

  參數PInitInfo是一個指向OLE對象初始化結構的指針。前面在講述初始化OLE應用程序部件時也用到了這種指針。PasteSpecialDlg函數將修改PInitInfo指針以使其指向一個有效的數據結構。該結構包括了粘貼對話框中被選中的OLE對象的初始化信息。

  下面介紹粘貼對話框中的部件。

  ● 將剪貼板上的數據插入OLE應用程序,以實現對象嵌入,須選擇"Paste";

  ● 在OLE服務器資源文件與OLE應用程序之間建立聯連,以實現對象聯連,須選擇: "Paste Line;

  ● 要將聞連與嵌入的對象顯示成圖標,選擇"Display As Icon"。若這個檢查框被選中,改變圖標("Chang Icon")按鈕將顯示通過這個按鈕可改變OLE對象的缺省圖標或標籤。

  ● 如果數據不是註冊的格式,"Paste","Paste link"選擇鍵將變灰。 用戶無法從剪貼板上粘貼數據。在本章例程中,剪貼板上的數據只能是FEmbedClipFmt(嵌入對象) 和FlinkClipFmt(鏈接對象)。

  ● 用戶在列表框中選擇數據類型。有時數據被解釋成多種類型。例如在包含OLE服務器功能的字處理器中把文本複製到剪貼板中。應用程序可以以文本和OLE對象兩種方式粘貼對象。列表框中出現的選擇項由OLE服務器決定。

  用戶在粘貼對話框中選擇OK按鈕,PasteSpecialDlg返回真值,關於OLE 應用程序的初始化信息貯存在PInitInfo所指向的結構中。

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; 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章