要在應用程序中控制Word
97 的運行,首先必須在編制自動化客戶程序時使其頭文件中包含文件ComObj.hpp,寫入#include
。編程工具C ++Builder 的開發者把調用Word 97
自動化對象的功能大致包裝成了幾個Ole object class
函數,應用程序設計人員可以很方便地利用它們。
*設定Ole 對象的屬性:
OlePropertyGet(propname)
OlePropertySet(propname,value)
其中value 是任何可以轉換為Variant 型的值
*調用Ole 對象的方法:
OleProcedure(OleProcName,[val,...])
OleFunction(OleFuncName,[val,...])
其中val 是任何可以轉換為Variant 型的值
可以通過OleFunction(OleFuncName,[val,...])
父對象返回其子對象,句法是:子對象名= 父對象名.
OleFunction(OleFuncName,val)。而且可以對此方法組合從父對象返回其下層對象的對象。
C ++Builder 中使用OLE 自動化控制Word 97,必須掌握Word 97
的自動化對象及Microsoft Word Visual Basic 幫助文件中關于Word
的對象方法和屬性。Word 對象代表一個Word
的元素,如文檔、段落、書簽或單個的字符。集合是一個對象,該對象包含其他數個對象,通常這些對象屬于相同的類型,例如,一個集合對象中可包含文檔中的所有書簽對象。通過使用屬性和方法,可以修改單個的對象,也可修改整個的對象集合。屬性是對象的一個特性或者該對象操作的一個方面。例如,文檔屬性包含名稱、內容、保存狀態,以及是否啟用修訂。要更改一個對象的屬性,可以修改屬性的值。方法是對象可以進行的動作。
代表Word 97 應用程序的自動化對象有兩個:Word.Application 和Word.Basic,通過Application
對象的WordBasic 屬性可以允許它們之間進行變換賦值。在C ++Builder
中通過CreateOleObject(" ...") 就可啟動Word 并獲得句柄,將其賦給Variant
變量。如有兩個Variant 型變量V1 和V2,WordBasic 是Application
對象的屬性:
V1=CreateOleObject("Word.Application");
V2=V1.OleFunction("WordBasic")。
以下通過一個簡單的例子,具體說明如何在C ++Builder 中實現Word
97
的自動化功能,其功能是打開或創建新文檔,并向當前活動中發送文字、插入位圖和畫條直線等。在C
++Builder 集成開發環境IDE 下,建立一項目Project1,其中包含Form1(其Caption
為OLE Automation)的單元文件Unit1.cpp。表單Form1 的OpenDialog1 對象的Filter
設為Word 文檔或位圖。Unit1.cpp 的頭文件中必須包含"ComObj.hpp"。代碼如下:
頭文件Unit1.h 代碼為:
#ifndef Unit1H
#define Unit1H
// -------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComObj.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
// -------------
class TForm1 : public TForm
{
__published: // IDE -managed Components
TButton *Button1;
TOpenDialog *OpenDialog1;
TButton *Button2;
TMemo *Memo1;
TBevel *Bevel1;
TButton *Button3;
TLabel *Label1;
TButton *Button5;
TBevel *Bevel2;
TLabel *Label2;
TLabel *Label3;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
private:// User declarations
public:// User declarations
Variant V,Vdocuments,Vdocument1,Vdocument2,Vactive;
/ *定義Variant 型全局// 變量,
分別指代Application 對象, V 的Documents
對象, Vdocuments 的Document 對象
(Vdocument1,Vdocument2)以及
V 的ActiveDocument 對象*/
int tag; // 用于記錄Button3 被點擊的次數
__fastcall TForm1(TComponent *Owner);
Variant __fastcall GetWordObject();
// 獲得Word 97 自動化對象函數
void __fastcall Add(int i);
// 編輯當前活動文檔指定的
段落文字的函數
};
// -------------
extern PACKAGE TForm1 *Form1;
// -------------
#endif
Unit1.cpp 文件代碼為:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <ComObj.hpp>
// -------------
#pragma package(smart_init)
#pragma resource " *.dfm"
TForm1 *Form1;
// -------------
__fastcall TForm1::TForm1(TComponent *Owner)
: TForm(Owner)
{
tag=1;// 令tag 的初值為1,
其將隨Button3 的點擊次數而遞增
}
// -------------
Variant __fastcall TForm1::GetWordObject()
{
Variant Obj1;
AnsiString AppName="Word.Application" ;
HWND hPrevApp = ::FindWindow(NULL,
"Microsoft Word");
if(!hPrevApp)
{
Obj1=CreateOleObject(AppName) ;
//Word 沒啟動就啟動它返回一自動化對象
}
else
Obj1=GetActiveOleObject(AppName);
// 否則返回正在運行的實例自動化對象
Obj1.OlePropertySet("Visible",true);
return Obj1;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int j;
V=GetWordObject();
// 獲得Word 97 自動化對象Application
Vdocuments=V.OleFunction("Documents");
// 通過Application 獲取Documents 對象
if (OpenDialog1 ->Execute())
// 使用Documents 對象的Open 方法
打開文件,并返回Document 對象
Vdocument1=Vdocuments.OleFunction
("Open",OpenDialog1 ->FileName);
j=Vdocument1.OleFunction("ComputeStatistics",2);
// 計算打開文檔的頁數
Label1 ->Caption=" 文件" +
Vdocument1.OlePropertyGet("Name")
?。?quot; 頁數是:" +IntToStr(j);
}
// -------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int i,j;
i=tag;
Vactive=V.OleFunction("ActiveDocument");
// 獲取Application 的ActiveDocument 對象
j=Vactive.OleFunction("ComputeStatistics",4);
// 計算當前文檔的段落數
// 的的Paragraphs 集合對象增加一段
Vactive.OleFunction("Paragraphs").OleFunction("Add");
i=j +i;// 當前文檔被編輯的段落序號
Add(i);// 調用編輯當前活動文檔
指定的段落文字的函數
Memo1 ->Clear();// 清除Memo1 的內容
tag=tag +1;
}
// --------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
V=GetWordObject();
Vdocuments=V.OleFunction("");
Vdocument2=Vdocuments.OleFunction("Add");
// 使用Documents 對象的Add 方法新建文檔
Vdocument2.OlePropertySet("Password","12345");
// 設置新建文檔的口令
}
// --------------
void __fastcall TForm1::Add(int i)
{
Variant V1;
// 設置被編輯段的內容、字體大小、
顏色及是否斜體
V1=((Vactive.OleFunction("Paragraphs")).
OleFunction("Item",i)).OleFunction("Range");
(V1.OleFunction("Font")).OlePropertySet("Italic",true);
(V1.OleFunction("Font")).OlePropertySet("Size",18);
(V1.OleFunction("Font")).OlePropertySet("ColorIndex",6);
(V1.OleFunction("Font")).OlePropertySet("Size",18);
V1.OlePropertySet("Text",Memo1 ->Text);
}
// -------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Variant Vshape,Vactive1,Vline;
Vactive1=V.OleFunction("ActiveDocument");
Vshape=Vactive1.OleFunction("Shapes");
// 獲取當前活動文檔的Shapes 對象
// 使用Shapes 對象的AddLine 方法化直線
Vline=Vshape.OleFunction("AddLine",90,80,400,80);
if (OpenDialog1 ->Execute())
// 使用Shapes 對象的AddPicture
方法插入指定位圖
Vshape.OleFunction("AddPicture",OpenDialog1
->FileName,50,50,80,100);
}
----此程序在C ++Builder 3
中編譯通過,運行該應用程序首先必須獲得文檔,然后才可以編輯文檔?!?/p>