第 六 部 分 附 录
附 录 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
表 A-2 列 出 了 US ANSI 集 的 全 部 256 个 字 符 , 其 中 一 些 Windows 不 能 显 示 。 这些 不 能 显 示 的 ANSI 字 符 通 常 在 屏 幕 上 显 示 为 一 个 小 框 或 空 格 ,表 A-2 中 所 示 的是 像 一 样 常 见 的 小 框 。这 个 表 为 每 个 字 符 列 出 八 进 制 值 ,而 不 是 十 六 进 制 值 。知 道 一 个 字 符 的 八 进 制 值 ,可 以 让 用 户 通 过 在 一 个 反 斜 杠 后 键 入 字 符 的 八 进 制 值来 在 一 个 资 源 串 中 或 静 态 文 本 框 中 加 入 该 字 符 。例 如 ,为 了 在 一 个 串 中 加 入 ANSI 字 符 ½ , 只 要 输 入 \275 。 注 意 , W indows 能 够 显 示 一 些 字 符 , 如 只 能 用 TrueType 字 体 的 商 标 符 号 ™ 。
表 A-2 ANSI 字 符 集 , 值 从 0~255
表 示 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 ( 自 动 化 ) 或 提 供 一 个 类 型 标 识 符 。
标 识 符 是 名 称 , 更 精 确 地 说 , 它 是 编 程 标 识 符 或 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 具 有 同样 的 精 度 :
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
图 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
- string1 等于 string2
续 表
- 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))