1、脚本中心:ActiveX 控件指南向 HTA 添加简单工具栏更多 ActiveX 控件 Microsoft Office 图表控件 Microsoft Office 复选框控件 Microsoft Office 组合框 Microsoft Office 进度条 Microsoft Office 电子表格控件 表格数据控件如果说使用 HTML 应用程序时有局限性的话(很遗憾,使用 HTA 时 有 局限性),其原因是:因为 HTA 主要依靠 HTML 控件,不存在向应用程序添加菜单栏或工具栏的简便方法。因此,您通常只好在屏幕上放置一组有标题而没有图像的按钮。尽管这种方法明显不够酷,但确实能够起作用
2、。(但对于脚本专家来说,酷就是一切。)当然,确实 有 允许您向 HTA 添加菜单栏和/或工具栏的 ActiveX 控件。其中一些控件实际上很不错,但同时也可能有点复杂。老实说,对于脚本专家,有一件要胜过酷的事情是:懒惰。因此,我们想应该向您展示一种非常简单的方法来使用命令按钮 ActiveX 控件建立工具栏,该控件作为 Microsoft Office 的一部分安装。(换句话说,只要您有 Microsoft Office,就有了该控件。)它可能并不是世界上最特别的工具栏,但总比 HTML 中普通的老式 标记好得多。以下是那种稍稍费力就可组合成的工具栏的示例:看到了吗?看起来不错,想到这些是真正
3、的按钮而不仅仅是图形时尤其如此。您可以很容易地画一个与此类似的工具栏并将图形载入 HTA;但有人单击它们时,这些图形并不会像真正的按钮一样起作用。但这里不会出现这个问题,原因很简单:这些是真实有效的按钮。我们只不过将它们缩小了一点并用图片取代了按钮标题。返回页首 使用 Microsoft Office 命令按钮控件让我们来看一下一个精简的示例,即仅使用一个按钮工具栏的示例:Toolbar ExampleSub Window_OnloadCommandButton1.Width = 32CommandButton1.Height = 32CommandButton1.Picture = Load
4、Picture(“c:scriptsnetwork.bmp“)End SubSub CommandButton1_Click()DataArea.InnerHTML = “You clicked button 1.“ End Sub此 HTA 主要包含两个元素:一个放置命令按钮的表格,和一个 ,它用于在单击该按钮时显示信息。我们还要指出,我们将 HTA 左侧、右侧和顶端的边距已配置为“0”。这将确保我们的表格(进而我们的工具栏)沿 HTA 窗口的左上边缘紧密接合,并将确保表行一路延伸到最右侧边缘。首先检查表格,我们使用下面这行代码来举例说明:在这里您不必过多担心 HTML 标记;如果想了解有关
5、各个参数的更多信息,请参阅 HTML 和 DHTML 参考(英文)。实质上我们创建了一个跨越整个 HTA 窗口宽度的表格。我们配置了一个像素的边框环绕整个表格(将由一行和一个单元格组成的表格),然后将边框的颜色设置为 buttonface,即要用于表格单元格的同一种颜色。我们这样做完全是出于美观原因:这样生成的工具栏周围没有任何种类的轮廓线。然后我们使用下列两行代码来创建一个表格行和一个表格单元格(如我们所说,使用 buttonface 作为其背景色):现在,我们终于进入了实质阶段:插入命令按钮。要完成此任务,我们只需添加一个 标记:正如您所见,我们的 object 标记只需要两个参数:cla
6、ssid 和 id。classid 是一个全局唯一标识符,告诉操作系统要插入哪个 ActiveX 控件。当然,classid 也是一个不可能记住和几乎不可能键入的值。但是没关系,为省去这些麻烦,我们为命令按钮实例分配一个 id(绰号)。当我们要在脚本中引用该按钮时,可以使用 id (CommandButton1) 而不是 classid (D7053240-CE69-11CD-A777-00DD01143C57)。对于表格就是这样。我们插入一个名为 DataArea 的 ,如名称所暗示的那样,我们将在其中写入数据(虽然在本示例脚本中我们很随便地使用术语“数据”)。就这样,我们完成了 HTA 的
7、正文部分。如此便还剩下两个子例程需要我们完成。第一个子例程是 Windows_Onload,无论何时加载或刷新 HTA 它都将自动运行。在该子例程中,我们配置命令按钮的属性值:CommandButton1.Width = 32CommandButton1.Height = 32CommandButton1.Picture = LoadPicture(“c:scriptsnetwork.bmp“)从我们的角度来看,有趣的一个属性值是最后那一个:其中我们使用 LoadPicture 方法为按钮分配了一张图片。我们所做的就是调用 LoadPicture 并向其传递一个参数:图像文件的完整路径。Wid
8、th 和Height 属性被配置成以点为单位,每点约为 1/72 英寸。将两者都设置为 32 可得到大小适中的按钮;但您可能需要根据最终使用的图片大小来调整其中的任意一个值。注意:还有其他命令按钮属性可能让您感兴趣吗?也许会有;请查看 Microsoft Forms 帮助文件 (FM20.chm) 获取相关信息。安装 Office 时,该文件可能已经复制到 C:Program FilesCommon FilesMicrosoft SharedVBAVBA61033 文件夹下。如果没有,您可从 Office CD 上获取该文件。我们的第二个子例程只不过是在用户单击命令按钮时执行的代码而已:Sub
9、 CommandButton1_Click()DataArea.InnerHTML = “You clicked button 1.“ End Sub正如您所见,我们在这里没有做任何特别的事情:我们只是将按钮被单击的事实写入 DataArea 的InnerHTML 属性。需要指出的一件有趣的事情是,我们不必在 标记中的任何位置指定onclick 参数。默认情况下,任何时候单击按钮时,HTA 将会自动搜索以该按钮命名的 Click 子例程。以下就是我们光彩夺目的单按钮工具栏:抱歉:禁止用闪光灯拍照。当然,您可能已想到了如何创建多按钮工具栏:您仅需要插入命令按钮 ActiveX 控件的其他实例(确
10、保赋予每个实例唯一的 id,并确保在 Window_Onload 子例程中配置按钮属性)。另外,您需要创建单独的子例程,以便在单击特定按钮时运行。例如,为插入第二个按钮,您必须添加以下 object 标记:然后需要将以下代码行插入到 Window_Onload 子例程中:CommandButton2.Width = 32CommandButton2.Height = 32CommandButton2.Picture = LoadPicture(“c:scriptscd.bmp“)最后,您需要创建在每次单击 CommandButton2 时运行的子例程:Sub CommandButton2_Cl
11、ick()DataArea.InnerHTML = “You clicked button 2.“ End Sub非常简单。如果您想在这方面稍做尝试,但不想进行所有的键入工作,我们在这里提供了有四个按钮的工具栏 HTA 示例,供您进行复制和粘贴。请注意,我们在此脚本中额外添加了一个效果:我们使用了 title 标记为每个按钮添加一条工具提示:现在,每次您将鼠标置于 CommandButton1 之上时,将显示工具提示“Get network connections information”。如果这还不能使您成为这方面最酷的脚本编写者,那么我们不知道什么才会。如下便是该 HTA 代码:Toolb
12、ar ExampleSub Window_OnloadCommandButton1.Width = 32CommandButton1.Height = 32CommandButton1.Picture = LoadPicture(“c:scriptsnetwork.bmp“)CommandButton2.Width = 32CommandButton2.Height = 32CommandButton2.Picture = LoadPicture(“c:scriptscd.bmp“)CommandButton3.Width = 32CommandButton3.Height = 32Comma
13、ndButton3.Picture = LoadPicture(“c:scriptsmonitor.bmp“)CommandButton4.Width = 32CommandButton4.Height = 32CommandButton4.Picture = LoadPicture(“c:scriptsprinter.bmp“)End SubSub CommandButton1_Click()DataArea.InnerHTML = “You clicked button 1.“ End SubSub CommandButton2_Click()DataArea.InnerHTML = “Y
14、ou clicked button 2.“ End SubSub CommandButton3_Click()DataArea.InnerHTML = “You clicked button 3.“ End SubSub CommandButton4_Click()DataArea.InnerHTML = “You clicked button 4.“ End Sub脚本中心:ActiveX 控件指南创建实际测量进度的进度条更多 ActiveX 控件 Microsoft Office 图表控件 Microsoft Office 复选框控件 Microsoft Office 组合框 Micros
15、oft Office 命令按钮 Microsoft Office 电子表格控件 表格数据控件作为 脚本编写第 3 周(英文)中 早期脚本展示(英文)网络广播的一部分,我们向大家介绍了他们如何使用 ActiveX 进度条控件来显示脚本运行时的进度情况。现在,检查:我们 真正 所做的是,向您介绍如何使用进度条来显示脚本运行时的 活动 。由于时间方面的限制及出于某些技术方面的考虑,我们真正所做的就是向大家介绍如何显示进度条;我们没有介绍如何配置该进度条,这样,当进度条达到约 100 时,脚本将结束。事实上,我们甚至不鼓励大家去尝试创建真正的进度条,请注意,估计脚本的完成时间并确保在进度条达到 100
16、 时脚本运行结束可能是十分不容易的事情。不用说,我们没有阻拦许多人这样做:每个人都想使用 真正的 进度条,即:测量实际脚本进度的进度条。因此,鉴于绝大多数用户的要求,今天的 ActiveX 文章将向您介绍一种创建可真正测量进度的进度条的方法。为同 WMI 一起配合使用,对此特定方法进行了优化,该方法实际用于仅在一台计算机上运行的脚本。然而,您可能会采用相同的基本方法,并将其应用于其他脚本编写技术以及将其应用于可在多台计算机上运行的脚本。但这要靠您自己了。注意:开始之前,我们应注意,今天所用的 ActiveX 控件是随 Microsoft Office 一同安装的;如果您尚未安装 Microso
17、ft Office,您将无法使用此脚本。我们也看不到进度条的各个详细属性。有关该信息,请浏览早期脚本展示(英文)。返回页首 使用进度条控件首先,要完成此工作,我们需要使用两个文件:该脚本自身(.vbs 文件)与一个 .htm 文件(在我们的示例脚本中,其为 C:ScriptsProgress.htm)。Progress.htm 的代码如下:Please wait当我们的脚本调用该 HTML 文件时,其将如下所示:正如您所看到的,我们所使用的 HTML 标记非常标准且相当简单。首先,我们使用了如下所示的标记(用于插入进度条控件):请注意,插入进度条时,我们将指定四项内容: classid。全局唯
18、一标识符,其可通知操作系统插入 Microsoft Office 进度条控件。此 ID 号在安装了 Microsoft Office(从而也安装了进度条)的所有计算机上都相同。 id。进度条控件实例的用户友好“别名”。当在我们的脚本内引用进度条时,我们将使用此 id。我们为何需要从脚本引用进度条呢?进度条没有任何种类的内置智能:其只能按我们的指示去做。因此,如果我们想指示当前的进度,我们就不得不定期更新进度条控件的 Value。这就是我们通过 .vbs 文件所要做的事情。 height。进度条控件的高度。这与 Internet Explorer 窗口的大小无关;我们将从脚本的内部设置该高度。
19、width。进度条控件的宽度。这与 Internet Explorer 窗口的大小无关;我们将从脚本的内部设置该宽度。然后,我们也将四个可选(不过,在我们的示例中却很重要)参数作为 标记的组成部分:Min 和 Max 参数分别表示进度条的最小值和最大值:进度条的 Value 不能小于 0,且不能大于 100。将 Orientation 设置为 0 时,将得到一个水平进度条,将 Scrolling 参数设置为 1 时,将得到一个好看的光滑进度条(而不是点进度条)。有关详细信息,请再次参阅早期脚本展示(英文)。您说对了:我们 一定 是正在廉价销售“早期脚本展示”!该 HTML 文件就这么简单:我们
20、只嵌入 ActiveX 控件并配置几项属性。不需要将其他 HTML 元素添加到此页面中,也不需要任何脚本:所有的脚本编写都将通过 .vbs 文件进行。简单明了。有了这样的概念,那就让我们来看一看该 .vbs 文件吧:On Error Resume NextstrComputer = “.“Set objWMIService = GetObject(“winmgmts:“ & strComputer & “rootcimv2“)Set colItems = objWMIService.ExecQuery(“Select * From Win32_DesktopMonitor“)For Each
21、objItem in colItemsintHorizontal = objItem.ScreenWidthintVertical = objItem.ScreenHeightNextSet objExplorer = CreateObject(“InternetExplorer.Application“)objExplorer.Navigate “file:/C:Scriptsprogress.htm“ objExplorer.ToolBar = 0objExplorer.StatusBar = 0objExplorer.Width = 450objExplorer.Height = 90
22、objExplorer.Left = (intHorizontal - 450) / 2objExplorer.Top = (intVertical - 90) / 2objExplorer.Visible = 1 Do While (objExplorer.Busy)Wscript.Sleep 200Loop Set colServices = objWMIService.ExecQuery(“Select * from Win32_Service“)intServices = colServices.CountintIncrement = 100/intServicesFor Each o
23、bjService in colServicesWscript.Sleep 200objExplorer.Document.Body.All.ProgressBar1.Value = _objExplorer.Document.Body.All.ProgressBar1.Value + intIncrementNextobjExplorer.Quit我们将略过本脚本中的多个部分,而不对其进行详细讨论。例如,此脚本的开头为以下代码块,我们通过它来确定屏幕的水平分辨率和垂直分辨率:strComputer = “.“Set objWMIService = GetObject(“winmgmts:“
24、& strComputer & “rootcimv2“)Set colItems = objWMIService.ExecQuery(“Select * From Win32_DesktopMonitor“)For Each objItem in colItemsintHorizontal = objItem.ScreenWidthintVertical = objItem.ScreenHeightNext我们为什么关心这一点呢?是这样,我们希望将进度条置于屏幕的中心位置,为此我们必须首先知道屏幕的大小。正如我们所说,我们将不对此方法进行详细讨论;您可在以下部分中找到与其相关的详尽阐述(带图片
25、)!C“脚本编写第 3 周” 网络广播脚本提高。接下来,我们将使用一个代码块来创建一个 InternetExplorer.Application 对象实例并使用Navigate 方法打开文件 C:ScriptsProgress.htm。打开该文件后,我们将配置 Internet Explorer 窗口的几项属性(包括隐藏工具栏和状态栏)。最后,为了让 Internet Explorer 窗口出现在屏幕中,我们将 Visible 属性设置为 1:Set objExplorer = CreateObject(“InternetExplorer.Application“)objExplorer.Na
26、vigate “file:/C:Scriptsprogress.htm“ objExplorer.ToolBar = 0objExplorer.StatusBar = 0objExplorer.Width = 450objExplorer.Height = 90 objExplorer.Left = (intHorizontal - 450) / 2objExplorer.Top = (intVertical - 90) / 2 objExplorer.Visible = 1那么,我们今天要谈论 此 代码吗?不,很抱歉。不过,您可再次通过浏览脚本提高网络广播来了解更多内容。不,我们 不会 因有
27、人浏览“脚本编写第 3 周”网络广播而获得额外的奖金。尽管我们正因为没有过这样的想法而感到自责。不过,我们将简要地提及下面的代码块(依照约定,每当写文章时,我们都必须对 某些内容 加以讨论):Do While (objExplorer.Busy)Wscript.Sleep 200Loop我们使用此代码的目的是:当脚本运行结束时,进度条的显示正好大致达到 100。如果我们要使进度条和脚本保持同步,则脚本在 Internet Explorer 窗口完全显示在屏幕上之前持续等待就显得很重要;如果在进度条显示前脚本即开始运行并执行任务,则我们将无法得到我们所追求的效果。因此,我们建立了一个简单的 Do
28、 While 循环,该循环将检查 Internet Explorer 的 Busy 属性是否为 True;如果为 True,则表示 Internet Explorer 仍忙于加载。如果 Internet Explorer 正忙,则我们将暂停 200 毫秒,之后再次进行检查。只要 objExplorer.Busy 等于 False,我们就将中断该循环,并继续运行脚本的其余部分。我们中断该循环后的第一件事就是,使用下面这行代码来返回计算机上安装的所有服务的集合(我们选择使用服务,但您可将此方法应用于任何 WMI 类):Set colServices = objWMIService.ExecQuer
29、y(“Select * from Win32_Service“)接下来,我们使用下面两行代码:intServices = colServices.CountintIncrement = 100/intServices在第一行代码中,我们获取 Count 属性的值并将其赋值给变量 intServices。每个 WMI 集合都有一个 Count 属性,该属性可告诉我们集合中的项数;在本例中, Count 将告诉我们计算机上所安装的服务数量。注意:建议您不要将 Count 属性用于包含成百上千个项(例如,事件日志中的所有事件)的集合。有关我们 为何 不建议您这样做的更多信息,请参阅其中一个 每周脚本
30、测验题(英文)的答案(英文)。在第二行代码中,我们用值 100 除以所安装的服务数。为什么会是这样?是这样,我们进度条的最大值为 100:当进度条达到 100 时,脚本应运行结束。我们马上要做的是,建立一个 For Each 循环,遍历计算机上所安装的服务的集合。为方便起见,让我们假定有 50 个服务,这就意味着我们将执行 50 次 For Each 循环(每个服务执行一次该循环)。那么,为什么要用 100 除以服务数呢?是这样,我们将执行 x 次 For Each 循环。每完成一个循环后,我们都需将进度条延长一定的长度。如果我们用 100(进度条的最大值)除以 50(所安装的服务数),则会得
31、到 2。这就意味着,每完成一个循环,我们都会将进度条的值增加 2。如果我们执行 50 次循环,则进度条的值将为 100(50 乘以 2)。猜猜看?我们执行 50 次循环后,脚本即告完成。而且,我们执行 50 次循环后,进度条将被设置为 100。换句话说,脚本运行结束时,进度条恰好大致达到 100。聪明,哈?For Each 循环如下所示:For Each objService in colServicesWscript.Sleep 200objExplorer.Document.Body.All.ProgressBar1.Value = _objExplorer.Document.Body.A
32、ll.ProgressBar1.Value + intIncrementNext不可否认,我们在此示例脚本中走了一些捷径:我们只需让该脚本暂停 200 毫秒,而无需对每项服务执行某些操作(例如,将服务信息写入文本文件中)。在实际脚本中,您可能希望删除代码行Wscript.Sleep 200,并用更有趣一点的内容来代替它。不过,需要再次强调的是,这同样要靠您自己来完成。在循环的末尾,我们运行下面这行代码:objExplorer.Document.Body.All.ProgressBar1.Value = _objExplorer.Document.Body.All.ProgressBar1.Va
33、lue + intIncrement这段代码做什么呢?是这样,objExplorer.Document.Body.All.ProgressBar1 只是进度条控件的对象路径。我们现在要做的是,将进度条的 Value 设置为当前值加上刚才求得的增量。(记得用 100 除以服务数了吗?)这就是我们指示进度的方法。脚本开始运行时,进度条将被设置为 0。执行一次循环后,进度条将被设置为 2:当前值 (0) 加上增量 (2)。再执行一次循环后,进度条将被设置为 4:当前值 (2) 加上增量 (2)。依此类推。它可能毫无意义,但如果您自己尝试编写脚本,则您就会明白我们所说的内容了。我们所做的就是这些。完成
34、 For Each 循环后,我们的脚本也宣告结束。因此,我们只需使用下面这行代码来终止 Internet Explorer 实例,并为出色地完成了工作而自我恭维一下。objExplorer.Quit脚本中心:ActiveX 控件指南使用 Microsoft Office 组合框控件更多 ActiveX 控件 Microsoft Office 图表控件 Microsoft Office 复选框控件 Microsoft Office 命令按钮 Microsoft Office 进度条 Microsoft Office 电子表格控件 表格数据控件对于脚本编写者来说,HTA(HTML 应用程序)是一种
35、令人难以置信的资源:毕竟,利用它们可以在图形用户界面中将各种脚本结合起来,而无需掌握完整的编程语言,或投入到像 Microsoft Visual Studio 这样全面的开发环境中。事实上,要创建一个 HTA,除了记事本外,您不需要任何更独特的东西;这其中的部分原因是 HTA 依赖于图形控件,如复选框、列表框、下拉列表等,而这些控件是 HTML 附带的。这确实是好事。与此同时,还应注意 HTML 附带的控件经常在功能上受限,至少与 Windows 和 Office 的控件相比是这样。例如,假定您正在使用 Microsoft Word,并要选择 ZapfChancery 字体。单击“字体”组合框
36、,您一定会看到一个包含字体名称的长长的滚动列表。那么,为了找到 ZapfChancery,您有必要一直滚动到列表的底部吗?绝对没有此必要:Microsoft Word 永远不会让您陷入这样的麻烦之中。恰恰相反,您只需在组合框中键入字母 Z,便会自动转到列表中第一个以字母 Z 开始的项目。在多数计算机中,该项均为 ZapfChancery。如果不是(例如,如果有名为 Zap 的字体),只需继续键入:只要碰到唯一相符的字母组合(在本例中该组合为 Zapf),便会选择 ZapfChancery。这是从列表中定位和选择项目的非常快速、非常简单的方法。这可太棒了!不过,前提是使用 Microsoft W
37、ord。但如果使用的是 HTA 中的 HTML 下拉列表,又会怎么样呢:可以键入 Z 然后立即跳转到列表中以字母 Z 开始的第一项吗?这不一定;实际上,在 HTML 下拉列表中,您无法键入 任何内容 。相反,您必须一直滚动到列表底部,然后手动选择该项。这种方法起作用,但绝对不是好的做法,对于日趋懒惰,噢不,是繁忙的你我来说尤其如此。但如何处理这一问题呢:在 HTA 中插入一个 Microsoft Office 组合框怎么样?太有趣了,您竟然想到这种方法!返回页首 在 HTA 中使用组合框控件实际上,在安装 Microsoft Office 时您即免费获得了一些 ActiveX 控件,这些控件可
38、嵌入到 Web 页或 HTA 中。组合框即是此类控件之一,它结合了文本框和下拉列表的属性:您可以在框中键入值或者从下拉列表中选择值。看起来这并不够,无论何时在文本框中键入值,控件都将自动搜索列表中的条目并尝试寻找匹配项。如果 ZapfChancery 是列表中以字母 Z 开头的第一项,则只需键入 Z,该组合框将为您找到 ZapfChancery。没错,该控件可以嵌入 HTA 中,因此您可以调用自己的控件。但不要只听我们说;您应亲自去了解它的工作原理。如果您的计算机中安装了 Microsoft Office,只需将以下代码粘贴到 HTA(当然,该 HTA 只是一个扩展名为 .hta 的文本文件)
39、中:ComboBox ExampleSub Window_OnloadDim arrItems(3)arrItems(0) = “Black“arrItems(1) = “Blue“arrItems(2) = “Green“arrItems(3) = “Red“ComboBox1.List = arrItemsEnd SubSub RunScriptMsgbox ComboBox1.ValueEnd Sub这究竟意味着什么?首先,它意味在 HTA 中插入组合框控件如同插入以下 标记一样简单:正如您所看到的,您只是添加 标记与两个参数: classid。它是一个“全局唯一标识符”,告诉操作系统您
40、要使用哪个 ActiveX 控件。在安装了组合框的所有计算机上 classid 都相同。这意味着您可在计算机上编写脚本,然后与其他也安装了 Microsoft Office 的人共享该脚本。(不必您询问我就可以直接告诉您,不能只是简单地将 ActiveX 控件同 HTA 放在一起。任何人要想使用您的小应用程序都必须安装 Office。) id。您分配给控件的“别名”。需要时我们将随时使用此 id 在脚本中引用该控件。至此还没有什么问题,但有一点除外:不含项目列表的下拉列表不太有用。不过别担心:将项目添加到组合框同嵌入控件一样容易。要将项目添加到组合框中,我们使用 Window_Onload 子
41、例程:只要您有 HTML 编程经验,就会知道,任何使用此类名称的子例程都会在每次加载或重新加载 HTA 或 HTML 页面时自动运行。我们在该子例程内部创建了一个数组(在示例脚本中,数组名为 arrItems);该数组中的每个元素都代表下拉列表中将包含的项目。例如,以下代码将颜色 Black、Blue 、Green 和 Red 添加到该数组中:Dim arrItems(3)arrItems(0) = “Black“arrItems(1) = “Blue“arrItems(2) = “Green“arrItems(3) = “Red“这没什么奇特之处:只是基本的 VBScript 编程。我们从使
42、用 Dim 语句开始,将数组限定为包含 4 个项目。什么?没弄错吗?代码不应像下面这样吗:Dim arrItems(4)不,我们真的没错,信不信由您。(这也令我们吃惊,但您知道人们常说的那句话吗:谁都有得意的时候。)使用 Dim 语句时,括号中的数字代表数组中最后一个项目的索引号。在 VBScript 数组中,分配给第一项的索引号始终是 0,分配给第二项的是 1,以此类推。如此继续下去,您会发现,分配给数组中的第四项的索引号将是 3。换言之,括号中的数字总是比数组中的实际项目数小一。坦白地讲,我们同意您的观点。但现在更改的机会是微乎其微。您只要记住,数组中的第一项是项目 0,数组中最后一项是项
43、目总数减 1。代码的其余部分只是为数组中的各个项分配值,从第一项开始(索引号 0)直到第四项,即最后一项(索引号 3):arrItems(0) = “Black“arrItems(1) = “Blue“arrItems(2) = “Green“arrItems(3) = “Red“配置完数组之后,我们将组合框的 List 属性值设置为该数组的值。这意味着实际只为组合框填充一行代码:ComboBox1.List = arrItems此行代码一执行,就会显示一个包含项目 Black、Blue、Green 和 Red 的组合框:将组合框嵌入 HTA 之后,可以单击箭头并从列表中选择项目;或者,只需将
44、光标置于文本框中并开始键入。键入字母 G 则颜色 Green 将弹入文本框;键入字母 R 则出现颜色 Red。您说对了:这些都很容易。但如果您键入字母 B,又会怎样?起初文本框中将出现颜色 Black;这是因为 Black 是列表中以字母 B 开始的第一项。顺便提一句,这也说明按字母顺序排列项目确实是个好办法。默认情况下,组合框搜索列表中与键入的内容匹配的第一项。您多半希望 Beige 在 Burnt Umber 之前匹配;这种情况仅在项目按字母顺序排列时才会发生。现在接近我们这个小故事的激动人心的尾声了。如果键入 Bl,颜色 Black 将保留在文本框。为什么会是这样?因为它是列表中与字母
45、Bl 匹配的第一个项目。但如果键入 Blu 则颜色 Blue 将立即弹入文本框。这是因为 Blue 是与字母组合 Blu 匹配的第一个项目。这是不是很酷?有一件事情我们应当指出:在组合框中键入时,所选用作匹配项的项目将象下面这样显示(请注意,键入的字母 G 不处于选中状态,而作为匹配项检索的字母组合 reen 处于 选中状态):我们为什么关心这一点呢?只要文本处于此状态,组合框就不含有值;说得正式一些就是,此时您未选中任何项目。在本示例 HTA 中,我们使用一个按钮,单击时该按钮运行显示组合框的 Value 的子例程 (RunScript):Sub RunScriptMsgbox ComboB
46、ox1.ValueEnd Sub如果在组合框的外观和上图相像(即部分文本处于选中状态)时单击该按钮,则脚本将报告该组合框不含有值。为确保得到正确的结果,您需要按 ENTER,使用 TAB 键或退出组合框,以“ 保存”选中的值。这有点儿怪,您需要逐步适应。组合框在默认状态下非常有用;但这些默认值却并非不能更改。相反,您对组合框的外观及运行方式有相当大的控制权;例如,如果愿意,您甚至可以关闭自动匹配行为。我们不会在本文中逐个详细说明组合框的每个属性,相关信息请查阅 Microsoft Forms 帮助文件 (FM20.chm)。安装 Office 时,该文件可能已经复制到 C:Program Fi
47、lesCommon FilesMicrosoft SharedVBAVBA61033文件夹下。如果没有,您可从 Office CD 上获取该文件。那么, 应 如何更改组合框的属性呢?最容易的方法是在 Window_Onload 子例程中包含必要的代码行。例如,MatchRequired 属性设置为 True 时,则要求先匹配列表中的项目,然后才能使用 ENTER 键或 TAB 键“保存”组合框中的值;换言之,不能任意键入值,而是必须键入下拉列表中包含的值。要将 MatchRequired 属性设置为 True,只需将此行代码添加到 Window_Onload 子例程即可:ComboBox1.M
48、atchRequired = True解决问题了吗?嗯,这可能是因为使用包含四种颜色的列表的“快速匹配 ”控件给人的印象不是那么深刻。为了让您更深刻地意识到它是多么有用,又是多么酷,我们为您准备了另一个示例脚本,该脚本将检索安装在计算机上的所有服务的列表,然后在组合框中显示这些服务的名称。此处需注意两件事情: 该脚本使用动态数组,并在每次添加新服务时调整数组的大小;这即是 RedDim Preserve命令的用途所在。如果您不熟悉动态数组,不了解如何使用它们,请查看 Microsoft Windows 2000 脚本指南 的此部分。 该脚本将组合框的宽度设置为 400(宽度和高度均以磅为单位)
49、。到这儿就完成了,这样就可以完整显示服务名称了。(根据计算机上安装的服务以及服务名称的长度,您可加大或缩小宽度。)以下即是用于 HTA 的代码(请注意,因为此示例使用 WMI,所以它 必须 在 HTA 中运行;它在 HTML 文件中无法工作):ComboBox ExampleSub Window_OnloadDim arrItems()i = 0ComboBox1.Width = 400strComputer = “.“Set objWMIService = GetObject(“winmgmts:“ & strComputer & “rootcimv2“)Set colServices = objWMIService.ExecQuery(“Select * From Win32_Service“)For Each objService in colServicesReDim Preserve arrItems(i)arrItems(i) = objService.DisplayNamei = i + 1NextComboBox1.List = arrItemsEnd SubSub RunS