第 六 部 分 附 录

附 录 A ASCII 和 ANSI 文 件 格 式

Visual C++ 文 本 编 缉 器 以 ANSI 格 式 保 存 文 件 , 它 是 基 于 W indows 的 文 本 编 缉 器的 一 种 首 选 格 式 , 如 W indows 95 所 带 的 Notepad 实 用 程 序 。 D O S 文 本 编 缉 器 通常 使 用 相 似 的 ASCII 格 式 。ANSI 和 ASCII 格 式 都 是 把 从 0~256 的 数 字 赋 给 相 应的 256 个 字 符 。

文 本 编 缉 器 几 乎 总 是 以 ASCII 或 ANSI 格 式 保 存 文 件 , 而 不 是 以 像 Word 处 理 器那 样 的 专 用 格 式 。 起 初 , 缩 写 词 ASCII 指 的 是 一 种 约 定 : 它 把 从 32~127 的 数 字赋 给 相 应 的 96 个 字 符 , 包 括 数 字 、标 点 符 号 、 大 小 写 字 母 。 这 个 数 字 很 适 合 由 7 位 组 成 的 值 的 范 围 ( 因 为 2 的 7 次 方 等 于 128 )。 ASCII 约 定 留 出 0~31 作 为 打 印机 控 制 代 码 , 并 保 留 每 个 字 节 的 第 8 位 用 于 奇 偶 校 验 。因 为 现 在 的 内 存 不 要 求 奇偶 校 验 , 所 以 , 每 个 字 节 的 第 8 位 可 以 用 于 表 示 数 据 , 即 用 一 个 字 节 可 代 表 的 字符 数 翻 倍 , 达 到 256 。 现 在 , 我 们 所 认 为 的 ASCII 字 符 集 包 括 0~31 的 值 , 最 初的 96 个 ASCII 字 符 , 以 及 由 IBM 的 最 初 PC 设 计 者 用 额 外 的 第 8 位 添 加 的 另 外128 个 字 符 。 这 额 外 的 128 个 字 符 , 作 为 高 位 ASCII 或 者 IBM 字 符 集 , 如 表 A -

1 所 示 。

在 高 位 ASCII 集 中 的 一 些 字 符 , 尤 其 是 画 框 字 符 ,在首选 ANSI 标 准 的 W indows

这 样 的 图 形 环 境 中 不 能 正 常 工 作 。 ASCII 和 ANSI 在 前 128 个 字 符 中 , 大 多 数 是一 致 的 , 但 对 更 高 的 字 符 , 却 指 定 了 不 同 的 数 字 。 这 就 是 使 用 基 于 DOS 的 文 本编 缉 器 中 创 建 包 括 高 位 ASCII 字 符 的 文 档 ,而 在 Visual C++ 文 本 编 缉 器 中 这 些 字符 就 显 示 为 另 一 种 形 式 的 原 因 。

从 技 术 上 来 说 , 任 何 文 件 都 由 ASCI I( 或 ANS I )字符组成。但在 ASCII 和 ANSI 格 式 中 , 每 一 个 字 符 具 有 不 同 的 面 值 。 Z , é 和 ¼ 即为 “ Z , ”,“ é ,”和 “ ¼ , ”。字符 只 代 表 字 符 本 身 , 并 不 代 表 代 码 、 命 令 或 别 的 东 西 。 这 项 规 则 的 唯 一 例 外 是 制表 符 和 回 车 符 。制 表 符 是 一 个 代 表 一 定 数 目 空 格 的 字 符( ASCII 值 为 9 )。用 于 标识 文 本 行 结 尾 的 回 车 符 格 式 取 决 于 编 辑 器 和 操 作 系 统 。 在 DOS 和 W indows 环 境中 , 一 个 回 车 符 包 括 一 对 由 ASCII 值 13 和 10 组 成 的 字 符 。 ASCII 13 被 称 为 回车 , 通 知 光 标 移 到 行 的 开 始 处 。 而 ASCII 10 , 被 称 为 换 行 , 指 示 移 向 下 一 行 。 这两 个 字 符 的 顺 序 是 很 重 要 的 ; ASCII 13 必 须 在 ASCII 10 之 前 , 否 则 , 回 车 符 通常就不会被识别。在 U N IX 操 作 系 统 中 , 换 行 独 自 作 为 行 结 尾 标 识 , 它 暗 示 着 一个 新 行 和 一 个 回 车 。Visual C++ 文 本 编 缉 器 同 时 识 别 这 两 种 回 车 符 形 式 ,即 ASCII 13-10 成 对 使 用 , 或 者 是 单 独 使 用 ASCII 10 。

表 A-1 高位 ASCII 集 , 值 从 128 ~ 255

第 六 部 分 附 录 - 图1

表 A-2 列 出 了 US ANSI 集 的 全 部 256 个 字 符 , 其 中 一 些 Windows 不 能 显 示 。 这些 不 能 显 示 的 ANSI 字 符 通 常 在 屏 幕 上 显 示 为 一 个 小 框 或 空 格 ,表 A-2 中 所 示 的是 像   一 样 常 见 的 小 框 。这 个 表 为 每 个 字 符 列 出 八 进 制 值 ,而 不 是 十 六 进 制 值 。知 道 一 个 字 符 的 八 进 制 值 ,可 以 让 用 户 通 过 在 一 个 反 斜 杠 后 键 入 字 符 的 八 进 制 值来 在 一 个 资 源 串 中 或 静 态 文 本 框 中 加 入 该 字 符 。例 如 ,为 了 在 一 个 串 中 加 入 ANSI 字 符 ½ , 只 要 输 入 \275 。 注 意 , W indows 能 够 显 示 一 些 字 符 , 如 只 能 用 TrueType 字 体 的 商 标 符 号 ™ 。

表 A-2 ANSI 字 符 集 , 值 从 0~255

第 六 部 分 附 录 - 图2

第 六 部 分 附 录 - 图3

表 示 W indows 不 显 示 此 字 符仅 表 示 TrueType 字 体 。

附 录 B C lass W izard 支 持 的 MFC 类

正 如 第 6 章 所 讲 的 ,ClassWizard 是 一 个 被 设 计 成 帮 助 用 户 创 建 MFC 派 生 类 的 工具 。 本 附 录 列 出 并 简 单 描 述 了 MFC 类 , ClassWizard 能 用 这 些 MFC 类 为 派 生 类生 成 初 始 代 码 。 列 表 中 包 括 这 个 版 本 MFC 新 的 5 个 类 : CComboBoxEx , CDateTimeCtrl, CHtmlView , CIPAddressCtr , 和 CMonthCalCtrl。

ClassWizard 会 显 示 New Class ( 新 类 ) 对 话 框 , 以 提 示 输 入 新 类 的 名 字 和 基 类 , 如 图 6-4 所 示 。 在 对 话 框 的 Automation 组 框 内 的 单 选 按 钮 决 定 新 类 是 否 支 持Automation ( 自 动 化 ) 或 提 供 一 个 类 型 标 识 符 。

第 六 部 分 附 录 - 图4

标 识 符 是 名 称 , 更 精 确 地 说 , 它 是 编 程 标 识 符 或 ProgID 的 名 字 , 通 过 它 , 客 户程 序 能 够 使 用 Automation 创 建 类 的 一 个 对 象 。 MFC 宏IMPLEMENT_OLECREATE 把 程 序 设 计 标 识 符 录 制 到 系 统 注 册 表 中 , 以 作 为 该类 类 识 别 号 的 别 名 。

并 不 是 所 有 的 MFC 类 都 支 持 Automation 选 项 。 在 这 种 情 况 下 , New Class 对 话框 中 的 单 选 按 钮 就 被 禁 用 。表 B-1 的 支 持 列 包 括 一 个 A 或 I 代 码 ,用 于 指 示 哪 一个 类 支 持 Automation 或 类 型 标 识 。 支 持 列 中 的 D 符 号 标 识 基 于 对 话 框 的 类 , 如

Cdialog , 它 要 求 对 话 框 资 源 。

表 B-1 ClassWizard 识 别 的 M F C 类

M F C 类 支 持 * 描 述

CAnimateCtrl A ,I 自动化通用控件

