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對象的初始化資訊的資料結構。