用C++Builder實現Word 97自動化 (轉)

worldblog發表於2007-12-06
用C++Builder實現Word 97自動化 (轉)[@more@]

用C++Builder實現 97自動化
江西南昌華東交大控制資訊
工程研究所(330013)劉遵雄


  ----要在應用中控制Word 97的執行,首先必須在編制自動化客戶程式時使其頭中包含檔案ComObj.hpp,寫入#include。工具C++Builder的開發者把Word 97自動化的功能大致包裝成了幾個Ole 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的自動化物件及 Word 幫助檔案中關於Word的物件方法和屬性。Word物件代表一個Word的元素,如文件、段落、書籤或單個的字元。集合是一個物件,該物件包含其他數個物件,通常這些物件屬於相同的型別,例如,一個集合物件中可包含文件中的所有書籤物件。透過使用屬性和方法,可以修改單個的物件,也可修改整個的物件集合。屬性是物件的一個特性或者該物件操作的一個方面。例如,文件屬性包含名稱、內容、儲存狀態,以及是否啟用修訂。要更改一個物件的屬性,可以修改屬性的值。方法是物件可以進行的動作。

  ----代表Word 97應用程式的自動化物件有兩個:Word.Application和Word.Basic,透過Application物件的Worasic屬性可以允許它們之間進行變換賦值。在C++Builder中透過CreateOleObject("…")就可啟動Word並獲得控制程式碼,將其賦給Variant變數。如有兩個Variant型變數V1和V2,WordBasic是Application物件的屬性:
  V1=CreateOleObject("Word.Application");
  V2=V1.OleFunction("WordBasic")。


  ----以下透過一個簡單的例子,具體說明如何在C++Builder中實現Word 97的自動化功能,其功能是開啟或建立新文件,並向當前活動中傳送文字、插入點陣圖和畫條直線等。在C++Builder整合開發環境下,建立一專案Project1,其中包含Form1(其Caption為OLE Automation)的單元檔案Unit1.cpp。表單Form1的OpenDialog1物件的Filter設為Word文件或點陣圖。Unit1.cpp的標頭檔案中必須包含"ComObj.hpp"。程式碼如下:
標頭檔案Unit1.h程式碼為:

#ifndef Unit1H
#define Unit1H
//-------------
#include
#include
#include
#include
#include
#include
#include
//-------------
  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
#pragma hdrstop
#include "Unit1.h"
#include
//-------------
#pragma package(smart_init)
#pragma re "*.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")
 +"頁數是:"+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中編譯透過,執行該應用
 程式首先必須獲得文件,然後才可以編輯文件。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988972/,如需轉載,請註明出處,否則將追究法律責任。

相關文章