CAsyncMonikerFile 在 ActiveX 控件中提供对异步标记的支持

CAsyncSocket 封装 Windows Sockets AP I,参看 CSocket CButton A ,I 按钮控件对象

CCacheDatapathProperty 允许一个 ActiveX 控件异步传输属性数据和缓冲内

存中的数据,参考 CDataPathProperty

CCmdTarget A ,I 所有能够接收和响应消息的对象的基类

CColorDialog 颜色选择的通用对话框 ,提供为显示系统定义的颜色列表

续 表

CComboBox

A ,I

组合框对象

CComboBoxEx

A ,I

CcomboBox 类的派生类,用于支持在组合框控件中

的图像列表

CDaoRecordset

代表选自数据源的记录集。 CDaoRecordset 对象可用

于三种格式 :表类型记录集,动态集类型记录集和快

照类型记录集

CDaoRecordView

D ,A

提供表单视图 ,以在控件中显示数据库记录 。表单视图是 CDaoRecordset 对象的一部分 。参考 CFormView 和 CRecordView

CDataPathProperty

实现一个 ActiveX 控件属性,它能够异步加载其数

据 。这个类允许 ActiveX 控件在后台下载属性数据时被激活

续 表

CDateTimeCtrl A ,I 封 装 新 的 日 期 / 时 间 选 取 器 控 件 ( 在 第 7 章 中 的

DirList2 示例程序中演示过)

CDialog

D ,A

用于包含控件窗口的对话框对象

CDocument

A

用于管理程序的数据的类

CDragListBox

A ,I

Windows 列表框 ,允许用户把其中的项拖放到不同的位置

CEdit

A ,I

用于文本输入的子窗口控件

CEditView A 提供 Windows 编缉控件的功能。因为 CEditView 派

生于 Cedit,该对象可同文件和文件模板一同使用

CFileDialog 通用文件对话框,提供 Open 和 Save As 对话框中的功能

续 表

CFontDialog

CFormView

D ,A

通用字体对话框 ,用于显示当前已装入系统的字体列

包含对话框控件的窗口

CFrameWnd

A

SD I(单窗口界面)框架窗口

CHeaderCtrl

A ,I

标题通用控件

CHotKeyCtrl

A ,I

热键通用控件

CHtmlView

A

实现 Web Browser 控件的视图类,能够访问当地或

Web 上的 HTML 文件。参考 Gallery 中的 Microsoft Web Browser ActiveX 控件

CHttpFilter 创建并处理超文传输协议过滤器对象 ,该对象用于过滤用于 HTTP 请求的服务器通知

CHttpSever Internet Server API( ISAPI)的包装类

续 表

CIPAddressCtrl A ,I IP 地址控件。类似于编缉框,该控件接收 Internet 协议格式的地址

CListBox CListCtrl

CListView

A ,I

A ,I

列表框对象

列表视通用控件 。示例可参考第 5 章中的 MfcTree 项目

简化 CListCtrl 的使用,添加了对文件和视图的支持

CMDIChildWnd

A

MD I (多文档界面)子框架窗口

CMiniFrameWnd

A

半高的框架窗口 ,主要用于浮动工具栏。一个小框架窗口没有最小化和最大化按钮 ,但其他都类似于正常的框架窗口

CMonthCalCtrl

A ,I

月历控件,用于显示一个用户可选择日期的日历

续 表

COleDocument

A

把一个文件看作为 CDocItem 对象的一个集合。包容

器和服务器都需要这个结构 ,因为它们的文件必须能

够包含 OLE 项

COleLinkingDoc

A

OLE 包容器文件的基类,这些文件支持对它们所包

含项的链接

COleSeverDoc

A

OLE 服务器文件的基类

COleServerItem

A

为 OLE 项提供一个服务器界面

CPrintDialog

通用打印对话框,提供 Print 和 Print Setup 对话框中

的功能

CProgressCtrl

A ,I

通用进程指示器控件

CPropertyPage

D ,A

代表属性表单中的一页 。参考第 5 章中的 DirList1 示

续 表

CPropertySheet

A

属性表 ,也叫做多选项卡对话框 。一个属性表由一个

CpropertySheet 对象和几个 CpropertyPage 对象组成

CRecordset

用于访问数据库表或查询的类

CRecordView

D ,A

包含对话框控件的窗口

CRichEditCtrl

A ,I

用户能够输入和编缉文本的窗口 ,提供字符和程序段格式,以及对嵌入 OLE 项的支持

CScrollBar

A ,I

滚动条对象

CScrollView

A

可滚动的窗口,派生于 Cview

CSliderCtrl

A ,I

提供包含一个滑块和可选的刻度线的窗口 。关于如何

使用 CSliderCtrl 的示例,参考第 5 章的 Color 项目

续 表

CSocket

Windows Socket API 的包装类

CSpinButtonCtrl

A ,I

提供箭头按钮 ,用户可单击它 ,以增加或减少某个控件中的一个值。参考第 7 章中 DirList 项目

CStatic

A ,I

用于标识另一个控件或给用户提供消息的简单文本

CStatusBarCtrl

A ,I

提供一个层次窗口 ,通常放于父窗口的底部,用于显

示关于应用程序的状态信息

CTabCtrl

A ,I

允许应用程序在一个窗口或对话框的同一区域显示

多个页面

CToolBarCtrl

A ,I

工具栏通用控件

CToolTipCtrl

A ,I

提供工具提示控件的功能 ,它以一个小弹出窗口的样

子显示,包含描述某个工具用途的一行文本

续 表

CTreeCtrl

A ,I

显示项的分层结构列表

CTreeView

简化 CTreeCtrl 的用法

CView

A

用于显示程序数据的类

CWinThread

代表一个应用程序中的一个线程

generic CWnd

A ,I

自定义的窗口

splitter

A

包含一个 CSplitterWnd 类的 MDI 子窗口。用户能够把这个窗口分割成多个窗格

* 支 持 符 号 : D=Dialog A=Automation I=Programmatic 标 识 符

附 录 C VBScript 初 步

Visual Basic Scripting 版 本 , 即 我 们 所 熟 知 的 VBScript, 是 Visual Basic for Application s( VBA ) 的 一 个 子 集 , 而 VBA 又 是 Visual Basic 的 一 种 方 言 。 通 过与 Visual C++ 组 合 作 为 它 的 宏 语 言 ,最 后 VBScript 给 Visual C++ 带 来 了 强 有 力 的宏 能 力 。 VBScript 被 打 包 为 一 个 编 译 器( 更 精 确 地 说 , 是 一 个 翻 译 器 ) 和 一 个 运行库。用 VBScript 编 写 的 宏 脚 本 能 够 重 建 一 系 列 的 Developer Studio 命 令 , 自 动执 行 手 工 做 的 几 乎 全 部 的 任 务 。 而 且 , 通 过 引 用 VBScript 运 行 库 , 一 个 宏 能 够执 行 在 Visual C++ 中 不 可 能 做 的 许 多 其 他 任 务 ,如 在 一 个 标 准 W indows 消 息 框 中显 示 消 息 和 查 询 用 户 的 输 入 。

Visual C++ 提 供 了 两 种 创 建 宏 的 技 术 : 录 制 和 编 程 。 大 多 数 宏 只 需 录 制 一 序 列 的动 作 就 能 够 创 建 了 , 这 项 技 术 不 需 要 对 VBScript 的 理 解 。 在 幕 后 , 环 境 会 自 动创 建 一 个 VBScript 宏 文 件 , 以 复 制 录 制 的 命 令 。 但 如 第 13 章 所 演 示 的 , 在 定 制Visual C++ 时 , 录 制 宏 是 有 局 限 性 的 。 一 个 录 制 的 宏 是“ 硬 连 接 的 ”, 能 很 好 地 适用 于 重 复 一 定 的 动 作 集 合 , 但 对 于 响 应 宏 运 行 时 的 不 同 环 境 却 是 不 够 的 。宏 要 有适 应 能 力 就 需 要 编 程 , 这 就 要 求 有 关 VBScript 的 知 识 。 幸 运 的 是 , VBScript 是很 容 易 学 会 的 , C/C++ 程 序 员 会 很 快 地 赏 识 它 的 许 多 特 性 。 用 户 已 经 知 道 了VBScript 的 许 多 内 容 , 即 使 用 户 以 前 没 有 见 这 种 语 言 。 本 附 录 添 补 了 一 些 知 识 ,

