分享
 
 
 

用C++Builder实现Word 97自动化

王朝c/c++·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

用C++Builder实现Word 97自动化

江西南昌华东交大控制信息

工程研究所(330013)刘遵雄

----要在应用程序中控制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

#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 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")

+"页数是:"+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中编译通过,运行该应用

程序首先必须获得文档,然后才可以编辑文档。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有