8.2 設計狀態OLE對象的創建
Dephi可以在設計狀態和運行狀態中創建OLE對象。本節介紹設計狀態OLE對象的創建。
8.2.1 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對象的初始化信息的數據結構。