提 供 了 针 对 C/C++ 程 序 员 的 宏 编 程 入 门 指 南 。 为 了 学 习 VBScript 更 多 的 内 容 , 尤 其 是 它 在 文 件 中 的 应 用 , 请 参 考 关 于 这 方 面 的 大 量 书 籍 , 或 者 访 问 M icrosoft 的 Web 网 址 :

http://www.microsoft.com/vbscript

本 附 录 的 第 一 部 分 描 述 了 VBScript 中 的 各 种 语 言 元 素 , 如 变 量 、 程 序 流 语 句 和过 程 。每 项 讨 论 都 用 注 释 的 代 码 段 举 例 说 明 。VBScript 中 的 注 释 以 一 个 单 引 号 开始 , 直 到 行 末 。 VBScript 也 承 认 BASIC 中 老 式 的 Rem 语 句 , 但 Rem 已 很 少 用了 :

‘ This is a comment

Rem So is this

本 附 录 的 第 二 部 分 集 中 于 VBScript 库 中 的 函 数 上 , 为 每 个 函 数 提 供 了 一 个 简 短的 描 述 , 并 常 有 示 例 代 码 来 演 示 。

变 量

VBScript 默 认 一 种 名 为 Variant 的 数 据 类 型 , 根 据 上 下 文 , 它 可 以 包 含 数 字 或 文本 消 息 。 如 果 把 数 字 数 据 赋 给 VBScript 中 的 一 个 变 量 , 这 个 变 量 就 作 为 一 种 数

字 数 据 类 型 , 以 匹 配 该 数 据 。 把 文 本 数 据 赋 给 一 个 Variant 变 量 , 就 把 它 变 成 了一 个 字 符 串 。VBScript 提 供 了 几 个 函 数 , 用 于 转 换 内 部 数 据 类 型 。 表 C-1 列 出 了一 些 Variant 能 够 模 拟 的 数 据 类 型 。

变 量 名 应 该 表 示 出 变 量 的 内 部 子 类 型 的 含 义 。在 给 变 量 命 名 时 , 使 用 匈 牙 利 符 号或 一 种 相 似 的 约 定 , 用 以 指 示 该 变 量 的 数 据 类 型 。 像 bFlag , iNumber 和 strString 这 样 的 名 字 , 可 以 很 容 易 地 辨 认 出 包 含 BOOL , int 和 文 本 数 据 的 变 量 来 。

C-1 用 Variant 模 拟 的 数 据 类 型

数 据 类 型

说 明

BOOL

或者为 TRUE (非零 ),或者为 FALSE (零)

BYTE

int long

8 位的无符号整数,值从 0 到 255

16 位的有符号整数,值从 -32 , 768 到 32 , 767

32 位的有符号整数,值从 -2 , 147 , 483 , 648 到 2 , 147 , 483 , 647

float 单精度的浮点值,其负值变化范围从 -3.402823E38 到 -1.401298E-45 , 其正值变化范围从 1.401298E-45 到 3.402823E38

续 表

double 双精度的浮点值,其负值变化范围从 -1.79769313486232E308 到 - 4.9406564584124E-324 ,其正值变化范围从 4.9406564584124E-324 到 1.79769313486232E308

Date 表示从 100 年的 1 月 1 日到 9999 年的 12 月 31 日的日期和时间

String BSTR 类型的字符串,长度可为约 20 亿个字符

变 量 名 称 必 须 遵 守 下 列 规 则 :

  • 以 一 个 希 腊 字 母 开 头

  • 不 能 包 含 句 点

  • 最 大 长 度 为 255 个 字 符

  • 在 它 被 声 明 的 范 围 内 必 须 是 唯 一 的

除 了 数 组 外 , 不 必 在 变 量 使 用 前 声 明 它 。 如 果 用 户 喜 欢 在 程 序 的 开 头 声 明 变 量 , 请 使 用 D im 语 句 ( dimension 的 缩 写 ), 如 下 :

D i m x x=3

y=x ‘This is statement is legal ,even though y was not declared

为 了 易制 变 量该 变 量

捉 书 写 错 误 , 用 户 可 以 通 过 包 含 Option Explicit 语 句 , 在 一 个 宏 中 强

。 有 了 这 个 语 句 , 只 有 脚 本 用 一 个 D im 语 句 预 先 声 明 了 变 量 , 使 用合 法 的 。 在 宏 的 顶 部 放 入 Option Explicit 语 句 , 如 下 所 示 :

Option Explicit

Dim x

x=3 ‘Legal

y=x ‘Not legal ,because y has not been previously declared

Const 关 键 字 在 C 语 言 和 VBScript 中 有 相 同 的 功 能 。 对 于 要 保 存 静 态 数 据 的 变量 , 请 在 变 量 的 初 始 赋 值 语 句 中 用 Const 。 此 后 , VBScript 解 释 器 不 允 许 再 对 该变 量 赋 值 :

Const x=3

x=5 ‘This statement causes an error

数 组

宏 必 须 专 门 用 D im 语 句 声 明 数 组 :

D im iArray(10) ‘ A one-dimensional array

像 C 语 言 一 样 , VBScript 中 的 数 组 是 基 于 零 的 。但 与 C 中 的 声 明 不 同 的 是 , Dim 语 句 的 数 组 下 标 指 定 最 高 元 素 下 标 , 而 不 是 元 素 的 数 目 。 因 此 , 上 面 的 声 明 实 际上 分 配 了 11 个 元 素 ,从 iArray(0) 到 iArray(10) 。一 个 数 组 最 多 可 有 60 维 ,由 Dim 语 句 中 的 用 逗 号 分 隔 的 一 列 下 标 指 明 :

Dim iArray(5,10) ‘A two-dimensional array Dim iArray(5,10,15) ‘ A three-dimensional array

没 有 下 标 列 表 的 数 组 是 动 态 的 , 这 意 味 着 , 宏 能 够 在 运 行 时 改 变 数 组 的 大 小 。 用

ReDim 语 句 重 新 设 置 一 个 动 态 数 组 的 大 小 , 如 下 :

Dim iArray() ‘ Define but don’t allocate an array

ReDim iArray(100) ‘Allocate space for 101 elements

ReDim Preserve iArray(50) ‘Resize the array for 51 elements

ReDim 能 够 调 整 一 个 数 组 , 使 之 变 大 或 变 小 。 在 这 个 程 序 段 中 的 数 组 iA rray 最初 有 101 个 元 素 , 但 后 来 减 少 到 51 个 元 素 。 Preserve 关 键 字 用 来 确 保 变 小 的 数组 保 留 前 51 个 元 素 的 值 , 尽 管 在 数 组 调 整 大 小 时 , 从 元 素 iArray(51) 到 元 素iArray(100) 会 丢 失 。 在 调 整 数 组 大 小 时 , 不 用 Preserve 关 键 字 , 数 组 的 原 来 值 会被 清 除 。 VBScript 没 有 限 制 宏 调 整 数 组 大 小 的 次 数 。 但 是 , 如 果 代 码 用 Dim 语句 声 明 了 一 个 有 下 标 的 数 组 , 该 数 组 就 不 能 用 ReDim 语 句 来 调 整 大 小 。 企 图 这样 做 会 导 致 错 误 。

字 符 串

像 在 C 中 一 样 , 可 把 双 引 号 中 的 文 本 赋 给 字 符 串 变 量 :

strName = "Johe Q.Public"

用 英 镑 符 号 包 围 含 有 日 期 的 字 符 串 :

dateBirth = #07-04-76#

运 算 符

