用bcb实 现Word 97 自 动 化

原创 2001年04月21日 18:26:00

  ---- 要 在 应 用 程 序 中 控 制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) ;
file://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 中 编 译
通 过, 运 行 该 应 用 程 序 首 先 必 须 获 得 文 档, 然 后 才 可 以 编
辑 文 档。


 

【专题·线段覆盖系列】Codevs线段覆盖12345

线段覆盖1 给定x轴上的N(0 输入描述 Input Description     输入第一行是一个整数N。接下来有N行,每行有二个空格隔开的整数,表示一条线段...
  • CreationAugust
  • CreationAugust
  • 2014年11月05日 13:53
  • 1205

实对称矩阵对角化为什么要做正交化单位化操作呢?

今天晚上王小民同学问了助教姐姐一个问题,为什么对一个一般的矩阵对角化的时候,我们不用做正交单位化,对实对称矩阵对角化的时候却要做呢?这是一个很好的问题,所以和大家分享一下。 ...
  • clarstyle
  • clarstyle
  • 2014年12月09日 11:30
  • 3096

用BCB控件编写TCP/IP通讯程序的基础知识

最近在网上不断的看到有人问如何用BCB的TServerSocket和TClientSocket进行编程的问题,所以决定把我的一些编程经验告诉给大家,让大家能够尽快的掌握他们的用法。 首先要讲一下他们...
  • lixingshi
  • lixingshi
  • 2014年11月25日 15:26
  • 1178

BCB 动态生成控件

窗体上的所有对象与窗体本身都成为一个类:TForm1,我们就是将类成员与类成员函数写到TForm1类中,程序运行时,实际上就是通过TForm1 类生成Form1对象, 所以,Unit1.cpp...
  • u014438664
  • u014438664
  • 2015年03月29日 23:46
  • 494

常用的BCB 函数

文件: ActnList  CreateAction 函数 创建一个指定类型的Action,显示在action list editor中。  EnumRegisteredAction 过程 枚举已...
  • binnygoal
  • binnygoal
  • 2016年09月08日 16:17
  • 1241

BCB中的输入对话框和输出对话框(也就是消息对话框)

刚出去转了一下, 吹吹风, 回来继续写。 我们现在来说BCB中的输出对话框, 这个很常见: //--------------------------------------------...
  • stpeace
  • stpeace
  • 2015年07月26日 14:35
  • 1986

连接 insance 到 vlan101 - 每天5分钟玩转 OpenStack(97)

前面我们创建了 vlan101,今天继续部署 instance 到该 vlan network,并讨论 instance 之间的连通性。...
  • CloudMan6
  • CloudMan6
  • 2016年10月10日 08:54
  • 880

关于BCB中,Excel的一些操作(存底)

将一个Excel或sheet的部分内容复制到另一个Excel或sheet,并设置边框 //----------------------------------------------------...
  • enjoy0104
  • enjoy0104
  • 2015年01月05日 23:32
  • 905

BCB6使用ReportMachine创建报表

RM(Report Machine)是一个功能强大的Delphi 报表控件包。使用它可以制作出非常复杂的报表。下面讲述最简单的用法:  在Form上放上两个数据库控件:ADOConnection和A...
  • limuyun
  • limuyun
  • 2014年05月16日 17:08
  • 1799

WinKawaks加拳皇97rom包在PC搭建拳皇97

昨晚折腾到凌晨3点多才睡觉,本想下载一个拳皇97到自己的电脑玩玩,结果网上的各种资源都是暗含附带程序和各种广告,最终没有下载到满意的拳皇97。无奈之下,自己琢磨单独下载街机模拟器和拳皇97的rom包,...
  • K346K346
  • K346K346
  • 2016年05月06日 16:28
  • 4182
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用bcb实 现Word 97 自 动 化
举报原因:
原因补充:

(最多只允许输入30个字)