除 一 个 以 外 , 所 有 的 VBScript 运 算 符 可 分 为 三 类 : 算 术 , 比 较 , 逻 辑 。 当 不 同的 运 算 符 出 现 在 同 一 个 表 达 式 中 时 , 算 术 运 算 符 拥 有 最 高 级 , 即 VBScript 在 执行 其 他 类 的 运 算 符 前 先 进 行 算 术 操 作 , 如 加 和 乘 。 比 较 运 算 符 居 次 , 逻 辑 运 算 符最 后 。 像 在 C 语 言 中 的 一 样 , 括 号 中 的 运 算 符 比 括 号 外 的 运 算 符 先 执 行 , 而 不管 类 的 优 先 级 如 何 。 下 面 的 两 行 语 句 演 示 了 括 号 是 如 何 改 变 VBScript 执 行 表 达式 中 的 运 算 符 顺 序 的 :

x+y And z ‘ AND the variable z with the sum of x+y x+(y And z) ‘Add to the variable x the result of y AND z

优 先 级 次 序 也 存 在 于 算 术 和 逻 辑 运 算 符 中 。比 较 运 算 符 具 有 相 同 的 优 先 级 , 按 照在 表 达 式 中 出 现 的 顺 序 由 左 到 右 执 行 。 表 C-2 列 出 了 VBScript 运 算 符 , 算 术 和逻 辑 运 算 符 按 照 优 先 级 从 高 到 低 放 置 。这 样 , 表 中 的 优 先 级 按 照 从 左 到 右 和 从 上到 下 递 减 。

表 C-2 按 递 减 顺 序 排 列 的 VBScript 运 算 符

算 术 运 算 符

说 明

符 号

比 较 运 算 符

说 明

符 号

逻 辑 运 算 符

说 明

符 号

^

等于

=

Not

-

不等于

<>

逻辑 AND

And

乘法

*

小于

<

逻辑 OR

Or

除法

/

大于

>

异或

Xor

整数除法

\

小于或等于

<=

等于

Eqv

算术求模

Mod

大于或等于

>=

加法

+

减法

-

像 C 语 言 一 样 , 乘 除 运 算 符 有 同 样 的 优 先 级 。 加 减 运 算 符 也 是 如 此 。 VBScript

提 供 了 一 个 字 符 串 连 接 符 ( & ), 它 不 属 于 表 C-2 中 所 列 的 任 何 一 类 。 它 的 优 先

级 位 于 算 术 和 比 较 运 算 符 之 间 。

控 制 程 序 流

宏 通 过 条 件 分 支 语 句 和 循 环 语 句 以 及 调 用 过 程 来 控 制 程 序 流 。VBScript 不 识 别 标号 , 不 存 在 Goto 语 句 的 等 价 语 句 , 这 意 味 着 , 宏 不 能 无 条 件 地 从 脚 本 中 的 一 个地 方 跳 到 另 一 个 地 方 。 有 一 种 称 为 GoToLine 的 方 法 , 但 GoToLine 只 用 于 在 文件 中 移 动 符 号 , 与 正 在 执 行 的 宏 中 控 件 程 序 流 没 有 任 何 关 系 。

条 件 分 支 语 句

If...Then...Else 语 句 在 功 能 上 等 同 于 C 中 的 if...else 语 句 ,只 是 VBScript 不 用 在 大括 号 来 包 围 代 码 段 :

If ActiveDocument.Selection=""Then str="No Selection"

Else str=ActiveDocument.Selection

包 含 两 个 或 多 个 语 句 的 条 件 语 句 必 须 用 一 个 End If 语 句 来 结 尾 :

If x<y Then

iLine=ActiveDocument.Selection.CurrentLine iCol =ActiveDocument.Selection.CurrentColumn

End If

当 一 个 条 件 语 句 因 为 使 用 If...Then...Else 进 行 简 单 的 测 试 而 变 得 太 复 杂 时 , VBScript 的 Select Case 命 令 提 供 了 一 个 更 好 的 办 法 。该 命 令 提 供 了 一 种 基 于 变 量值 的 条 件 分 支 方 法 , 十 分 简 洁 。 它 和 C 语 言 的 switch 语 句 非 常 相 似 。 像 在 C 语言 中 的 一 样 , 每 一 个 分 支 由 一 个 case 语 句 和 一 个 唯 一 值 来 标 记 。 当 一 个 case 语句 的 值 和 Select Case 命 令 中 的 值 相 同 时 , 控 件 就 会 到 达 这 个 case 语 句 :

Select Case i Case 1

'Come here when i = 1 Case 2

  • Come here when i=2 'And so forth

End Select

VBScript 不 提 供 break 关 键 字 , 所 以 , 每 个 case 语 句 都 意 味 着 前 一 个 case 块 的结 束 。当 一 个 块 结 束 后 , 程 序 流 继 续 执 行 End Select 语 句 下 面 的 一 句 , End Select 语 句 用 于 结 束 Select Case 程 序 段 。 Case Else 语 句 执 行 和 C 中 default 关 键 字 同 样的 功 能 , 它 用 于 标 记 当 控 制 不 经 过 其 他 任 何 Case 语 句 时 所 要 执 行 的 代 码 段 :

Select Case strColor

Case

"red"

strHiLite="magenta"

Case

"blue"

strHiLite="cyan"

Case

"brown"

strHiLite="yellow"

Case

Else

strHiLite="undefined"

End Select

循 环 语 句

VBScript 提 供 几 种 循 环 结 构 , 这 几 种 循 环 对 C/C++ 程 序 员 来 说 是 很 熟 悉 的 :

  • Do While...Loop 或 Do...Loop While : 当 条 件 为 真 时 重 复 运 行

  • Do Until...Loop 或 Do...Loop Until : 一 直 运 行 到 条 件 为 真 时

  • For...Nex t: 在 一 个 循 环 计 数 器 的 控 制 下 重 复 运 行

D o 关 键 字 作 为 一 个 循 环 块 的 开 始 , Loop 语 句 作 为 它 的 结 束 句 。 While 和 Until 关 键 字 既 能 够 出 现 在 块 顶 部 的 D o 语 句 中 , 又 能 够 出 现 在 块 末 端 的 Loop 语 句 中 。这 取 决 于 用 户 想 让 VBScript 解 释 器 在 执 行 循 环 之 前 检 查 条 件 , 还 是 在 执 行 循 环之 后 检 查 条 件 。 下 面 的 几 个 代 码 段 说 明 了 VBScript 中 循 环 语 句 的 正 确 格 式 :

Do While x<y

‘Loop is not entered unless x is less than y Loop

Do

'Loop executes at least once and repeats only if i is less than j Loop While i<j

Do Until x=10

'Loop is not entered if x is equal to 10 'When x attains a value of 10, the loop exits

Loop

Do

'Loop executes at least once and repeats only 'until I is not equal to j

Loop Until I<>j

默 认 情 况 下 , For...Next 循 环 中 的 计 数 器 是 以 1 为 步 长 的 :

For i=1 To 10

‘ This loop iterates 10 times, incrementing I from 1 to10

Next

在 For...Next 循 环 中 , 可 以 用 Step 关 键 字 来 为 循 环 计 数 器 指 定 一 个 不 同 的 步 长 :

For I=1 to 10 Step 2

‘This loop iterates 5 times Next

For i=10 To 2 Step -2

'This loop also iterates 5 times

Next

上 面 的 第 一 个 For...Next 循 环 重 复 运 行 了 5 次 。 它 用 数 值 1 初 始 化 计 数 器 , 然 后在 后 面 的 每 一 次 循 环 中 增 长 , 其 值 为 3 , 5 , 7 , 9 。 当 最 后 一 次 通 过 循 环 时 , i 的值 为 9 ; 当 i 达 到 11 时 退 出 循 环 。 第 二 个 For...Next 循 环 也 重 复 运 行 了 5 次 , 但是 当 循 环 进 行 时 , i 不 是 增 长 , 而 是 减 少 , 因 为 Step 值 是 负 的 。 i 的 初 始 值 为 10 , 它 在 每 一 次 循 环 时 都 减 少 , 其 值 为 8 , 6 , 4 , 2 。 当 退 出 循 环 时 , i 的 值

过 程

VBScript 除 了 它 自 己 的 内 部 函 数 库 外 , 还 在 宏 脚 本 中 识 别 两 种 类 型 的 过 程 , Sub 和 Function 。 这 两 种 类 型 都 有 参 数 , 但 只 有 Function 返 回 值 。 除 此 以 外 , 它 们 几乎 没 有 什 么 区 别 。

每 一 个 宏 脚 本 都 有 一 个 主 Sub 过 程 ,它 的 名 字 决 定 了 出 现 在 Visual C++ Macro 对话框中的宏名。主 Sub 过 程 首 先 出 现 在 宏 脚 本 中 , 不 带 参 数 。宏 的 可 调 用 过 程 按任 意 顺 序 排 在 主 程 序 的 后 面 。 如 下 所 示 , 每 个 Sub 过 程 ( 包 括 第 一 个 ) 都 以 End Sub 语 句 结 束 :

Sub MacroName() ‘ Main procedure

End Sub

Sub Subroutine1(arg1, arg2)

'Code for first callable procedure goes here End Sub

Sub Subroutine2(arg1, arg2)

'Code for second callable procedure goes here End Sub

一 个 可 调 用 的 Sub 过 程( 即 除 了 第 一 个 以 外 的 任 何 Sub 过 程 )能 够 通 过 下 面 两 种方 式 被 调 用 : Call 语 句 , 以 及 一 个 过 程 名 作 为 单 独 的 语 句 。 这 模 仿 了 C/C++ 中 调用 函 数 的 方 式 。这 两 种 方 法 的 格 式 有 些 细 微 的 差 别 。Call 语 句 要 求 把 Sub 过 程 的参 数 放 在 程 序 名 后 面 的 括 号 中 。 如 果 不 用 Call 语 句 , 程 序 名 后 的 参 数 就 可 以 不用 括 号 , 只 用 逗 号 分 隔 开 来 。 所 以 下 面 这 两 句 的 作 用 是 相 同 的 :

Call AnySub(param1,param2)

AnySub param1,param2

因 为 Function 过 程 返 回 值 , 所 以 , 它 能 够 像 C 函 数 一 样 作 为 一 个 值 来 使 用 。 为了 返 回 一 个 值 , Function 过 程 必 须 包 含 与 程 序 同 名 的 变 量 。 当 退 出 过 程 时 , 解 释器 会 返 回 一 个 值 给 调 用 程 序 。 因 为 所 有 的 值 都 属 于 Variant 类 型 , 解 释 器 不 对 返回 值 进 行 类 型 检 查 。 与 Sub 过 程 不 同 的 是 , Function 过 程 的 参 数 列 表 总 是 出 现 在括 号 内 。如 果 一 个 Function 过 程 没 有 参 数 , 它 就 必 须 包 括 一 对 空 括 号 。 下 面 是 一个 根 据 半 径 计 算 圆 面 积 的 简 单 例 子 :

Sub Main()

iRadius=Inputbox("Enter radius of circle:") MsgBox(""Area is "&Area(iRadius)&"square units")

End Sub

Function Area(iRadius)

Area=iRadius * iRadius * 3.1415926 End Function

VBScript 解 释 器 根 据 用 于 计 算 Area 值 的 最 大 精 度 决 定 了 Area 变 量 的 精 度 。 例如 ,如 果 iRadius 的 值 为 2 , 上 面 例 子 中 有 7 位 小 数 的 pi 值 就 意 味 着 Area 具 有 同样 的 精 度 :

第 六 部 分 附 录 - 图5

VBScript 中 参 数 是 按 值 传 送 的 , 而 不 是 按 指 针 传 送 。 不 管 是 Sub 过 程 , 还 是Function 过 程 , 都 不 能 改 变 外 部 数 据 , 除 非 是 全 局 变 量 。 VBScript 按 级 来 区 分 作用 域 , 所 以 局 部 变 量 被 称 为 “ 过 程 级 ”。 一 个 过 程 级 变 量 只 在 被 声 明 和 过 程 结 束这 段 时 间 内 才 是 存 在 的 。既 然 一 个 过 程 变 量 有 局 部 使 用 范 围 ,它 就 不 能 在 下 一 次进 入 该 过 程 时 保 留 着 它 的 值 。全 局 作 用 域 的 变 量 是 脚 本 级 的 ,在 宏 的 整 个 执 行 过程 中 一 直 存 在 。 在 过 程 外 部 声 明 的 所 有 变 量 都 有 脚 本 级 的 范 围 , 如 下 所 示 :

Dim iGlobal ‘ This variable has script-level scope

Sub Main()

Dim iLocal ‘ This variable has procedure-level scope

End Sub

一 个 过 程 最 多 可 有 127 个 变 量 ; 一 个 数 组 作 为 一 个 变 量 。

对 象

Developer Studio 的 不 同 方 面 对 一 个 运 行 的 宏 来 说 , 可 看 作 是 一 个 17 个 不 同 对 象的 集 合 。 例 如 , 调 试 器 可 以 像 Visual C++ 编 缉 器 、 窗 口 等 等 一 样 被 看 作 是 一 个 对象 。 每 个 对 象 都 有 属 性 和 方 法 , 宏 通 过 这 些 属 性 和 方 法 来 了 解 或 调 整 对 象 的 状态 。 主 要 的 Developer Studio 对 象 被 称 为 Application , 它 的 属 性 、 方 法 和 事 件 列在 表 12-4 、 12-5 和 12-6 中 。 在 宏 脚 本 中 Application 是 默 认 对 象 , 所 以 用 户 不 必专 门 指 定 该 对 象 , 就 可 以 使 用 Application 的 元 素 。 例 如 , 下 面 的 这 个 命 令 显 示了 当 前 项 目 的 活 动 配 置( 无 论 是 Win32 Release 还 是 W in32 Debug ), 而 不 必 引 用Application 对 象 :

MsgBox("The configuration is "&ActiveConfiguration)

为 了 让 用 户 对 对 象 有 一 些 认 识 ,这一节讨论 TextSelection 对 象 , 它 代 表 在 文 本 编

缉 器 的 文 件 窗 口 中 所 选 的 文 本 。 一 个 宏 通 过 用 ActiveDocument.Selection 属 性 来自 定 义 当 前 文 件 中 的 所 选 文 本 。 我 们 在 第 13 章 的 ColumnarReplace 宏 中 见 过 这个 属 性 ( 请 看 列 表 13-2 )。 表 C-3 和 表 C-4 列 出 了 TextSelection 的 属 性 和 方 法 , 它 们 可 以 被 宏 用 来 处 理 所 选 的 文 本 , 移 动 插 入 符 号 、 滚 动 以 及 执 行 其 他 任 务 。 在宏 脚 本 中 , 每 个 属 性 和 方 法 都 必 须 用 一 个 句 号 来 与 ActiveDocument.Selection 属性 关 联 。 例 如 , 下 面 的 一 个 语 句 用 Copy 方 法 把 所 选 的 文 本 复 制 到 剪 贴 板 上 :

ActiveDocument.Selection.Copy

表 C-3 TextSelection 属 性

属 性 说 明

BottomLine 所选内容的最后一行的行号

CurrentColumn 插入符号目前所在的列号

CurrentLine 插入符号目前所在的行号

续 表

Text 包含所选文本的字符串。如果所选的内容超过两行,该字符串除了最后一行外在每一行的末尾处放一个新行字符。因为 Text 属性是默认的,所以不必指定这个属性。因此下面的两个语句的作用是一样的:

str=ActiveDocument.Selection str=AvtiveDocument.Selection.Text

TopLine 所选内容第一行的行号

表 C-4 TextSelection 方 法

方 法 说 明

Backspace 与按 Backspace 键的效果一样

Cancel 与按 Esc 键的效果一样

ChangeCase 改变所选内容的大小写 ,或者只把每个词的第一个字符变为大写

续 表

CharLeft 把插入符号左移一定的距离

CharRight 把插入符号右移一定的距离

ClearBookmark 从当前行清除一个未命名的书签

ClearBookmarks 从文件中清除所有的未命名的书签

Copy 把所选文本复制到剪贴板上

Cut 把所选文本复制到剪贴板上 ,然后删除文件上的所选内容

Delete 从文件中删除所选内容

DeleteWhitespace 删除插入符号附近的所有空格和制表符。不必选择文本

DestructiveInsert 用新的文本替换所选文本

续 表

EndOfLine 把插入符号移到当前行行末。参见 StartOfLine EndOfDocument 把插入符号移到文件末尾。参见 StartOfDocument

FindText 在文件中查找自定义的文本;如果找到了,把插入符号放在所找到的文本的开始处

Go ToLine 把插入符号移到自定义行的开始处

Indent 在当前行添加一个缩进 。这同把插入符号放在一行的开始处,然后按 Tab 键的效果相同。在使用 Indent 时要小心, 因为这个函数删除所选文本

LineDown 把插入符号向下移一定的行数

LineUp 把插入符号向上移一定的行数

MoveTo 把插入符号移到指定的行和列

续 表

NewLine 与按 Enter 键的效果一样

NextBookmark 把插入符号向前移到下一个已命名或未命名的书签 。参见

PreviousBookmark

PageDown 与按 PgDn 键的效果一样

PageUp 与按 PgUp 键的效果一样

Paste 把当前剪贴板中的内容粘贴到文件的插入符号处。

PreviousBookmark 把插入符号移动到前一个未命名或已命名的书签处 。参见

NextBookmark

ReplaceText 查找并替换文本。关于 ReplaceText 用法的示例,请参看第 13 章中所描述的 ColumnarReplace 宏

SelectAll 选择全部文件

续 表

SelectLine 选择插入符号所在的行

SetBookmark 为插入符号所在的行设置一个未命名的书签

SmartFormat 根据当前的精确格式设置格式化所选文本StartOfDocument 把插入符号移到文件的开始处。参见 EndOfDocument StartOfLine 把插入符号移到当前行的开始处。参见 EndOfLine

Tabify 对选择内容前面加制表符 。关于 Developer Studio 的 Tabify

命名的详细信息请看第 3 章

Unindent 把所选的全部行的缩进标尺取消。其效果同按 Shift+Tab

一样

Untabify 取消所选内容的制表符

WordLeft 把插入符号左移一定数目的词

WordRight 把插入符号右移一定数目的词

调 试 VBScript宏

通 常 , 用 户 可 通 过 在 宏 运 行 时 显 示 其 关 键 位 置 的 变 量 的 当 前 值 , 来 有 效 地 调 试宏 。 可 用 MsgBox 函 数 或 者 在 第 1 章 Visual C++ OutPut 窗 口 的 M acro 选 项 卡 中写 入 消 息 的 PrintToOutputWindow 方 法( 见 第 1 章 中 的 The Environmen t)来显示调 试 字 符 串 。 M sgBox 函 数 中 止 宏 , 并 要 求 用 户 输 入 , 而 PrintToOutputWindow 方 法 并 不 中 止 宏 。

下 面 的 代 码 段 产 生 图 C-1 所 示 的 调 试 字 符 串 :

x=3

MsgBox("x="&x) ‘Display a message box PrintToOutputWindow("x="&x) ‘Writes to Output window

第 六 部 分 附 录 - 图6

图 C-1 用 MsgBox 和 PrintToOutputWindow 显 示 调 试 字 符 串

当 需 要 更 强 的 调 试 能 力 时 , 有 时 可 在 Visual Basic 中 重 建 部 分 宏 , 它 允 许 用 户 单步 执 行 一 个 宏 、 设 置 断 点 、 查 看 变 量 等 等 。M icrosoft Script Debugger 中 也 可 以 这样 做 。 尽 管 Script Debugger 是 为 M icrosoft Internet Explorer 的 H T M L 页 中 所 嵌 入的 VBScript 代 码 而 设 计 的 , 它 还 是 能 够 处 理 Visual C++ 宏 中 的 一 些 VBScript 代码 。

关 于 Script Debugger 的 详 细 消 息 ,请 看 在 线 帮 助 中 的 script debuggin g( 脚 本 调 试 )主 题 。也 可 以 从 本 附 录 开 始 处 的 M icrosoft 的 VBScript Web 网 页 下 载 一 份 。Script Debugger 软 件 包 中 包 括 文 档 说 明 。

库 函 数

本 附 录 的 其 他 部 分 将 着 重 描 述 Visual C++ 宏 脚 本 中 可 用 的 VBScript 库 函 数 。 表C-5 把 库 函 数 分 为 几 类 , 以 便 于 用 户 决 定 哪 一 个 函 数 适 合 于 特 定 的 编 程 要 求 。 表C-6 按 字 母 顺 序 列 出 了 这 些 函 数 , 并 提 供 了 简 单 的 描 述 和 示 例 代 码 段 。 可 以 在 表C-5 中 找 到 所 需 的 函 数 , 然 后 在 表 C-6 中 或 者 Visual C++ 在 线 帮 助 中 查 看 该 函 数的 描 述 。这 些 库 函 数 包 含 在 VBScript.dll 文 件 中 ,该 文 件 通 常 在 Windows 的 System 或 System32 目 录 中 。

根 据 惯 例 , 宏 脚 本 中 的 函 数 名 字 由 大 小 写 字 符 组 成 。 但 VBScript 解 释 器 不 区 分大 小 写 , 对 函 数 名 也 完 全 不 区 分 大 小 写 。“ C ” 前 缀 用 于 识 别 转 换 函 数 , 如 CByte 和 CDate 函 数 。这 些 函 数 把 值 从 一 种 类 型 强 制 转 换 成 另 一 种 类 型 ,提 供 一 种 类 似于 C/C++ 中 的 类 型 强 制 的 机 制 。

表 C-5 VBScript 不 同 类 型 的 库 函 数

数 组 , 算 术 和 三 角 函 数

Abs

Cos

Hex

Log

Round

Sqr

Array

Exp

Int

Oct

Sgn

Tan

Atn

Fix

LBound

Rnd

Sin

UBound

转 换 和 变 量 类 型 函 数

CBool

CDate

CInt

CStr

IsEmpty

TypeName

CByte

CCur

CDbl

Chr

CLng

CSng

IsArray

IsDate

IsNull

IsNumeric

VarType

日 期 和 时 间 函 数

Date DateValue MonthName TimeValue

续 表

DateAdd DateDiff DatePart

DateSerial

Day Hour Minute

Month

Now Second Time

TimeSerial

WeekDay WeekDayName Year

格 式 化 函 数

FormatCurrency

FormatNumber

FormatPercent

FormatDateTime

字 符 串 和 文 本 函 数

Asc Join

Mid

ScriptEngine

StrComp

Filter LCase

MsgBox

ScriptEngineBuildVersion

String

InputBox Left

Replace

ScriptEngineMajorVersion

StrReverse

续 表

InStr

InstrRev

Len

LTrim

Right

RTrim

Space

Split

Trim

UCase

表 C-6

VBScript 库 函 数

函 数

说 明

Abs 返回一个数的绝对值 (无符号 )。例如, Abs(-2) 和 Abs(2) 都返回值 2

Array 返回包含一个数组的 Variant 量。在下面的例子中,第一个语句创建一个变量 x 。第二个语句把一个数组赋给变量 x ,并初始化数组元素。后面的几个语句演示了所赋的值是如何放置在新的 x 数组中的:

Dim x

x= Array(10,20,30)

续 表

a=x(0) ‘a=10

b=x(1) ‘ b=20

c=x(2) ‘c=30

Asc 返回一个字符串的第一个字符的 ANSI 码。另一个类似的函数AscB 返回一个字符串的第一个字节。相关的 AscW 函数返回一个字符串的第一个字符的字节和 UniCode 码,这样就避免了从UniCode 到 ANSI 的转换

Atn 返回一个数的反正切 值(以弧度为单位 )。其结果的范围为从 -pi/2 到 pi/2 弧度。为了把度转化为弧度,在度数上乘以 pi/180 。 Atn 是 Tan 的 反三角函数, Tan 是以角度为参数,返回一个直角的两边的比值

CBool 返回一个表达式的 Boolean 值

CByte 返回一个表达式的字节值

续 表

CCur 把一个表达式转换为货币子类型。 Ccur 函数提供了基于当前系统

上的国际设置的正确转换 。使用这个函数能够确保宏为任何国家显示正确的货币值

CDate 把一个表达式转换为日期子类型: str=mm&"-"&dd&"-"&yy date=CDate(str)

CDbl 返回一个表达式的双精度值

续 表

Chr 返回一个字符码相应的 ANSI 字符。从 0 到 127 的字符码同标准的 ASCII 码一样。例如, Chr(10 )返回一个换行符。关于 ASCII 和 ANSI 字符码的讨论,请看附录 A ,一个类似的函数 ChrB 用于字符串中的字节数据。 ChrB 总是返回一个字节,而不是返回可 能 是 一 个 或 者 两 个 字 节 的 字 符 。 ChrW 函 数 被 提 供 给 使 用UniCode 字符的 32 位平台

CInt 把一个表达式转换为整数子类型。 CInt 不同于 Fix 和 Int 函数, 这两个函数是截断 ,而不是对一个数值的小数部分取整 。当小数部分正好为 0.5 时, CInt 函数总是把这个数取为最近的偶数。例如, 0.5 被取为 0 , 1.5 被取为 2.

CLng 把一个表达式转换为长整数子类型。 CLng 对一个数的小数部分取整。当小数部分正好为 0.5 时, CLng 函数总是把这个数取为最近的偶数

Cos 返回一个角度的余弦值:

续 表

cosx=Cos(x) ‘Where x is in radians

CSng 把一个表达式转换为单精度子类型

Cstr 把一个表达式转换为字符串子类型:

x=111

str="The numeric value is "+Cstr(x) MsgBox(str)

str= "The Boolean value is "+CStr(CBool(x)) MsgBox(str)

Date 返回当前系统日期:

MsgBox("The current date is "&Date)

续 表

DateAdd 返回已经加入指定时间间隔的日期 。DateAdd 函数不返回无效的日期,如 2 月 31 日。它计算闰年,承认每月的天数。它不承认

100 年 1 月 1 日之前或者 9999 年 12 月 31 日之后的日期。用下列特定

的字符串来指定时间间隔:

字 符 串 含 义 字 符 串 含 义

"d" 天 "q" 季度

"ww" 星期 "yyyy" 年

"m" 月 "h" 时

"w" 星期中的天 "m" 分钟

"y" 年中的天 "s" 秒

下面是 DateAdd 函数的几个例子:

续 表

str = DateAdd( d, -1, Date ) MsgBox(Yesterday was & str ) str = DateAdd( ww, -1, Date ) MsgBox( Last week was & str ) str = DateAdd( m, 1, Date)

MsgBox( Next month will be & str ) str = DateAdd( q, 1, Date )

MsgBox( Three months from now will be & str )

DateDiff 返回两个日期之间的时间间隔 。请看 DateAdd 函数中用于指示时间间隔的字符串:

续 表

str=DateDiff("d",Date,#12-25#) MsgBox("Only"&str&"days till Christmas")

DatePart 返回一给定日期的特定部分:

str = DatePart ("ww", Date )

MsgBox("This week is number" & str & "of the year" ) day1 = DatePart( "d", Date)

day2 = day1

Do While day2 >9

day2 = day2 -10

Loop

suffix = "th"

续表

If (day1 = 1) Then suffix = "st" If (day1 = 2) Then suffix = "nd" If (day1 = 3) Then suffix = "rd"

MsgBox("Today is the" & day1 &suffix)

DateSerial 返回一个包含指定年、月和日的字符串。 DateSerial 允许宏计算经过一个连续时间段后的绝对日期。例如,下面的 DateSerial 调用返回了从当前日期 100 天以后的日期:

续 表

iYear = DatePart( "yyyy", Date) iMonth = DatePart( "m", Date) iDay = DatePart( ‘"d", Date)

str = DateSerial( iYear, iMonth, iDay + 100 ) MsgBox( "100 days from now will be" & str)

当 year 参数包含从 0 到 99 之间的值时, DateSerial 认为这个值

表示从 1900~1999 之间的某一年 。对于其他的 year 参数,要用完整的 4 位数表示,如 2010 。

DateValue 返回包含一个格式化日期的字符串。 DateValue 函数在根据时区设置辨认各种格式的日期时很有用。例如,在 United States 设置下,下面的语句都返回字符串 "12/31/99" :

续 表

DateValue( "December 31, 1999" )

DateValue( "Dec 31, 1999")

DateValue( "12-31-99" )

DateValue( "12 31 1999" )

Day 读入一个日期字符串,从中分离出该月中的天,即从 1~31

Exp 返回基于 e (自然对数的基)的指数。常量 e 的值约为 2.718282

Filter 从一个字符串数组中分离出包含指定子字符串的字符串,或者, 分离出不包含指定子字符串的字符串。 Filter 返回的数组只包含符合匹配规则的字符串。在下面的例子中, x 数组包含字符串"string2",因为它是 str 数组中唯一包含子字符串 "2 "的字符串:

str(0) = "string0" str(1) = "string1"

续表

str(2) = "string2" str(3) = "string3" MsgBox( x(0) )

Fix 返回一个浮点数的整数部分。 Int 和 Fix 函数都是截断小数部分

而返回整数部分。以变量 x 为例,如果 x 为正,这两个函数的结果相同;如果 x 为负, Int 返回小于或者等于 x 的第一个负整数, 而 Fix 返回大于或者等于 x 的第一个负整数。例如,如果 x 为 - 5.6 ,那么 Int 返回 -6 而 Fix 返回 -5

FormatCurrency 用系统 Control Pane l(控制面板)中的区域设置,以正确的货币

格式返回一个表达式

FormatDateTime 以符合当前区域设置的日期或者时间格式返回一个表达式

续 表

FormatNumber 返回字符串形式的数值。这个字符串的格式根据系统的区域设

置,例如,超过 1000 的数值在美国是用逗号分开,而在欧洲是用句号

FormatPercent 返回以%字符为后缀的百分数 (被 100 乘)格式的表达式

Hex 返回一个代表 16 进制数的字符串。宏能够通过在数的前面加上前缀 &H 来表示一个 16 进制数。参考 Oct

Hour 返回一个 0~23 之间的数,以表示给定时间的小时数。例如,在晚上 6 点到 7 点之间,下面的代码返回 18 :

hr=Hour(Time)

MsgBox("The current hour is "&hr)

参考函数 Minute 和 Second

续 表

InputBox 显示一个带有指定提示消息的对话框,并返回用户输入的字符串。关于 InputBox 的示例,请看第 13 章中的 ColumnarReplace 宏

InStr 返回一个字符串中另个字符串第一次出现的位置

InstrRev 同 InStr 函数类似, InstrRev 返回一个字符串中在另一个字字符串的位置,不同的是它是从字符串的尾部开始

Int 参考函数 Fix 的说明

IsArray 返回指示给定变量是否为数组的一个 Boolean 值

IsDate 返回指示给定表达式是否能够转换为日期 的一个 Boolean 值

IsEmpty 返回指示给定变量是否已初始化的一个 Boolean 值。当变量未被初始化,或者被显式设为 Empty 时, IsEmpty 返回 True.;否则, 这个函数返回 False 。参考 IsNull

续 表

IsNull 返回指示给定变量是否包含有效数据的一个 Boolean 值。在变量为 Null(不包含有效数据)时 , IsNull 返回 True;否则,该函数返回 False 。 VBScript 承认 Null 和 Empty 之间的区别。 Empty 意味着变量还没有被初始化 。一个零长度的字符串,有时被看作是一个空字符串,但不是一个 Null 变量

IsNumeric 返回指示给定表达式是否为数字的一个 Boolean 值

Join 通过连接数组中字符串而形成一个新的字符串

LBound 为数组的一个维返回最小可用下标。默认值为 0

LCase 把一个字符串的所有字符都转换为小写字符。参考 Ucase 函数

Left 返回由一个字符串最左边的字符所组成的字符串 。宏能够通过调用 Len 函数来确定一个字符串的长度。参考 Right 函数

Len 返回一个字符串中的字符数

续 表

Log 返回一个数的自然对数 (基数为 e )。数 x 基数为 n 的对数是 x

的自然对数和 n 的自然对数的比值:

lognx=Log(x)/Log(n)

LTrim 消除一个字符串的前导空格。参考 RTrim 和 Trim

Mid 从一个字符串分离出一个子字符串

Minute 返回从 0~59 之间的一个数以指示给定时间的分钟数。例如,在

6:47:53 ,下面的代码返回 47 : min=Minute(Time)

MsgBox("The current minute is " & min")

参考 Hour 和 Second 函数

续 表

Month 返回从 1~12 之间的一个数,以指示给定年的月份:

Dim mnth(11) mnth(0) = "January" mnth(1) = "February"

mnth(11) = "December" m = Month( Date )

MsgBox(The current month is "& mnth(m-1) )

MonthName 返回一个字符串,它包含由 1~12 之间的一个数所指定的月份。

通过使用 MonthName 函数,上面的例子可以像下面这样改写:

续 表

m= Month(Date)

MsgBox("The current month is"&MonthName(m))

MsgBox 显示一个带有 OK,Cancel,Abort,Retry,Ignore,Yes,No 按钮的标准Windows 消息框。 MsgBox 返回下列值以指示用户单击了哪一个按钮关闭消息框:

常 量 值 按 钮

vbOK

1

OK

vbCancel

2

Cancel

vbAbort

3

Abort

vbRetry

4

Retry

续 表

常 量

按 钮

vbIgnore

5

Ignore

vbYes

6

Yes

vbNo

7

No

MsgBox 也可以在消息框中显示一个 Help 按钮 ,当单击时 ,就会显示来自特定帮助文件的上下文相关帮助。用户也可以按 F1 键来查看与上下文相对应的帮助主题

Now 返回包含当前日期和时间的字符串 ,当前日期和时间的格式符合当

前区域设置。例如,对于 United States 设置,返回字符串的格式为 "12/31/99 3:33:57 PM "。参考 Time 和 Date 函数

续 表

Oct 返回一个表示八进制数的字符串 。在宏中,一个八进制数可用前缀 & O 表示。参考 Hex 函数

Replace 以一个字符串作为输入值 ,返回该字符串的一个新值,其中的子字符串已被另外的值所代替。参考表 C-4 所列的 ReplaceText 函数

Right 返回一个字符串最右边的字符所组成的字符串 。宏通过调用 Len

函数来确定一个字符串的长度。参考 Left 函数

Rnd 返回一个小于 1 但大于或者等于 0 的随机数 。为了产生一个上下界之间的一个随机整数,要采用下列方式:

iRange=iUpperBound-iLowerBound+1 Int(iRange*Rnd+iLowerBound)

使用 Randomize 语句产生根据系统时钟的 VBScript 随机数生成

续 表

Randomize iRandom=Rnd

Round 把一个浮点数四舍五入到指定的精度

Rtrim 取消一个字符串的尾部的空格。参考 LTrim 和 Trim 函数

ScriptEngine 返回一个标识使用中的脚本语言的字符串。对于 Visual Basic

Scripting Editon,该函数返回 “ VBScript ”

ScriptEngineBuildVersion 返回使用中的脚本引擎的建立版本号

ScriptEngineMajorVersion 返回使用中的脚本引擎的主版本号

Second 返回从 0~59 之间的一个整数 ,以表示给定时间的秒成分 。例如, 在 6:47:53 ,下面的代码返回 53 :

sec=Second(Time)

续 表

MsgBox("The current second is"&sec)

参考 Hour 和 Minute 函数

Sgn 确定给定数的符号。 Sgn 返回一个值为 -1 , 0 或者 1 的整数,以指示这个数是小于零,等于零,还是大于零:

Dim str(2) str(0)="less than zero" str(1)="equal to zero"

str(2)="greater than zero"

i =InputBox("Enter a number") MsgBox("The number is " & str(Sgn(i)+1))

续 表

Sin 返回一个角度的正弦值

sinx=Sin(x) ‘Where x is in radians

参考 Cos 和 Tan 函数

Space 返回一个包含指定数目空格的字符串

Split 根据一个字符串创建一个字符串数组 ,这个字符串的子字符串由指定的字符分隔 。下面的例子用加号把一个字符串分成三个单独的字符串:

x=Split("string1+string2+string3","+") MsgBox(x(0)) 'Display "string1"

MsgBox(x(1)) 'Display "string2"

MsgBox(x(2)) 'Display "string3"

续 表

Sqr 返回一个数的平方根

StrComp 比较两个字符串,并返回一个值,指示这两个字符串是否相同。

StrComp 的用法和语法同 C 动态库中的 strcomp 函数相似:

If StrComp(string1,string2)=0) Then MsgBox("Strings are equal")

End If

StrComp 返回下列值中的一个:

返 回 值 含 义

-1 string1 小于 string2

  1. string1 等于 string2

续 表

  1. string1 大于 string2

StrReverse 颠倒给定字符串的字符顺序

String 创建由单个字符组成的指定长度的字符串

str=String(10,"a") ‘ str="aaaaaaaaaa"

Tan 返回一个角度的正切值

tanx=Tan(x) ‘Where x is in radians

参考 Sin 和 Cos 函数

Time 按照当前的区域设置格式返回包含当前系统时间的字符串。例 如,在美国,所返回的字符串为 "3:33:57 PM "。当设置为欧洲时, 同样的时间表示为 "15:33:57"。参考 Now 函数

续 表

TimeSerial 按照当前的区域设置格式返回一个包含给定小时 、分钟、秒的字

符串。当设置为美国时,下面的语句把 "6:47:53 PM "赋给变量 x :

x=TimeSerial(18,47,53)

TimeValue 返回一个包含一个有格式的时间的字符串。像 DateValue 函数一

样, TimeValue 承认各种各样取决于区域设置的格式。例如,当设置为美国时,下面的语句返回字符串 "6:47:53 PM ":

TimeValue("6:47:53PM")

TimeValue("18:47:53") TimeValue("6:47:53 pm")

Trim 删除一个字符串首尾的空格。参考 RTrim 和 LTrim 函数

TypeName 以一个变量作为参数,返回指示变更子类型的字符串:

续 表

返 回 字 符 串 变 量 子 类 型

"Byte" 字节值

"Integer" 整数值

"Long" 长整数值

"Single" 单精度浮点数

"Double" 双精度浮点数

"Currency" 货币字符串

"Decimal" 十进制数

"Date" 日期或时间字符串

"String" 字符串

续 表

"Boolean" 布尔值

"Empty" 未初始化

"Null" 无有效数据

下面的代码演示了 TypeName 函数:

x=3

续 表

MsgBox(TypeName(x)) ‘ Displays "integer" y="string"

MsgBox(TypeName(y)) ‘Displays "String" z=#12-31-99#

MsgBox(TypeName(z)) ‘ Displays "Date" MsgBox(TypeName(w)) ‘Displays "Empty"

UBound 返回一个数组指定维的最大可用下标值。例如:

Dim A(100,3,4)

续 表

x=UBound(A,1) ‘ x=99

y=UBound(A,2) ‘y=2

z=UBound(A,3) ‘ z=3

UCase 把字符串中的所有字符都转换为大写。参考 Lcase 函数

VarType 以一个变量作为参数 ,返回下表中的一个整数,以指示变量的子类型。注意这个函数与 TypeName 函数的相似性

续 表

常 量

变 量 子 类 型

vbEmpty

0

未初始化

vbNull

1 无有效数据

vbInteger

2

整数

vbLong

3

长整数

vbSingle

4

单精度浮点数

vbDouble

5

双精度浮点数

vbCurrency

6

货币字符串

vbDate

7

日期或时间字符串

vbString

8

字符串

vbVariant

11

Variant 类型的数组

续 表

VbBoolean

11

布尔值

vbByte

17

字节值

vbArray

8192

数组。 VarType 返回数组值

加 上 数 组 中 的 变 量 子 类 型 的值的和

Weekday 返回从 1 到 7 之间的一个整数,表示一星期中的星期几,其中 1

表示星期天。参考 WeekDayName 函数的示例代码

WeekDayName 返回一个字符串以指示一星期中的某一天:

d=WeekDay(Date)

MsgBox("Today is"&WeekDayName(d))

续 表

Year 从一个给定的日期中以整数值返回其中的年数:

MsgBox("The year is "&Year(Date))