Paradox 引擎配置实用程序未包含在 Visual Basic 中 (Readme)

在 Visual Basic 的 Crystal Reports 的帮助文件中，“Paradox 引擎配置实用程序”主题引用到一个名为 PXENGCFG.EXE 的文件，它是用来在网络上配置 Paradox 引擎的。这个文件没有包含在 Visual Basic 中，因为 Microsoft Jet 数据库引擎可处理所有对 Paradox 数据的连接。

详细信息   为了使用 Jet 数据库引擎连接到 Paradox 数据，参见《数据访问对象指南》的“使用 Paradox 数据”


HTML 页上消失的 ActiveX 控件 (Readme)

使用 HTML 工具插入特定的 ActiveX 控件，当 HTML 页在浏览器中查看时，可以引起控件不出现。发生这种问题的控件包括 MSChart 和 ImageList 控件。发生这种问题的工具包括 ActiveX Control Pad。

为了解决这个问题，检查工具生成的 VBSscript，并且从 Object 标记中删除 Data 属性。

使用 ActiveX Control Pad 插入 MSChart 控件

1	启动 ActiveX Control Pad。

2	在“编辑”菜单上，点取“插入 ActiveX 控件”。

3	在“插入 ActiveX 控件”对话框中，双击“Microsoft Chart Control”。

4	关闭“ActiveX 控件编辑器”。

当关闭编辑器时，将注意到大量的文本已经加入到 HTML 中。上卷文本直到找到 Object 标记的开头，它将类似下面的文本：

<OBJECT ID="MSChart1" WIDTH=100 HEIGHT=51

 CLASSID="CLSID:31291E80-728C-11CF-93D5-0020AF99504A"

 DATA="DATA:application/x-oleobject;BASE64,gB4pMYxyzxGT1QAgr5lQSiFDNBIIAAAAVgoAACsFAAC9ZAYFAQAAAAAA//// ...

5	为了使 MSChart 控件显示正常，必须删除 Data 属性的所有文本。做完之后，HTML 将类似下面的代码：

<OBJECT ID="MSChart1" WIDTH=100 HEIGHT=51

 CLASSID="CLSID:31291E80-728C-11CF-93D5-0020AF99504A"

</OBJECT>

设计时的属性必须在运行时设置

不幸的是，删除 Data 属性也意味着不能为控件设置任何设计时的属性，因为设计时的属性也已经被删除。这就意味着必须在运行时设置所有的属性。对像 ImageList 控件的控件来说，这就意味着不能在设计时向控件中加载图片。取而代之，必须使用 VBScript 加载图片。此外，LoadPicture 函数（向 ImageList 控件中加载图形时需要）在 VBScript 中不可用。为了向 ImageList 控件中加载图片，必须创建一个自己的控件，用它来显露一个公有方法。那个方法将调用 LoadPicture 函数。


GetSelectedText 方法替换为 GetSelection 方法 (Readme)

在《部件工具指南》中的“使用外接程序操纵 IDE”主题中提到的 GetSelectedText 方法已经替换为 GetSelection 方法。

在“代码窗格”标题下可以找到的下列句子中，将“GetSelectedText”替换为“GetSelection”：

“可以使用 GetSelectedText 方法复制选定的代码到 Windows 剪贴板中。”


从“工程属性”对话框中自动升级 ActiveX 控件 (Readme)

在工程属性对话框的“通用”选项卡上的“升级 ActiveX 控件”选项未被充分地说明。简单地说，如果新版本支持自动更新，选项允许指定是否工程将自动更新控件。如果选项选中（缺省），ActiveX 控件将被自动更新，如果现在是新版本。如果选项选中，无论何时加载工程时，一个对话框将提示是否升级控件。


Connect 事件 (Winsock 控件)

当连接操作完成后产生。

语法

object.Connect()

object 所在处代表一个对象表达式，其值为一个 Winsock 控件。

说明

使用 Connect 事件确认连接是否已经成功。


Entpris 中的企业示例应用程序，不在 Clisvr 目录 (Readme)

企业示例应用程序，下面列表中所示，可以在 Entpris 目录中找到，而不是像 sample.hlp 中声明的那样在 clisvr 目录中。

示例应用程序名称

ape

callback

hello

intrface

passthru

poolmgr


Click 事件（SSTab 控件）示例有语法错误 (Readme)

SSTab 控件的 Click 事件的示例在 SaveSetting 语句中有一处错误。括号应该取消。正确的语法显示如下。

Private Sub sstbPrefs_Click(PreviousTab As Integer)

Dim ThisSetting As String

Select Case PreviousTab

Case 0

If optLoanLen(0) = True Then

ThisSetting = "Months"

Else

ThisSetting = "Years"

End If

SaveSetting "LoanSheet", "LoanLength", _

"Period", ThisSetting

Case 1

Dim X As Integer

For X = 0 To 3

If optPctsShown(X) = True Then

SaveSetting "LoanSheet", _

"InterestRate", _

"Precision", optPctsShown(X).Tag

Exit For

End If

Next X

End Select

End Sub


MSComm 控件示例错误 (Readme)

MSComm 控件示例在示范 Output 和 InBufferCount 属性的那一行有一处错误。有问题的代码是：

MSComm1.Output = "AT" + Chr$(13)

'等待数据回到串口。

Do

DoEvents

Loop Until MSComm1.InBufferCount >= 2

'在串口中读取 "OK" 应答数据。

Instring = MSComm1.Input

'关闭串口。

MSComm1.PortOpen = False

虽然这可以替换为下面的代码，

MSComm1.Output = "AT" + Chr$(13)

'等待数据回到串口。

Do

DoEvents

Loop Until MSComm1.InBufferCount >= 7 '改变的

'值

'在串口中读取 "OK" 应答数据。

Instring = MSComm1.Input

'关闭串口。

MSComm1.PortOpen = False

更好的修改将是下面这样：

MSComm1.Output = "ATV1Q0" & Chr$(13) '确保

'调制解调器回答 "OK"。

'等待数据回到串口。

Do

DoEvents

Buffer$ = Buffer$ & MSComm1.Input

Loop Until InStr(Buffer$, "OK" & vbCRLF)

'在串口中读取 "OK" 应答数据。

'关闭串口。

MSComm1.PortOpen = False


BookSaleClient 示例：“销售模型”按钮未按下 (Readme)

当 BookSaleClient 示例应用程序启动时，没有按下任何“销售模型”节的按钮。然而，缺省的情况下，第一个“销售模型”按钮是在点取“执行”按钮时使用。当然，也可以在任何时候点取任何“销售模型”按钮来改变曲线类型。


GetChunk 方法，StateChanged 示例需要 DoEvents (Readme)

Internet 传输控件的 GetChunk 方法的代码示例需要在适当的位置插入 DoEvents 语句。改正的代码显示如下：

Private Sub Inet1_StateChanged(ByVal State As Integer)

'当 State = 12 时，用 GetChunk 方法

'获取服务器的应答。本例假设

'数据是文本。

Select Case State

'... 其它情况未显示。

Case icResponseReceived '12

Dim vtData As Variant '数据变量。

Dim strData As String: strData = ""

Dim bDone As Boolean: bDone = False

'得到第一块。

vtData = Inet1.GetChunk(1024, icString)

DoEvents

Do While Not bDone

strData = strData & vtData

' 得到下一块。

vtData = Inet1.GetChunk(1024, icString)

DoEvents

If Len(vtData) = 0 Then

bDone = True

End If

Loop

txtData.Text = strData

End Select

End Sub


MSChart：Updated 事件的值 (Readme)

MSChart 控件的下列事件有一个 updateFlags 参数，其未被充分说明：

AxisLabelUpdated 事件

AxisTitleUpdate 事件

AxisUpdated 事件

ChartUpdated 事件

DataUpdated 事件

FootnoteUpdated 事件

LegendUpdated 事件

PlotUpdated 事件

PointLabelUpdated 事件

SeriesUpdated 事件

TitleUpdated 事件

每个事件都在图表已经更新时通知控件。因而，updateFlags 参数就指明了图表已经改变了多少，从一点也没有改变，到完全重新配置图表的主体部分。

updateFlags 参数的常数将不能工作。代之以使用下表中列出的值。

常数	值
VtChNoDisplay	0
VtChDisplayPlot	1
VtChLayoutPlot	2
VtChDisplayLegend	4
VtChLayoutLegend	8
VtChLayoutSeries	16
VtChPositionSection	32


VB5 中没有部件管理器 (ReadMe)

《程序员指南》和《客户/服务器应用程序创建指南》中都提到了部件管理器。而在本版本的 Visual Basic 中没有部件管理器。


《数据访问对象指南》中的章节标题被改变 (ReadMe)

《数据访问对象指南》的第八章的标题应该是“创建多用户应用程序”。在《数据访问对象指南》第一章中列出的该章标题有误。


反馈 Web 页 URL (ReadMe)

正确的 Visual Basic 反馈 web 页位置应为 www.microsoft.com/support/feedback/mswish.htm。在《程序员指南》第一章的“Visual Basic 在线链接”主题中列出的 URL 有误。


运行时 SourceColumn 属性是可读/写的 (Readme)

rdoColumn 对象的 SourceColumn 属性在运行时是可读/写的。帮助主题“SourceColumn 属性（远程数据）”中误将其说明为在运行时是只读的。


《数据访问对象指南》中等联结的示例代码 (Readme)

下面是第五章“关于 SQL 查询”中的“内部联接”标题下应有的正确示例代码。

 Dim MyQRY As QueryDef

 MyQRY.SQL = "SELECT DISTINCTROW Sum([Unit Price] * " _

     & "[Quantity]) AS [Sales], [First Name] & chr(32) & " _

     & "[Last Name] AS Name FROM Employees " _

     & "INNER JOIN (Orders INNER JOIN [Order Details] " _

     & "ON Orders.[Order ID] = [Order Details].[Order ID]) " _

     & "ON Employees.[Employee ID] = Orders.[Employee ID] " _

     & "GROUP BY [First Name] & chr(32) & [Last Name];"


Control 类 (ReadMe)

Visual Basic 提供 Control 类作为控件的通用变量类型。如果用 As Control 声明变量，可以赋予它对于任何控件的访问。不能创建 Control 类的实例。

注意   如果用与控件相同的类型来声明变量（例如，As TreeView 或 As CommandButton），则使用这样的变量来访问控件的属性和方法要快些，因为 Visual Basic 可以使用早期绑定。对于赋予声明为 As Control 的变量的控件，若要访问其属性和方法，Visual Basic 必须用后期绑定。


MaskColor 属性（UserControl 对象） (ReadMe)

返回或设置决定位图的透明区域的颜色，该位图是赋予 BackStyle 属性为 0 （透明）的 UserControl 对象的 MaskPicture 属性的。

语法

object.MaskColor [= color]

MaskColor 属性语法有这些部分：

部分	描述
object	其值为“应用于”列表框中的对象的对象表达式。
color	值或常数，它决定了屏蔽的颜色，请看下面的设置值。
设置值

Visual Basic 使用 Microsoft Windows 操作环境下的红－绿－兰 (RGB) 颜色值：

设置值	描述
RGB colors	通过 Color 调色板指定的颜色，或者在代码中使用 RGB 或 QBColor 函数指定的颜色。
说明

如果位图赋予了 BackStyle 属性为 0（透明）的 UserControl 的 MaskPicture 属性，则该控件被位图覆盖的部分按 MaskColor 属性变为透明。

在透明区域上发生的鼠标事件被容器接收，或者被 UserControl 覆盖的控件接收。

如果没有位图赋予 MaskPicture 属性，或者如果 UserControl 的 BackStyle 属性不为 0（透明），则 MaskColor 属性无效。

更详细的信息，请参阅 UserControl 对象的 MaskPicture 属性。

注意   尽管 MaskColor 接受列于对象浏览器的Visual Basic (VB) 对象库中的系统颜色常数，正如 BackColor 和 ForeColor 属性的联机帮助中描述的那样，也只有在 MaskPicture 位图包含系统颜色的情况下才有用。


MaskPicture 属性（UserControl 对象）  (ReadMe)

返回或设置位图，该位图与 MaskColor 属性结合在一起，决定了 BackStyle 属性为 0（透明）的 UserControl 对象的透明和可视部分。

语法

object.MaskPicture [= picture]

MaskPicture 属性语法有这些部分：

部分	描述
object	其值为“应用于”列表框中的对象的对象表达式。
picture	在设置值中描述的图形图象中的一种。
设置值

picture 的设置值：

设置值	描述
Nothing	（缺省）没有图片。在设计时，突显属性值并按“删除”键，"(None)" 将出现在“属性窗口”。在运行时，将不带文件名的 LoadPicture 函数的返回值赋予该属性，或者用 Set 语句将值 Nothing 赋予该属性。
(Bitmap, DIB, GIF, or JPEG)	指定图象类型的位图。在设计时，可以用“属性窗口”输入指定含有图形的文件的字符串表达式。在运行时，可以用Picture 对象设置这个属性值，可以用另一个对象的 Picture 属性设置这个属性值，或者用关于图象类型位图文件的 LoadPicture 函数来设置这个属性值。
重要   只有图象类型的位图，如 GIF、JPEG 和 DIB，才支持这个特性。Windows 图元文件、图标或光标不支持这个特性。

说明

如果位图赋予了 BackStyle 属性为 0（透明）的 UserControl 的 MaskPicture 属性，则该控件被位图覆盖的部分按 MaskColor 属性变为透明。

在透明区域上发生的鼠标事件被容器接收，或者被 UserControl 覆盖的控件接收。

MaskPicture 位图的不透明部分将以 UserControl 的 BackColor 属性指定的颜色显示。这些部分，并不要求是邻接的，它们定义了在 UserControl 上绘画的剪贴区域。也就是，在 UserControl 上所作的任何绘画，将被剪贴到 MaskPicture 位图的不透明部分。

重要   赋予 MaskPicture 属性的位图只用来定义 UserControl 的透明区域和剪贴区域。而位图从不显示。为了在由 MaskPicture 和 MaskColor 定义的剪贴区域的顶部显示位图，可以将此位图赋予 UserControl 的 Picture 属性，或者在 UserControl 的 Paint 事件中利用 PaintPicture 将它画在 UserControl 上。

在隐藏的 PictureBox 上画画，可以为控件创建动态的剪贴区域，并且将产生的图象传给 UserControl 的 MaskPicture 属性。

注意   若在设计时设置 MaskPicture 属性，该图形将被定义 UserControl 的 .ctl 和 .ctx 文件保存和加载。若往控件部件（.ocx 文件）中生成工程，该文件将包含图象。相反，若在运行时加载图形，该图形不用部件保存。

更详细的信息，请参阅联机手册“编译 ActiveX 控件”中的“给控件配上透明的背景”。


ParentControlsType 属性 (ReadMe)

返回或设置一个值，该值决定 ParentControls 集合是含有对合并了容器的Extender 对象的控件的引用，还是含有对没有 Extender 的控件的引用。

语法

object.ParentControlsType [= type]

ParentControlsType 属性语法有这些部分：

部分	描述
object	其值为“应用于”列表框中的对象的对象表达式。
type	整数或命名常数，指示 ParentControls 集合将返回什么。
设置值

type 的设置值：

常数	值	描述
vbExtender	0	（缺省）ParentControls 集合将返回控件和扩展。
vbNoExtender	1	ParentControls 集合将返回控件本身，而不返回扩展。
说明

ParentControls 集合允许访问控件所在容器中的其它控件。对于对这些控件的引用来说，缺省为包括容器提供的 Extender 对象的各种属性和方法。

有些容器，如 Internet Explorer，提供 Visual Basic 不能使用的扩展对象。在这样的容器中，如果想访问使用缺省设置值的 ParentControls 中的对象，Visual Basic 将产生错误。

将 ParentControlsType 设置为 vbNoExtender，可以访问 Internet Explorer 中 HTML 页上的控件，这样，ParentControls 包含对于这些控件自身的引用，不包括扩展属性和方法。

因为属性可以在运行时设置，所以可以根据控件所在的容器，在 vbExtender 和 vbNoExtender 之间来回切换。必要时，可以在支持两者的容器中，在设置值中间进行替换。


Parent 属性（UserControl 对象） (ReadMe)

返回对于控件所在容器的引用。在设计时不可用，在运行时为只读。

语法

object.Parent

Parent 属性语法有这些部分：

部分	描述
object	其值为“应用于”列表框中的对象的对象表达式。
说明

即使 UserControl 的 AmbientProperties 对象不提供 Parent 属性，这个 Parent 属性也返回对容器对象的引用。可以用 UserControl 对象的 Parent 属性来访问容器的对象模型。

通过测试 TypeName(Parent)，可以确定控件在什么容器中。

•	Excel 返回工作簿。

•	Word 返回文档。

•	Powerpoint 返回简报。

•	VB4/VB5 返回窗体。

•	Internet Explorer 返回对象，其 Script 属性返回 IOmWindow 对象。

例如，在 Internet Explorer 中，下列代码将改变控件所在的 HTML 页的背景颜色：

Parent.Script.get_document.bgColor = "Blue"

关于 Internet Explorer Scripting Object Model 的更详细信息，请参阅Microsoft 的“Web site”。

重要   总是用后期绑定来调用 Internet Explorer Scripting Object Model。使用早期绑定总会带来些兼容性方面的问题。在其它容器中，可以使用早期绑定。


在此类工程中，当前的 Public/Instancing 属性值无效 (Readme)

此错误发生在向已经存在的工程中添加文件时，而该工程不支持这个文件所包含的模块的 Instancing 或 Public 属性的设置值。

例如，从 ActiveX Exe 工程中取一个 Instancing 属性被设置为 MultiUse 的类模块，将此类模块添加 Standard Exe 工程中去便要产生这个错误。这是因为 Standard Exe 工程只支持 Instancing 属性的 Private 值。

同样，将 Public 属性为 True 的 UserControl 添加到 Standard Exe 工程中，也会产生这样的错误，因为在 Standard Exe 工程中的控件只能是私有的。

对于这样的错误不必采取任何措施，因为 Visual Basic 会自动将 Instancing 或 Public 属性设置为此类工程支持的值。


用控件接口程序向导删除属性，并不能更新 PropertyPage (Readme)

ActiveX Control Interface Wizard 可以用来添加和删除已经存在的 ActiveX 控件中的属性 。如果控件具有显示特定属性的属性页，而用向导从控件中删除这个属性声明，则 PropertyPage 不会发生因这次删除而更新。

其结果，在下次运行这个属性页时会产生错误。要想避免这个错误，一定要在显示这个属性的属性页中，用手工删除对于被删属性的一切引用。


可以和实现一起使用的接口的描述 (ReadMe)

在创建与实现语句一起使用的接口时，可以使用 Visual Basic 或者创建类型库的任何工具，如，MkTypLib utility 或者 Microsoft 接口定义语言 (MIDL) 编译器。

大多数在 Visual Basic 中创建的类，定义了与实现一起工作的接口。当在 Visual Basic 中通过定义类来创建接口时，只要确认在属性和方法的名称下面没有下划线就行。

想要和实现一起工作，用 Visual Basic 以外的工具创建的接口，必须有一定的限制。下面就是这些限制中的大部分：

•	在接口方法名称下面不能有下划线。

•	只允许 [in] 和 [in,out] 参数 �单有 [out] 的参数是不允许的，[lcid] 参数也不允许。

•	要使得错误得以传播，方法返回类型必须是 HRESULT 。因为 HRESULT 被转换为异常（产生的错误），所以在 Visual Basic 中是看不见的。为了创建在 Visual Basic 代码中使用时会有返回类型的方法，必须用 [out, retval] 作为最后参数。

•	只能使用自动化数据类型：

VB	MIDL
Integer	short
Long	long
Single	float
Double	double
Byte	unsigned char
Boolean	boolean 或 VARIANT_BOOL
String	BSTR
Variant	VARIANT
Date	DATE
Currency	CURRENCY 或 CY
Object	IDispatch *
IUnknown	IUnknown
•	包含上表中简单数据类型的 SAFEARRAY 参数是允许的。

•	Enum 参数是允许的。

•	Dispinterface 接口指针可以作为参数。

•	Dual 接口指针可以作为参数。

•	CoClass 参数是允许的。

•	如果正在为了使系统接口能与实现一起使用而创建类型库，一定不能使用 [oleautomation] 或 [dual] 属性。在能够将类型库添加到 Visual Basic “引用”对话框之前它们必须注册，而注册带有 [oleautomation] 属性的类型库，将覆盖远程系统接口所需要的信息。这将使得该系统上的其它应用程序失败。不能使用 [dual] 属性，因为它隐含 [oleautomation]。

注意   为了强制正确的类型，在创建类型库时指定 [oleautomation] 可能是有用的，但是在通过 Visual Basic “引用”对话框引用它之前，该类型库必须不用这个属性建立。

•	在数据类型表中没有无符号长型 (Unsigned long) 和无符号短型 (unsigned short) 参数，所以它们也是不允许的。

•	用户自定义类型（结构）不能作为参数。

•	接口必须基于 IUnknown 或 Idispatch。全部的 vtable（在 IUnknown/Idispatch 之后）必须在单一接口中描述。

•	受到限制的 vtable 项目是非法的，并且不能阻止实现语句工作。

•	大多数指针不能作为 [in] 参数传递。（例如，作为远程优化，C++ 接口可以声明如 [in] VARIANT* pVar 这样的参数。这个不与实现一起工作。）[in] 参数可以是 BSTR、指向接口的指针（例如，IDispatch*）、或者 SAFEARRAY 指针（SAFEARRAYs 总是作为指针传递的）。[in,out] 参数可以是指向 Automation 类型的指针，或者是指向接口的双指针 (double pointer) （例如，IDispatch**）。（注意，在 Visual Basic 中，'ByVal As String' 映射为 [in] BSTR。不能将 [in] BSTR* 与 Visual Basic 连用。）

•	实现不能与 dispinterfaces 一起工作。

更详细的信息，请参阅《程序员指南》的“用对象编程”中的“多态”，以及《部件工具指南》中“创建 ActiveX 部件”中“部件设计中的一般准则”中的“通过实现接口提供多态”。这些主题可以在联机手册中找到。


errata：条件编译代码示例 (ReadMe)

在《程序员指南》的“再论编程”的“使用条件编译”中的示例代码是不正确的。第一个 #Else 应当是 #ElseIf：

#If conFrenchVersion Then

'<法语版代码>。

#ElseIf conGermanVersion then

'<德语版代码>。

#Else

'<其它版代码>。

#End If


error：'Item' 不能加载 (ReadMe)

除了其它原因之外，这个错误还发生在往工程中添加含有已经存在的 Form、MDIForm、UserControl、PropertyPage 或 UserDocument 的文件，而该工程已经选择了“无人值守执行” (Unattended Execution) 选项（从“工程属性”对话框的“通用”选项卡中访问的）。

标为“无人值守执行”的工程不支持任何用户界面的窗体，所以它能够含有的模块受到严格的限制。

更详细的信息，请参阅联机手册中“创建 ActiveX 部件”中“编译代码部件”中的“可量测性和多线程”。


Instancing 属性的缺省值因工程的类型不同而不同 (ReadMe)

联机帮助说，Instancing 属性的缺省值是私有的。这仅对于 Standard Exe 工程中的类模块才是正确的。

当在 ActiveX Exe 工程或 ActiveX DLL 工程中插入新的类模块，其 Instancing 属性的缺省值为 MultiUse。在 ActiveX Control 工程中插入新的类模块，其 Instancing 属性的缺省值为 PublicNotCreatable。


在调试程序时，模态的对话框或消息框封锁了事件 (ReadMe)

由于调试器中潜在的冲突，在模态的窗体或消息框显示时，开发环境不能够引发事件。因此，在模态的窗体或消息框消失之前，事件不输出。

重要   事件不输出只发生在开发环境中。一旦工程是已编译的，即使模态的窗体或消息框被显示，也引发事件。

发生这种情况的示例：

•	在开发环境中运行带 Timer 控件的窗体。在“工具”菜单中选择“选项”将打开一个模态的“选项”对话框。在此对话框消失之前，Timer 控件的 Timer 事件不发生。

•	在设计时，将带有 Timer 控件的 UserControl 的实例放到窗体上。（该定时器可能用于使这个控件表演动画；这种效果甚至在设计时也会产生，因为在设计时控件能够执行代码。）在“工程”菜单上选择“添加类模块”将打开“添加类模块”对话框，这是模态的。在此对话框消失之前，Timer 控件的 Timer 事件不发生。

•	一个 UserDocument 含有 Timer 控件和显示消息框的命令按钮。若正用 Internet Explorer 调试该 UserDocument，这时按命令按钮显示消息框，会使 Timer 控件的 Timer 事件不输出，直至该对话框消失。


编译为本机代码的工程仍然需要 MSVBVM50.DLL (ReadMe)

用 Visual Basic 创建的所有工程使用了运行时 DLL (MSVBVM50.DLL) 的各种服务。这个 DLL 提供的服务包括应用程序的启动和结束、窗体和固有控件的功能、以及象 Format 和 CLng 这样的运行时函数。

用“本机代码”选项编译工程，意味着所写的代码将完全编译为本机处理器的指令，而不是编译为 p-代码。这样，大大加速了循环和数学运算，另外多少加快了 MSVBVM50.DLL 提供的各种服务的调用。然而，它并没有消除对 DLL 的需要。


Require License 键只用于 ActiveX 控件工程 (ReadMe)

“工程属性”对话框上的“通用”选项卡的帮助指出，"Require License Key"选项“启动了对于产生 ActiveX 部件（自动化服务器、用户控件以及 ActiveX 控件）的工程的许可。”

这是不对的。只对 ActiveX 控件工程（也就是编译为 .ocx 文件的工程）支持许可。所以，这个选项对于所有其它的工程类型来说是无效的。


VBIDE 不能提供 SingleUse 类的多个实例 (Readme)

这个错误发生在下列几种情况：

•	正在开发环境下运行的工程含有 Instancing 属性为 SingleUse 的类。

•	客户工程，已有以前创建的这个 SingleUse 类的实例。

•	客户（它可能是同一个客户，也可能是另一个客户）试图创建 SingleUse 类的第二个实例。

产生这个错误的原因是，每个提供 SingleUse 对象的部件的实例只能创建 SingleUse 对象一次。（也就是，一旦 ActiveX Exe 工程被编译，创建它的 SingleUse 类的多个实例要运行该 Exe 部件的多个实例）。但是，当对象在开发环境中，启动该工程的第二个实例是不可能的。

这是对于正在调试的、提供 SingleUse 类的工程的一种限制。

注意   即使第一个客户释放了它的 SingleUse 类的实例，这个错误仍要发生。这是因为被编译的 Exe 不能够提供第二个 SingleUse 类的实例，即使第一个实例已经释放了。

更详细的信息，请参阅联机手册的《部件工具指南》中的“创建 ActiveX 部件”中的“编译代码部件”中的“通过多进程可量测性：SingleUse 对象”。


'item1' 的版本 'item3' 未曾注册。该控件将被… (ReadMe)

除了其它的原因之外，这个消息常常发生在用 Visual Basic 编写 ActiveX 控件时。这个消息是无害的，不需要采取什么措施，而且是可以避免的。

这个消息发生在下列几种情况：

•	将 ActiveX 控件工程编译为 .ocx 文件。

•	在 Visual Basic 的另一个副本中创建测试工程，并使用了“部件”对话框（在“工程”菜单中访问）的“控件”选项卡来选择 .ocx 文件，而后这个文件出现在“工具栏”中。

•	将控件的实例放在了窗体上，然后保存这个测试工程。

•	后来，又重新编译这个.ocx 文件。

•	在打开该测试工程时，这条消息出现在该工程加载期间。

这个消息发生在使用缺省的版本兼容设置时（工程兼容性，在“工程属性”对话框的“部件”选项卡上）。工程兼容性设置，在每次编译工程时使得控件部件（.ocx 文件）的类型库版本号加一。这样使得已经发行的控件的升级非常容易。

通常，.ocx 文件的新版本安装在开发者的计算机上之后，不能替换老的版本（常常因为文件名不同）。当开发者打开使用控件老版本的已经存在的工程时，Visual Basic 要询问：要不要将此工程中的控件实例升级为新版本。

在这种情况下，没有 .ocx 文件的老版本，于是 Visual Basic 自动升级控件，并用消息通知用户。

注意   类型库的版本号，与使用“工程属性”对话框的“生成”选项卡设置的文件版本号无关。这条消息显示的版本号是存储在 Windows 注册簿中的十六进制类型库版本号的十进制表示。

在这种情况下，这条消息并不要求对您的部分有任何动作，因为 Visual Basic 自动将新的类型库版本号合到测试工程中。

避免这条消息的几种办法：

•	不用独立的 Visual Basic 副本来编译和测试 .ocx 文件，可以在一个工程组内包含 ActiveX 控件和 Standard Exe 测试工程，在同一个开发环境副本中运行它们。关于这一点，在联机手册的《部件工具指南》的“创建 ActiveX 部件”的“创建 ActiveX 控件”一节中介绍。

•	用“工程属性”对话框上的“部件”选项卡选择与 .ocx 文件早期版本的“二进制兼容”。这样做的缺点在于：如果今后对控件做了版本不兼容的更改（例如删除了一个属性），在编译时会得到关于版本兼容的警告消息。

注意   如果正在创建已经存在控件的新版本，并且打算在此接口中做不兼容的更改，这样不好；在这种情况下，工程兼容性是比较好的，因为它保持了开发者在工程中将控件升级到新的版本的能力。然而应当换文件名，以免新的 .ocx 文件覆盖了老的。

关于类型库版本和版本兼容性的更详细的信息，请参阅联机手册中的《部件工具指南》，其中的“创建 ActiveX 部件”的“调试、测试和部署部件”的“版本兼容性”。


属性或方法调用包含了一个对私有对象的引用，或者作为一个参数或者作为一个返回值。(Readme)

在属性或方法调用中，包含了一个作为参数或返回值的对私有对象的引用。

私有对象决不能传递出工程外。所有下面这些全都是不允许的，它们将可能导致错误：

 	客户调用了进程外部件的属性或方法，并且试图传递一个作为参数的对私有对象的引用。客户调用了进程外部件的属性或方法，并且部件试图返回一个对私有对象的引用，或试图给这样一个对 ByRef 参数的引用赋值。

 	进程外部件在它的客户端调用了回调方法，并且试图传递一个对私有对象的引用。

 	进程外部件试图传递一个对私有对象的引用作为正在引发的事件的参数。

 	客户试图给一个对正在引发的事件的 ByRef 参数的私有对象的引用赋值。

注意   虽然 Visual Basic 防止了在进程间传递对私有对象的引用，但是还有一些情况 Visual Basic 不能检测这类错误，因而不能防止这类错误。私有对象不是设计为用于进程外的。如果将它们传递给客户，就会危害程序的稳定性并引起与将来 Visual Basic 版本的不兼容。如果需要传递自己的私有类给客户，则设置 Instancing 属性为 Private 以外的其它值。

尽管是服务器代码的错误，客户中也将总是出现错误。

求得另外的信息，选择问题中的项目并按下 F1 键。


应用程序未找到。查找具有 CLSID: |1 的对象。(Readme)

Visual Basic 不能找到试图使用的应用程序。这是一个系统错误。如果问题持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


应用程序已经启动，但是它没有注册类工厂。正在查找具有 CLSID: |1 的对象。(Readme)

应用程序已经被打开，但是类工厂没有被注册。这是一个系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


类没有被注册。正在查找具有 CLSID: |1 的对象。(Readme)

类没有被注册。这是一个系统错误。如果这个错误持续出现，就重新安装 Visual Basic，然后再试。


类未找到。(Readme)

Visual Basic 不能找到指定的类。这是一个系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


类对象不能被确定。正在查找具有 CLSID: |1 的对象。(Readme)

Visual Basic 不能找到指定的类对象。这是一个系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


类的 DLL 未找到。正在查找具有 CLSID: |1 的对象。(Readme)

Visual Basic 不能找到指定类的 DLL。这是一个系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


DLL 中的错误。正在查找具有 CLSID: |1 的对象。(Readme)

收到了一条系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


接口未注册。正在查找具有 CLSID: |1 的对象。(Readme)

接口未被注册。这是一个系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


无效的类字符串。正在查找具有 ProgID 的对象。(Readme)

正在试图使用的类字符串无效。这是一个系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


对象未被注册。正在查找具有 CLSID: |1 的对象。(Readme)

正在试图使用的对象未被注册。这是一个系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


不期待的错误。(Readme)

已经收到一条系统错误。如果这个错误持续出现，就重新安装 Visual Basic 或受影响的应用程序，然后再试。


使用“注释块”和“取消注释块”命令

“注释块”和“取消注释块”命令可以在“编辑”工具栏中找到。使用这些命令使多行代码成为注释块，或从一块代码中删除注释字符：

1.	添加“编辑”工具栏。在“编辑”菜单上选择“工具栏”命令，然后选择“编辑”；或将光标放在工具栏上，按右鼠标键，然后选择“编辑”。

2.	打开代码模块，并且突出显示希望创建注释块的代码，或希望从中删除注释字符的代码。

3.	按“编辑”工具栏上的“注释块”或“取消注释块”按钮。

或者代码将移入一个块，并且添加了注释字符；或者被分离成独立的代码片段，并且从中删除了注释字符。


支持应用程序的 OS 或 OS 版本错误。正在查找具有 CLSID: |1 的对象。(Readme)

正在使用不兼容的操作系统或操作系统的错误版本。安装一个兼容的操作系统，再试。


Controls 集合 (Readme)

是一个集合，其元素代表容器上的控件。Controls 集合有 Count 属性，它说明了集合中控件的数量；还有 Item 方法，它返回集合的成员。

语法

object.Controls.Count

object.Controls(index)

Controls 集合的语法有这些部分：

部分	描述
object	对象表达式，其值是“应用于”列表中的一个对象。
Index	整数，其范围从 0 到 Controls.Count - 1。
注意   如果容器是一个 Visual Basic 模块，诸如 Form 或 UserControl，在模块内没有必要提供对象表达式。如果容器是一个编译的 ActiveX 控件，诸如 ToolBar 控件，必须提供对象表达式。

说明

Controls 集合列举了容器中加载的控件。例如，可以用它改变容器中所有 Label 控件的 BackColor 属性。

可以在 If 语句中使用 TypeOf 关键字或 TypeName 函数，来决定 Controls 集合中控件的类型。

注意   Controls 集合不是 Visual Basic Collection 类的成员。它比 Collection 对象有较小的属性和方法集，并且不能创建它的实例。


错误常数 (ComCtl32) (Readme)

常数	值	描述
cc2InvalidProcedureCall	5	无效的过程调用
cc2BadFileNameOrNumber	&H34	无效的文件名或文件号
cc2FileNotFound	&H35	文件未找到
cc2InvalidPropertyValue	&H17C	无效的属性值
cc2SetNotSupportedAtRuntime	&H17E	属性不能在运行时设置
cc2SetNotSupported	&H17F	属性是只读的
cc2InvalidObjectUse	&H1A9	无效的对象使用
cc2WrongClipboardFormat	&H1CD	指定的格式不匹配数据的格式
cc2DataObjectLocked	&H2A0	DataObject 格式列表可能没有被清除或扩展到 OLEStartDrag 事件以外。
cc2ExpectedAnArgument	&H2A1	期待至少一个参数。
cc2RecursiveOleDrag	&H2A2	OLE 拖放的非法递归调用
cc2FormatNotByteArray	&H2A3	用于 SetData 的非内部的 OLE 拖放格式需要 Byte 数组数据。GetData 可能返回比 SetData 所给的数据多几个字节。
cc2DataNotSetForFormat	&H2A4	在 OLESetData 事件期间，请求的数据没有提供给 DataObject。
cc2InconsistentObject	&H8BA6	控件的内部状态已经混乱
cc2ErrorDuringSet	&H8BA7	不能设置属性
cc2ErrorOpeningVideo	&H8BA8	不能打开 AVI 文件
cc2ErrorPlayingVideo	&H8BA9	不能播放 AVI 文件
cc2NoValidBuddyCtl	&H8BAA	必须首先设置 BuddyControl 属性
cc2VideoNotOpen	&H8BAB	必须首先打开 AVI 文件
cc2AutoBuddyNotSet	&H8BAC	AutoBuddy 未设置，没有找到潜在的合作控件
cc2ErrorStoppingVideo	&H8BAD	试图停止播放 AVI 文件出错
cc2ErrorClosingVideo	&H8BAE	关闭打开的 AVI 文件出错
cc2CantStopAutoPlay	&H8BAF	Stop 方法不影响 AutoPlay 属性
cc2BuddyNotASibling	&H8BB0	BuddyControl 必须是同一个容器内的另一个独立控件
cc2NoUpDownAsBuddy	&H8BB1	UpDown 控件不能与另一个 UpDown 控件合作


LeftCol 属性 (Readme)

返回或设置一个整数，其代表 DBGrid 控件的最左面的可见列。这个属性在设计时是只读的。

语法

object.LeftCol [= value]

LeftCol 属性的语法有这些部分：

部分	描述
object	对象表达式，其值是“应用于”列表中的一个对象。
value	数值表达式，其指示最左面的可见列。缺省值是 0。


OLEDrop 常数 (ComCtl32) (Readme)

常数	值	描述
cc2OLEDropEffectNone	0	没有 OLE 拖/放操作发生/将要发生。
cc2OLEDropEffectCopy	1	指示复制发生/将要发生的掩码。
cc2OLEDropEffectMove	2	指示移动发生/将要发生的掩码。
cc2OLEDropEffectScroll	-2147483648 (&H80000000)	指示放下目标窗口已经卷动/将要卷动的掩码。


OLEDropEffect 常数 (ComCtl32) (Readme)

常数	值	描述
cc2OLEDropManual	1	仅在编程控制下接受 OLE 拖/放。
cc2OLEDropNone	0	不接受 OLE 拖/放操作。


VBComponents 属性 (Readme)

返回工程中包含的部件的集合。

语法

object.VBComponents

VBComponents 属性的语法有这些部分：

部分	描述
object	对象表达式，其值是“应用于”列表中的一个对象。
说明

使用 VBComponents 集合访问、添加或删除工程中的部件。部件可以是窗体、模块或类。VBComponents 集合是一个标准集合，它可以用在 For�Each 块中。

可以使用 Parent 属性返回 VBComponents 集合所在的工程。

在 VBA 中，可以用 Import 方法从文件到工程添加一个部件。


VBNewProjects 集合 (Readme)

代表开发环境中所有的新工程。

语法

VBNewProjects

说明

使用 VBNewProjects 集合在开发环境的一个实例中访问特定的工程。VBNewProjects 是一个标准集合，可以通过使用 For�Each 块进行迭代。


不能删除多行（DBGrid 控件）(ReadMe)

这个错误是当 SelBookmarks 集合包含不只一个书签时按下了删除键引起的。


标题文本太长（DBGrid 控件）(ReadMe)

这个错误是当 caption 属性或列的 heading 属性设置为长于 255 个字符的文本时发生的。


列未找到（DBGrid 控件）(ReadMe)

这个错误是当用一个无效的列名访问 columns 集合时发生的。


控件未做适当地初始化（DBGrid 控件）(ReadMe)

这个错误是在程序正常运行时网格的 hwnd 或 ICursor 已经破坏时发生的。


数据访问错误（DBGrid 控件）(ReadMe)

这是一个一般的 ICursor 错误。它是在访问数据源时数据源没有通过 ISupportErrorInfo 和 IErrorInfo 接口提供附加信息时发生的。


无效的书签（DBGrid 控件）(ReadMe)

这个错误是当设置需要书签的网格属性或集合而书签无效时引起的。


无效的列索引（DBGrid 控件）(ReadMe)

这个错误是当设置需要列索引的网格属性或集合而指定的索引无效时引起的。


无效的行号（DBGrid 控件）(ReadMe)

这个错误是当访问行属性而该行超出行的可视范围时引起的。


无效的选定行书签索引（DBGrid 控件）(ReadMe)

为 SelBookmarks 集合指定了无效的索引。


@0 属性的无效设置值（DBGrid 控件）(ReadMe)

试图把属性设置为一个对该属性无效的值。检查数据类型和值的范围。


无当前记录（DBGrid 控件）(ReadMe)

设置网格的 bookmark 属性而网格不能移到书签处（ICusor 移动失败）；或设置 editactive 属性而网格不能移到行（ICusor 移动失败）。


空（DBGrid 控件）(ReadMe)

“（空）”条目用作为那些没有用于浏览器信息的相关帮助上下文的项目的错误文本。正常情况下，这不会作为实际错误信息出现。


@0 事件内操作无效（DBGrid 控件）(ReadMe)

这个错误是当在网格的通知事件中试图对 data 控件进行非法操作时发生的；例如，试图在 AfterUpdate 事件中刷新 data 控件。


这种情况下属性不可用（DBGrid 控件）(ReadMe)

这个错误是当访问一个仅在网格的 Error 事件环境中可用的属性时引起的。例如，ErrorText 属性只能在 grid_Error() 中读取。


卷动参数超出范围（DBGrid 控件）(ReadMe)

这个错误是当设置 scroll 属性而列索引超出范围时引起的。


使用 WithEvents 关键字 (Readme)

WithEvents 关键字被解释为某些声明语句（Dim、Public 和 Private）的一部分。因此，为了使用语句，需要很好了解下面两个语句：

Event 语句

RaiseEvent 语句


Byte 和 String 类型的强制 (Readme)

在 basic 的许多早期版本中，字符串 (strings) 用来保持真正是字节数据的数组。而现在 Visual Basic 有了 Byte 数据类型，于是这就没有必要了。这样的字符串可以被赋予能调整大小的字节数组。同样，字节数组可以赋予可变长度的字符串。我们知道，类型之间的强制要求创建能影响性能的临时变量和数组。还有，在 Unicode 平台（所有 32－位操作系统）上，同一个字符串包含的字节数是非－Unicode（16－位操作系统）平台上的两倍。


CreateToolWindow 方法 (Readme)

创建新的、包含标明的 DocObject 的“工具”窗口。

语法

object.CreateToolWindow(AddInInst, ProgId, Caption, GuidPosition, DocObj) As Window

CreateToolWindow 方法的语法有这些部分：

部分	描述
object	必需的。其值为“应用于”列表框中的对象的对象表达式。
AddInInst	必需的。表示开发环境中的外接程序的 Addin。
ProgId	必需的。表示 ActiveX 文档对象的 progID 的 String。
Caption	必需的。包含窗口标题的 String。
GuidPosition	必需的。包含窗口的唯一标识符的 String。
DocObj	必需的。表示 ActiveX 文档对象的 Object。这个对象是在这个函数的调用中设置的。
说明

VBIDE.Windows 的成员。


DesignerID 属性 (Readme)

标明用 VBComponent 对象表示的设计器类型的只读属性。

说明

VBComponent 的成员。


FileName 方法 (Readme)

返回含有成组工程文件 (the group project file) 全限定路径的 String。

语法

object.FileName() As String

说明

VBProject 的成员。


InsertFile 方法 (Readme)

将文件中的代码插入代码模块。

语法

object.InsertFile(FileName As String)

FileName 参数表示的文件，含有要插入代码模块的代码。

说明

VBComponent 的成员。


LinkedWindows 属性 (Readme)

LinkedWindows 属性是访问者属性（即，该属性返回和属性名相同的类型的对象）。


Properties 属性 (Readme)

Properties 属性是访问者属性（即，该属性返回和属性名相同的类型的对象）。


References 属性 (Readme)

References 属性是访问者属性（即，该属性返回和属性名相同的类型的对象）。


执行 VBA Addin 模型的示例 (Readme)

用下列步骤执行 VBA Addin 模型的示例代码：

1.	启动 Visual Basic，在“新工程”对话框中选择 Addin 作为工程类型。

2.	在“工程资源管理器”中单击“连接类模块”来查看它的代码。

3.	在“编辑”菜单中选择“查找”，来搜索 OnConnection。这应当将光标放入 IDTExtensibility_OnConnection 过程中。

4.	在该过程中有 3 到 4 行的注释，建议下面的语句适合放置测试代码的断点。在建议的行上放置断点。

5.	将光标放入“立即”窗口，键入 AddToIni，然后按 Enter 键执行过程。（AddToIni 是 Addin.Bas 模块中的一个过程。）

6.	按 F5，使 Addin 进入运行模式。

7.	启动 Visual Basic 的另一个实例。在“初始”对话框中选择“缺省” (Standard Exe)。然后在“外接程序”菜单上选择“外接程序管理器”。

8.	在“可用外接程序”列表中选择“My Addin-In”。按“外接程序管理器”对话框中的“确认”按钮。在 Visual Basic 的第一个实例中 IDTExtensibility_OnConnection 被调用，执行在步骤 4 设置的断点处挂起。

9.	从“调试”菜单中用“跟踪”执行下面一行：
Debug.Print VBInst.FullName

10.	现在可以将 VBInst 作为这个示例代码的对象。在“立即”窗口执行该示例代码行之前，简单地用 Visual Basic 对象 VBInst 替换哑对象 Application.VBE。例如，可以将这示例
Print Application.VBE.VBProjects(1).VBComponents.Count
修改为：
Print VBInst.VBProjects(1).VBComponents.Count

在“立即”窗口中的较后面一行上按 Enter 键，则 VB 部件的数量即打印在下一行上。


回调过程中的错误 (Readme)

回调过程是程序内部的、Windows 可以调用的过程。为使 Windows 能够调用这个过程，可以在 API 调用中将对此过程的引用作为参数传递，API 调用以 AddressOf 操作符作为前缀。因为回调的调用者不在程序内部，回调过程中的错误不会传达到调用者，这很重要。可以在回调过程的开头放置 On Error Resume Next 语句来实现这一点。


保留的属性和方法名 (Readme)

下面的名称不能够用作属性或方法的名称，因为它们属于下一级的 IUnknown 和 IDispatch 接口：QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke。使用这些名称会引起编译错。


事件过程参数 (Readme)

声明事件参数就象声明过程参数一样。所不同的是：事件不能指定命名的参数、Optional 参数或 ParamArray 参数。事件没有返回值。


Mode 属性常数 (Readme)

在帮助中所列的扩展性 VBProject 对象的 Mode 属性的常数是错的。它们应当是：

vbext_vm_RunMode 应当是 vbext_vm_Run

vbext_vm_BreakMode 应当是 vbext_vm_Break。

vbext_vm_DesignMode 应当是 vbext_vm_Design。


WindowState 属性常数 (Readme)

在帮助中所列的扩展性 Window 对象的 WindowState 属性的常数是错的。它们应当是：

vbext_ws_Min 应当是 vbext_ws_Minimize。

vbext_ws_Max 应当是 vbext_ws_Maximize。


Option Base 对于 Array 函数 (Readme)

关于 Array 函数的帮助指出，Array 函数不受 Option Base 设置值的影响。这是不对的。状况是这样的：如果 Array 函数名被限定为 VBA.Array，则 Option Base 设置值被忽略。如果 Array 没有被限定，则 Option Base 设置值决定了数组的下界。


附加的 MsgBox 常数 (Readme)

MsgBox 函数支持下列新的常数：

vbMsgBoxHelpButton	16384	在消息框中添加“帮助”按钮
VbMsgBoxSetForeground	65536	指定消息框窗口为前景窗口
vbMsgBoxRight	524288	文本为右对齐
vbMsgBoxRtlReading	1048576	指定在希伯来系统和阿拉伯系统中，文本从右至左阅读


DateAdd 函数的更正 (Readme)

DateAdd 函数的返回值的格式由控制面板的设置值决定，不是由 date 参数中传递的格式决定。


附加的 VBA（语言）错误消息 (Readme)

下列错误消息出现在某些 VBA 帮助文件中，但可能其它文件中没有：

不能为指定的对象处理事件

不能处理这个对象的事件。

出乎预料的编译错

在编译期间发生全然出乎预料的错误时,该错误发生。

非法使用基类名

不能孤零地使用基类名。这个错误有下列原因和解决办法：

 	没有明确（或明朗化）正试图访问基类的缺省成员，就试图孤零地使用基类的名称。

把基类名放入圆括号，表示要访问其缺省成员。

 	在表达式中使用了基类名，但没有明确指定要访问的成员。

在基类名和要访问的成员之间用一个意义分明的符号（例如，惊叹号）。

 	在 Set 语句中使用了基类名，似乎该语句包含了对此类的引用。

用基类名检索示例中的引用，使用 GetObject。

非法事件名

用下划线将对象名和事件名连起来构成事件过程名。这个错误有下列原因和解决办法：

 	用下划线作为事件名的一部分。

从事件名中删掉下划线。

事件找不到

在 RaiseEvent 语句中指定的事件名必须和定义的事件相符。这个错误有下列原因和解决办法：

 	在 RaiseEvent 语句中指定了名称，但找不到事件定义。

保证事件名拼写正确。

附加的信息，请在问题中选择该项，并按 F1 键。

必须指定搜索字符串

在“对象浏览器”中搜索时必须输入字符串。这个错误有下列原因和解决办法：

 	在“对象浏览器”中开始搜索，但没有指定搜索文本。

输入搜索字符串。

不能显示指定的名称，因为它是隐藏的

有些名称存在于类型库中，但标为隐藏。这个错误有下列原因和解决办法：

 	指定的名称存在于类型库中，但标为隐藏。

通常不能查看隐藏的类型库成员。在对象浏览器上下文菜单中选择“显示隐藏成员”，使隐藏的成员可见。然后再查看该成员的信息。

不能跳到指定的类型，因为它在指定的库内，该库不是当前引用的

这个错误有下列原因和解决办法：

 	试图指定某库中的类型，该库不是工程内引用的。

通过“引用”对话框设置对该类型库的引用。

在 Enum 内非法

在枚举内部不是所有的类型都是合法的。这个错误有下列原因和解决办法：

 	试图指定某个字符串或某些其它非法类型作为 Enum 成员的值。

用于指定 Enum 成员的常数表达式必须是 Long 类型或者其它 Enum 类型。

这个部件不支持该事件集（错误号 459）

不是每一个部件都支持事件的客户吸收。这个错误有下列原因和解决办法：

试图和部件一起使用 WithEvents 变量，而该部件不是指定的事件集的事件源。例如，您可能正在吸收某对象的事件，然后又创建另一个 Implements 第一个对象的对象。虽然您可能认为您能够吸收来自已实现的对象的事件，然而这并不尽然，Implements 只能实现方法和属性的接口。

不能吸收不是事件源的部件的事件。


ClassName 属性 (ReadMe)

返回控件的类名称。

语法

object.ClassName

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


ContainedVBControls 属性 (ReadMe)

返回组件所包含控件的集合。

语法

object.ContainedVBControls

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


VBControls 属性 (ReadMe)

返回保存窗体中所有控件的集合。

语法

object.VBControls

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


rdoColumns 属性 (ReadMe)

保存所有存储 rdoColumn 对象。

语法

object.rdoColumns

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


rdoConnections 属性 (ReadMe)

保存所有 rdoEnvironment 对象中打开的 rdoConnection 对象。

语法

object.rdoConnections

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


rdoEnvironments 属性 (ReadMe)

保存 rdoEngine 对象中所有活动的 rdoEnvironment 对象。

语法

object.rdoEnvironments

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


rdoErrors 属性 (ReadMe)

保存所有存储 rdoError 对象。

语法

object.rdoErrors

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


rdoParameters 属性 (ReadMe)

保存 rdoQuery 中所有 rdoParameters 对象。

语法

object.rdoParameters

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


rdoQueries 属性 (ReadMe)

保存 rdoQuery 的所有 rdoQuery 对象。

语法

object.rdoQueries

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


rdoResultSets 属性 (ReadMe)

保存 rdoConnection 中所有打开的 rdoResultSet 对象。

语法

object.rdoResultSet

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


rdoTables 属性 (ReadMe)

保存数据库中所有 rdoTable 对象。

语法

object.rdoTables

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


对 AddToAddInToolbar 方法的实例代码的改动 (ReadMe)

在 AddToAddInToolbar 一行中遗漏了逗号。该行应为：

x.AddToAddInToolbar ("C:\VB5\MyAdd.DLL", _

"MyAddIn.Connect", "MyAddIn Title", True, True)


对外接程序设计考虑中的实例代码的改变 (ReadMe)

取得 TabOrder 应用实例的完整路径应为： \Vb\Samples\CompTool\AddIns\TabOrder.vbp.

取得 Guidgen 工具的完整路径应为：\Tools\Idgen\Guidgen.exe.


在用外接程序操作代码时的实例代码的改变 (ReadMe)

在该代码实例中，假定了在通用声明部分中有如下代码：Public vbi As VBIDE.VBE。


在用外接程序操作时实例代码的改变 (ReadMe)）

在该代码实例的 Clipboard.SetData 一行中遗漏了 LoadPicture 语句。该行应为：

Clipboard.SetData LoadPicture("C:\windows\circles.bmp")


在创建基本外接程序中的更正 (ReadMe)）

“创建基本外接程序”中的第四步，误将外接程序类模块的 Instancing 属性设置为 InSameProcess。实际上应该设置为 5 - MultiUse。


改变 LinkedWindows 集合 (ReadMe)

有关 LinkedWindows 集合章节的最后一句中，“...具有 ContainedWindows 集合”应改为“...具有 LinkedWindows 集合”。


在 OpenResultset LockType 的“方法”列表中误加入了 UpdateCriteria 常数 (ReadMe)

在使用 RDO 的 OpenResultset 方法时，通过 LockType 参数定位游标，然后用鼠标右键选中“List 属性和方法”，将列出 LockType 常数，其中还误将两个 UpdateCriteria 常数（rdCriteriaAllCols 和 rdCriteriaKey）同时列出。


未更新或删除行 (ReadMe)

在对结果集的动态游标使用相对移动方法（比如 MovePrevious、MoveNext 等）时，会得到错误信息“未更新或删除行”。

如果在使用动态游标的同时时，另一个用户删除了当前行集合窗口（即在客户机中缓存的行）的前一或后一行，就会发生这种情况。当向这些已经删除的行移动时，当前窗口中的某些行将会被恢复，这是由于需要得到这些行的行集合的大小。如果正处在结果集合的头部或尾部，可以看到由于没有足够的行来获得唯一的新行，而产生的数据重叠覆盖的现象。

将行集合的大小设置得小一些，对解决这个问题会有帮助。这样做会降低性能，但如果性能很重要的话，那么首先就不应该使用动态游标，因为与其它游标相比动态游标并不是最快的。

正是由于这一点，以及当删除了数据时，会产生错误信息的问题，建议您尽量避免使用动态游标，除非确实知到要做些什么。管理键集或静态游标要比动态游标要容易得多，客户方 (client-side) 的批处理静态 (batch static)，可能对几乎所有客户/服务器开发来说是最好的。


RDC 的 Validate 事件的帮助主题称 Actions 可以改变 (ReadMe)

RDC（Remote Data Control）的 Validate a Control“可以改变各种不同的 Move 方法和 AddNew 方法，它们之间可以任意交换（可以将任何 Move 改变为 AddNew，将任何 Move 改变为其它的 Move，或将 AddNew 改变为任何 Move）。试图将 AddNew 或某种 Move 事件的帮助主题称：改变为其它任何操作，都将被忽略或产

事实上这是不可能的。将操作改变为其它任何操作都将挂起原操作（如同将其设置为 rdActionCancel 一样）。


Copy 方法（可扩展性）(ReadMe)

将窗体中选定的控件复制到可捕获的错误误上。

语法

object.Copy

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


Cut 方法（扩展性）(ReadMe)

删除窗体中选中的控件。

语法

object.Cut

object 所在处代表对象表达式，其值为“应用于”列表中的对象。


外接程序常数值(ReadMe)

连接方式

常数	值	为“
vbext_cm_AfterStartup	0	指定外接程序的连接方式。
vbext_cm_Startup	1	外接程序在 IDE 启动时连接。
vbext_cm_External	2	外接程序由 Visual Basic 外部完成。
断开方式

常数	值	应用
vbext_dm_HostShutdown	0	当主机关闭时断开外接程序
vbext_dm_UserClosed	1	由用户断开外接程序。
代码窗格视图方式

常数	值	于”
vbext_cv_ProcedureView	0	以过程视图方式显式代码窗格。
vbext_cv_FullModuleView	1	以全模块视图方式显式代码窗格。
组件类型

常数	值	列表
vbext_ct_StdModule	1	该组件是标准模块。
vbext_ct_ClassModule	2	该组件是类模块。
vbext_ct_MSForm	3	该组件是窗体。
vbext_ct_ResFile	4	该组件是资源文件。
vbext_ct_VBForm	5	该组件是 Visual Basic 窗体。
vbext_ct_VBMDIForm	6	该组件是 MDI 窗体。
vbext_ct_PropPage	7	该组件是属性页。
vbext_ct_UserControl	8	该组件是 UserControl 对象。
vbext_ct_DocObject	9	该组件是用户文档。
vbext_ct_RelatedDocument	10	该组件是 RelatedDocument 对象。
vbext_ct_ActiveXDesigner	11	该组件是基类。
控件类型

常数	值	中的
vbext_ct_Light	1	轻 (Light-weight) 控件。
vbext_ct_Standard	2	标准控件。
vbext_ct_Container	3	容器控件。
文件类型

常数	值	对象
vbext_ft_Form	0	文件是窗体 (Form) 类型的。
vbext_ft_Module	1	文件是模块 (Module) 类型的。
vbext_ft_Class	2	文件是类 (Class) 类型的。
vbext_ft_Project	3	文件是工程 (Project) 类型的。
vbext_ft_Exe	4	文件是 .exe 类型的。
vbext_ft_Frx	5	文件是 .frx 类型的。
vbext_ft_Res	6	文件是资源类型的。
vbext_ft_UserControl	7	文件是 UserControl 类型的。
vbext_ft_PropertyPage	8	文件是 PropertyPage 类型的。
vbext_ft_DocObject	9	文件是 DocObject 类型的。
vbext_ft_Binary	10	文件是二进制 (Binary) 类型的。
vbext_ft_GroupProject	11	文件是 GroupProject 类型的。
vbext_ft_Designers	12	文件是 Designer 类型的。
成员类型

常数	值	描
vbext_mt_Method	1	成员是方法 (Method) 类型的。
vbext_mt_Property	2	成员是属性 (Property) 类型的。
vbext_mt_Variable	3	成员是变量 (Variable) 类型的。
vbext_mt_Event	4	成员是事件 (Event) 类型的。
vbext_mt_Const	5	成员是常数 (Const) 类型的。
工程类型

常数	值	述描
vbext_pk_Proc	0	指定除属性过程之外的所有过程。
vbext_pk_Let	1	指定将值赋给属性的过程。
vbext_pk_Set	2	指定对某个对象加以引用的过程。
vbext_pk_Get	3	指定返回某个属性的值的过程。
工程启动方式

常数	值	述描
vbext_psm_StandAlone	0	启动方式为独立方式。
vbext_psm_OleServer	1	启动方式为 ActiveX 组件。
工程类型

常数	值	述描
vbext_pt_StandardExe	0	工程是 standard .exe 工程。
vbext_pt_ActiveXExe	1	工程是 ActiveX .exe 工程。
vbext_pt_ActiveXDll	2	工程是 ActiveX DLL 工程。
vbext_pt_ActiveXControl	3	工程是 ActiveX 控件工程。
运行 (VBA) 方式

常数	值	述描
vbext_vm_Run	0	工程处于运行方式。
vbext_vm_Break	1	工程处于中断方式。
vbext_vm_Design	2	工程处于设计方式。
引用类型

常数	值	述描
vbext_rk_TypeLib	0	代表对类型库的引用。
vbext_rk_Project	1	代表对工程的引用。
作用域

常数	值	述描
vbext_Private	1	成员的作用域为私用 (private )。
vbext_Public	2	成员的作用域为公用 (public )。
vbext_Friend	3	成员的作用域为友类 (friend )。
启动对象

常数	值	述描
vbext_so_SubMain	0	指定该 Sub Main 为该工程的启动组件。（译者注：“组件”似应为“主过程”）
vbext_so_None	1	指定该工程无启动组件。
显示方式

常数	值	述描
vbext_dm_SDI	0	显示方式为单文档方式。
vbext_dm_MDI	1	显示方式为多文档方式。
窗口状态

常数	值	述描
vbext_ws_Normal	0	普通窗口状态。
vbext_ws_Minimize	1	窗口最小化为图标。
vbext_ws_Maximize	2	窗口被最大化（放大到其最大状态）。
窗口类型

常数	值	述描
vbext_wt_CodeWindow	0	该窗口是代码 (code) 窗口。
vbext_wt_Designer	1	该窗口是设计者 (designer) 窗口。
vbext_wt_Browser	2	该窗口是浏览器 (Browser) 窗口。
vbext_wt_Watch	3	该窗口是监视 (watch) 窗口。
vbext_wt_Locals	4	该窗口是本地 (locals) 窗口。
vbext_wt_Immediate	5	该窗口是立即 (Immediate) 窗口。
vbext_wt_ProjectWindow	6	该窗口是工程 (Project) 窗口。
vbext_wt_PropertyWindow	7	该窗口是属性 (Property) 窗口。
vbext_wt_Find	8	该窗口是搜索 (Search) 窗口。
vbext_wt_FindReplace	9	该窗口是替换 (Find and Replace) 窗口。
vbext_wt_Toolbox	10	该窗口是工具框 (Toolbox) 窗口。
vbext_wt_LinkedWindowFrame	11	该窗口是连接的窗框。
vbext_wt_MainWindow	12	该窗口是主 (main) 窗口。
vbext_wt_Preview	13	该窗口是预览 (preview) 窗口。
vbext_wt_ColorPalette	14	该窗口是调色板 (color palette) 窗口。
vbext_wt_ToolWindow	15	该窗口是工具 (Tool) 窗口。
菜单快捷键

常数	值	述描
vbextMenuShortcutCtrlA	1	用户定义的快捷键。
VbextMenuShortcutCtrlB	2	用户定义的快捷键。
VbextMenuShortcutCtrlC	3	用户定义的快捷键。
VbextMenuShortcutCtrlD	4	用户定义的快捷键。
VbextMenuShortcutCtrlE	5	用户定义的快捷键。
vbextMenuShortcutCtrlF	6	用户定义的快捷键。
vbextMenuShortcutCtrlG	7	用户定义的快捷键。
vbextMenuShortcutCtrlH	8	用户定义的快捷键。
vbextMenuShortcutCtrlI	9	用户定义的快捷键。
vbextMenuShortcutCtrlJ	10	用户定义的快捷键。
vbextMenuShortcutCtrlK	11	用户定义的快捷键。
vbextMenuShortcutCtrlL	12	用户定义的快捷键。
vbextMenuShortcutCtrlM	13	用户定义的快捷键。
vbextMenuShortcutCtrlN	14	用户定义的快捷键。
vbextMenuShortcutCtrlO	15	用户定义的快捷键。
vbextMenuShortcutCtrlP	16	用户定义的快捷键。
vbextMenuShortcutCtrlQ	17	用户定义的快捷键。
vbextMenuShortcutCtrlR	18	用户定义的快捷键。
vbextMenuShortcutCtrlS	19	用户定义的快捷键。
vbextMenuShortcutCtrlT	20	用户定义的快捷键。
vbextMenuShortcutCtrlU	21	用户定义的快捷键。
vbextMenuShortcutCtrlV	22	用户定义的快捷键。
vbextMenuShortcutCtrlW	23	用户定义的快捷键。
vbextMenuShortcutCtrlX	24	用户定义的快捷键。
vbextMenuShortcutCtrlY	25	用户定义的快捷键。
vbextMenuShortcutCtrlZ	26	用户定义的快捷键。
vbextMenuShortcutCtrlF1	39	用户定义的快捷键。
vbextMenuShortcutCtrlF2	40	用户定义的快捷键。
vbextMenuShortcutCtrlF3	41	用户定义的快捷键。
vbextMenuShortcutCtrlF4	42	用户定义的快捷键。
vbextMenuShortcutCtrlF5	43	用户定义的快捷键。
vbextMenuShortcutCtrlF6	44	用户定义的快捷键。
vbextMenuShortcutCtrlF7	45	用户定义的快捷键。
vbextMenuShortcutCtrlF8	46	用户定义的快捷键。
vbextMenuShortcutCtrlF9	47	用户定义的快捷键。
vbextMenuShortcutCtrlF10	48	用户定义的快捷键。
vbextMenuShortcutCtrlF11	49	用户定义的快捷键。
vbextMenuShortcutCtrlF12	50	用户定义的快捷键。
vbextMenuShortcutShiftF1	51	用户定义的快捷键。
vbextMenuShortcutShiftF2	52	用户定义的快捷键。
vbextMenuShortcutShiftF3	53	用户定义的快捷键。
vbextMenuShortcutShiftF4	54	用户定义的快捷键。
vbextMenuShortcutShiftF5	55	用户定义的快捷键。
vbextMenuShortcutShiftF6	56	用户定义的快捷键。
vbextMenuShortcutShiftF7	57	用户定义的快捷键。
vbextMenuShortcutShiftF8	58	用户定义的快捷键。
vbextMenuShortcutShiftF9	59	用户定义的快捷键。
vbextMenuShortcutShiftF10	60	用户定义的快捷键。
vbextMenuShortcutShiftF11	61	用户定义的快捷键。
vbextMenuShortcutShiftF12	62	用户定义的快捷键。
vbextMenuShortcutShiftDel	78	用户定义的快捷键。
vbextMenuShortcutShiftIns	76	用户定义的快捷键。
vbextMenuShortcutDel	77	用户定义的快捷键。
vbextMenuShortcutCtrlIns	75	用户定义的快捷键。
vbextMenuShortcutAltBksp	79	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF1	51	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF2	52	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF3	53	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF4	54	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF5	55	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF6	56	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF7	57	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF8	58	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF9	59	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF10	60	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF11	61	用户定义的快捷键。
vbextMenuShortcutCtrlShiftF12	62	用户定义的快捷键。
源代码控制

常数	值	述描
vbextSCCStatusNotControlled	0	文件不在源代码控制之下。
VbextSCCStatusControlled	1	文件在源代码控制之下。
VbextSCCStatusCheckedOut	2	文件被交付给当前用户。
VbextSCCStatusOutOther	4	文件被交付给其他用户。
VbextSCCStatusOutOfDate	32	文件不是最新的。
vbextSCCStatusShared	512	文件被多个工程分享。


避免动态游标重叠述(ReadMe)

如果在使用动态游标的同时，另一个用户删除了当前行集合窗口（即在客户机中缓存的行）的前一或后一行，就会得到出错信息。当向这些已经删除的行移动时，当前窗口中的某些行将会被恢复，这是由于需要得到这些行的行集合的大小。如果正处在结果集合的头部或尾部，可以看到由于没有足够的行来获得唯一的新行，而产生的数据重叠覆盖的现象。

将行集合的大小设置得小一些，对解决这个问题会有帮助。这样做会降低性能，但如果性能很重要的话，那么首先就不应该使用动态游标，因为与其它游标相比动态游标并不是最快的。

正是由于这一点，以及当删除了数据时，会产生错误信息的问题，建议您尽量避免使用动态游标，除非确实知到要做些什么。管理键集或静态游标要比动态游标要容易得多，客户方 (client-side) 的批处理静态 (batch static)，可能对几乎所有客户/服务器开发来说是最好的。


“用立即窗口测试过程”主题的错误 (ReadMe)

在《程序员指南》的第十三章的“用立即窗口测试过程”主题中，文档错误地声明：“如果 Option Explicit 有效的话，任何在立即窗口中键入的变量都必须已经在当前范围内声明。”Option Explicit 语句对在立即窗口中键入的变量无效。但是，要注意任何在立即窗口中键入的变量，其未被先前声明为特定类型的，将被看作为 Variant。


在“窗体卸载”示例代码中出现编译错误 (ReadMe)

在《程序员指南》的第六章的“再论窗体”中，示例代码有误并且如果复制到工程中将引起编译错误。

错误的代码是：

Private Sub Form_Unload()

Dim i As Integer

'循环遍历 forms 集合并卸载

'每个窗体。

For i = 0 To Forms.Count— 1

Unload Forms(i)

Next

End Sub

在本例中，Form_Unload 声明的 �Cancel as Integer� 参数遗漏了；并且窗体必须以相反的顺序卸载以防止“下标超界”错误。

正确的代码是：

Private Sub Form_Unload (Cancel As Integer)

Dim i As Integer

'循环遍历 forms 集合并卸载

'每个窗体。

For i = Forms.Count— 1 To 0 Step -1

Unload Forms(i)

Next

End Sub


遗漏文档：数值提示和书签 (ReadMe)

文档忘记了提及 VB5 的两个新特征：立即窗口的数值提示和代码编辑器的书签。

数值提示与工具提示类似，只不过是在代码窗口中在中断模式下当鼠标保持在变量或对象属性上时显示的是当前值。数值提示的显示仅限于当前范围内的变量和对象。

数值提示在立即窗口的中断模式下也是可用的。不像代码编辑器，如果提供了完全的对象名称立即窗口将显示对象属性的值，而忽略是否在范围内。例如，数值提示将总是显示 Form1.Text1.Width 的值，而不显示 Text1.Width 的值，除非 Text1 处在当前范围。

书签是代码编辑器的新特征，它可以用来标记代码行，因此以后就可以容易地回到这些行上。切换书签以及定位已存在书签的命令可以用“编辑”、“书签”菜单项，或用“编辑”工具栏。


打印联机手册 (ReadMe)

可以从联机手册中使用“文件”菜单的“打印”（打印单个主题），或把主题添加到记事本上（打印多个主题），来打印主题。用记事本打印的主题不包括主题标题。

打印多个主题（包括它们的标题）的更简便的方法是使用在 Visual Basic CD-ROM 上的 Tools 目录中提供的 Word Viewer 和 Word 文档。


Palette 属性— 附加信息 (ReadMe)

联机帮助中“Palette 属性”主题声明“可以使用 .dib、.gif 或 .pal 文件以及 .bmp 文件设置调色板。”这是不正确的。仅有 .dib. .gif 和 .bmp 文件才能赋值给 Palette 属性。用 .pal 文件赋值将引起运行时错误 481：“无效的图片”。


使用相对调色板颜色 (ReadMe)

当为 256 色显示做设计时，有些颜色可能出现抖动。这可能使文本和其他图形元素难于阅读。通过指定相对调色板颜色，Visual Basic 将在 256 色显示上显示最接近的无抖动的近似值，而在高颜色深度时仍显示确切的颜色。

为了强制 Visual Basic 对一给定的属性使用最接近的实心色，而不用抖动色，在颜色属性的高位字节放上 2。例如，为了强制窗体背景为实心的亮橘黄色，可以使用下面的代码：

Private Function PaletteRGB(RGB As Long) As Long

PaletteRGB = &H02000000 Or RGB

End Function

如果在设计时设置：

Form1.BackColor = &H00C0E0FF& 	'抖动的亮橘黄色

并把下面的代码添加到 Form_Click 事件：

Private Sub Form_Click()

Form1.BackColor = PaletteRGB(Form1.BackColor)

End Sub

在运行时，点取窗体，背景色将变为实心的，而不是抖动的、有阴影的。它正在使用的是来自半调调色板的最接近的颜色。在颜色深度大于 256 色的系统上运行，将看不到这个效果。


使用对象编程— 代码示例中的错误 (ReadMe)

在“使用对象编程”的“使属性过程为您工作”中，在示范成对的属性过程的参数必须匹配的代码示例中有一处错误。

它声明：

Property Get 声明必须使用具有相同名称和数据类型的参数作为 Property Let 过程的参数。

Public Property Let Things(ByVal X As Integer�

这行代码的“Let”应替换为“Get”。


运行时设置组合框的样式 (ReadMe)

组合框的样式是只读的，只能在设计时设置。《程序员指南》的第七章中错误地声明组合框的样式可以在设计时和运行时设置。如果试图在运行时设置组合框的样式，就会收到一条错误信息。


安装向导正在查找“User”或“Kernel” (ReadMe)

如果创建包含条件编译（例如，"#If Win 16 Then"）和 16 位声明的应用程序时，安装向导将用“定位 KERNEL”或“定位 USER”来询问。这在使用下面的声明时出现：

Declare Function GetVersion16 Lib "Kernel" Alias "GetVersion" () As Long

为了防止这种情况，将声明从“Kernel”改为“Kernel.dll”。这就导致下面的行：

Declare Function GetVersion16 Lib "Kernel.dll" Alias "GetVersion" () As Long


当在模式窗体中重复使用 Hide 方法时失败 (ReadMe)

当关闭一个已经从另一个模式窗体中打开的模式窗体时，下面的代码在 Visual Basic 的早期版本中是可以工作的：

Me.Hide

Me.Hide '现在，这将引起错误。

在 Visual Basic 5.0 中，现在这些代码将在第二个“Me.Hide”语句上失败。像下面显示的那样，可以用“Me.Visible = False”替换“Me.Hide”：

Me.Visible = False

Me.Visible = False '没有错误发生。


应用程序性能探测器局限于 32 个参数文件 (Readme)

应用程序性能探测器（APE）的当前版本，当运行 Windows 95 时，最多局限于 32 个参数文件。这个限制很明显是由于 Windows 95 的 .INI 文件大小的限制。参数文件保存在 .INI 文件中，它可以用“文件”菜单下的“设置参数文件集合”命令指定。可以通过点取“参数”文件组合框确定当前集合中包含多少个参数文件。这个下拉列表包含了当前集合中所有的参数文件。

为了防止丢失数据，当集合接近 32 时，开始一个新的参数文件集合。

创建一个新的参数文件集合

1	在“文件”菜单上，点取“设置参数文件集合”。

2	在名为“选择参数文件集合”的对话框中，点取“文件名”框并输入一个新参数文件集合的名称。

3	点取“保存”。


Internet 传输控件：在设置 Password 和 UserName 前设置 URL (ReadMe)

当使用 Internet 传输控件时，在设置 Password 和 UserName 属性前设置 URL 属性。当前，如果最后设置 URL 属性，UserName 和 Password 属性将被设置为 ""。这些代码将工作正常：

Inet1.URL = "FTP://ftp.myCompany.com"

Inet1.Password = "I(3Lei#4"

Inet1.UserName = "Jonne Smythe"

Text1.Text = Inet1.OpenURL

可是，下面的代码将失败：

Inet1.Password = "I(3Lei#4"

Inet1.UserName = "Jonne Smythe"

Inet1.URL = "FTP://ftp.myCompany.com" 'PassWord 和

' Username 清除掉。

Text1.Text = Inet1.OpenURL


如果 UserControl 在上面，就不要在工程间共享属性页 (ReadMe)

虽然能在属性页上放置 UserControl，并且能在工程（在同一个工程组中）间共享那个属性页，但是将不能更新属性页上的控件。由于这个原因，应该避免共享那些其上面有 UserControl 对象的属性页。发生这种现象的特别说明显示如下：

共享具有 UserControl 的属性页

1	在“文件”菜单上，点取“新建工程”。

2	双击 ActiveX 控件图标。

3	在“工程”菜单上，点取“添加属性页”。

4	双击属性页图标将其加入到工程中。

5	重复步骤 2-4 添加第二个控件工程和属性页到工程组中。

6	在“文件”菜单上，点取“保存工程组”。当提示覆盖控件工程和属性页时，点取“确定”。

7	除 Project2 的 PropertyPage1 设计器之外，关闭工程组中所有的设计器。

8	在“工具箱”上，双击 UserControl1 将其添加到 PropertyPage。

如果试图关闭属性页设计器，将得到一个错误。进而修改 UserControl 对象的努力也将失败。


当用在外接程序中时 ListView 工具提示引起 ZOrder 问题 (ReadMe)

当使用 ListView 控件作为外接程序的一部分时，可能会由工具提示引起一些 Z-顺序问题。为了表明这些问题，下列条件必须全为真：

•	ListView 控件用于外接程序中。

•	ListView 控件的 View 属性设置为“大图标”。

•	工具提示足够长以至发生折行。

当这个问题发生后，只能通过关闭 Visual Basic 来恢复。


卸装 VB4 后无法运行 Access95 (ReadMe)

如果在安装 Access 95 后卸载 Visual Basic version 4，Access 将无法运行。这个问题在 Visual Basic ionvers 5 中已不会再出现。要使 Access 能够继续运行，可以再次注册旧版本的 DAO (DAO3032.DLL)。

使用 REGSVR32.EXE 再次注册 DAO。REGSVR32.EXE 通常可以在 \tools\regutils 文件夹中找到，DAO3032.DLL 通常在 \program files\common files\microsoft shared\dao 文件夹中。再次注册 DAO 的命令行为：

cd "c:\program files\common files\microsoft shared\dao"

regsvr32 dao3032.dll


Microsoft Repository 的安装 (ReadMe)

要安装 Microsoft Repository 1.0，那么在安装 Visual Basic 企业版的时候，必须使用自定义安装，并选中 Microsoft Repository 复选框。在缺省情况下，该复选框未被选中。

要安装 Microsoft Repository 则需要同时安装数据访问组件。在缺省情况下，数据访问组件复选框是选中的。然而，如果没有选中该复选框，即未安装数据访问组件，而安装了 Microsoft Repository，则在运行 Visual Basic 5.0 时会产生错误信息：

“打开 Microsoft Repository 数据库时产生错误。由系统错误 126 导致指定驱动程序不能加载（Microsoft Access 驱动程序 (*.MDB)）。Visual Basic 外接程序 Microsoft Repository 关闭。”

要解决这个问题，请安装数据访问组件。


Visual Basic Beta 版废弃的文件 (ReadMe)

如果在 Visual Basic 5.0 beta 版的基础上安装本版本的 Visual Basic 5.0，会留下一些已经废弃不用了的 Microsoft Repository 文件，可以将它们删除以节省空间。

从安装 Visual Basic 5.0 的目录出发，查找并删除这些文件：

REPOSTRY\README.WRI

REPOSTRY\BIN\BROWSER.EXE

在 Windows 的系统目录中，查找并删除这些文件：

REPAUTO.CNT

REPAUTO.HLP

REPCOM.CNT

REPCOM.HLP


Repository API 的变化 (ReadMe)

•	TXN_QUERY_TIMEOUT 是一个新的选项，通过 IRepositoryTransaction 界面的 SetOption 和 GetOption 方法可以设置和获得该值。该选项的值，指定了未完成的查询在被取消前能够执行的秒数。该选项的缺省值为 120 秒。

•	TXN_DBMS_READONLY 是一个新的选项，通过 IRepositoryTransaction 界面的 GetOption 方法可以获得该值。该选项的值指定了是否能够对当前打开的 repository 数据库进行修改。  如果该选项的值被设置为 0，就能够对数据库进行修改。如果该值非 0，就不能对该数据库进行修改。

•	批注属性的最长长度是 220 个字符，而不是 255 个字符。常量 PROPVALSIZE 确定了这个限制。

•	IRepositoryItem 接口的 Interface 方法，可以用来获得 Automation 对象暴露出的另一界面的指针。该方法接受三种不同类型的输入参数，以确定获取哪个界面的指针：界面定义对象的对象标识符（repository 对象标识符），界面的界面标识符 (GUID)，或者界面的名称（字符串）。

•	在 IRepositoryODBC 界面中添加了一个新的方法 (ExecuteQuery)。ExecuteQuery 方法使用如下语法：

HRESULT ExecuteQuery(BSTR QueryString, IObjectCol **ppICol)

QueryString 是包含 SQL 查询（或者存储过程名称）的字符串，该查询将在打开的 repository 数据库中执行。该SQL 查询指定返回的列，必须由内部标识符列 (IntID)，或内部标识符列和类型标识符列 (TypeID) 构成。该查询的结果作为对象集合返回，并且 IObjectCol 界面的指针通过 *ppICol 输出参数返回给调用者。

•	IObjectCol 界面的 get_Item 方法不支持通过名称获取对象。ITargetObjectCol 和 IRelationshipCol 界面的 get_Item 方法支持通过名称获取对象，但只适用于对象集合是名称集合的情况。名称并不要求具有唯一性。

•	赋给工程的名称根据 IMpoProjectItemContainer 界面 Contents 集合的命名关系作了修饰，以确保在所有 Visual Basic 工程的集合中该名称是唯一的。该修饰遵循如下原则：

•	如果工程文件是网络文件，则该文件的 UNC 名称将作为该工程的名称。

•	如果工程文件是本地文件，则字符串 [computerName]filename 将作为该工程的名称。

•	如果该工程尚未保存过，则字符串 [computerName]~processId~projectName 将作为该工程的名称。

IMpoProjectItem 界面的 FileName 属性中保存了工程未加修饰的名称。

•	IReposProperties 界面是用来访问 repository 属性的从属界面，这些属性附加在从 IRepositoryDispatch 派生出的所有界面中。作为一个从属界面，它只能通过 IReposProperties 界面的 get_Properties 方法获得界面指针。在该界面中支持一个新的方法 (get_Type)。get_Type 方法具有如下语法：

HRESULT get_Type(VARIANT *psTypeID)

用 get_Type 方法可以获取从 IRepositoryDispatch 继承基本行为的界面的类型，也就是说它能够返回与派生界面定义对象一致的对象定义。


Repository 的安装 (ReadMe)

Microsoft Repository 提供了一个基本的浏览器，该浏览器使用户能够浏览 repository 数据库的目录。该浏览器名为 REPBROWS.EXE，它可以在安装 Visual Basic 5.0 的目录的 REPOSTRY\BIN 子目录下找到。REPBROWS.EXE 接受四个可选的命令行参数。它们是：

Access=filename;
DSN=dataSourceName;
UID=userID;
PWD=password;

用适当的值代替斜体的项目。在每个参数的末尾要求有分号。


Repository Database 限制 (ReadMe)

Microsoft Repository 1.0 可以使用 Jet 或 SQL 服务器来管理 repository 数据库。它受到如下限制：

•	如果使用 SQL 服务器，则其版本必须是 6.5 或以上。

如果使用 Jet，则必须注意避免在一次事务中访问大量的数据。Jet 引擎使用了内存高速缓冲区以加速查询的执行。该高速缓冲区在一次事务中会不断地变大，直到执行了 Commit 或 Abort 。如果 repository 应用在一次事务（以便在获取数据时，不受其它进程未提交的改变的影响）中访问大量的数据，则高速缓冲区就会大到足以使应用执行失败。为避免出现这种情况，可以分阶段地提交事务，即使它是一个只读的事务。


在 NT 4.0 中安装了 FastFind 后 VB 安装失败 (ReadMe)

在运行着 Windows NT 4.0 的机器上，如果使用了 Microsoft Office 97 的 FastFind 特性，那么在安装 Visual Basic 时，可能会无法注册 Msjet35.dll。这将导致安装失败。

暂时取消或去掉 FastFind，就可以使安装成功完成。


ShowTips 属性是只读的 (ReadMe)

该属性的正确语法应为：

object.ShowTips

帮助主题中的语法错误地指出该值可以在运行时设置。


在安装之前从系统中删除 MV141KN.OCX (ReadMe)

如果您是 VB5 beta 版的用户，那么请在安装发行的产品之前，从系统中删除 MV141KN.OCX。


使用 ODBCDirect 时不能将 QueryDef 对象的名称传递给 OpenRecordset 方法 (ReadMe)

在使用 ODBCDirect 时，不能由 QueryDef 方法对象的名称来打开 Recordset 对象。而应该直接通过 QueryDef 对象来执行 OpenRecordset 方法。这是因为 ODBCDirect 中的 QueryDef 对象与 Microsoft Jet 数据库中的不同，它们不是永久性的对象。


不能通过记录集的 Properties 集合读取 BatchCollisionCount 属性 (ReadMe)

记录集的Properties 集合列出了名为 "BatchCollisionsCount" 的属性。而该属性的名称实际上应为 "BatchCollisionCount"。如果试图通过 Properties 属性读取该属性，将会得到错误“属性未找到”。读取该属性的唯一办法是直接读取，比如用 MyRS.BatchCollisionCount。


dbFailOnError 不再回卷事务 (ReadMe)

在先前版本的数据访问对象 (DAO) 中，执行 SQL 语句时，在内部会被当作事务进行处理。如果执行某个语句时设置了 dbFailOnError 标志，而查询失败了，该操作会被回卷。由于性能上的原因，SQL 语句不再作为事务处理了。因此，如果 Microsoft Access 中的查询失败，就会出现不完整的操作。如果认为有可能出现错误，那么必须用 BeginTrans 和 CommitTrans 方法显式地在语句中使用事务。不过要注意显式的事务会降低查询的执行效率。


ODBCDirect: GetRows 错误 40035 (ReadMe)

不应该对长值字段使用 GetRows 方法。如果对含有长值字段（Memo 或 Long Binary）的 ODBCDirect 记录集对象使用了 GetRows 方法，那么在结果数组中原应为的长值字段的地方将出现错误变体型。如果这时读取数组数据的值，将产生 40035 号错误，且数据的类型会是变体型。


RegisterDatabase 将服务器参数截断为 31 个字符 (ReadMe)

在调用 RegisterDatabase 时，如果服务器参数的长度超过了 31 个字符，将被截断。解决该问题的办法，是将注册表中的服务器的名称改为较短的值。


在 OLE 自动化主机应用中使用早期的 3.5 版 DAO (ReadMe)

3.5 版的数据访问对象 (DAO) 被设计用来与 5.0 版的应用程序 Visual Basic 配合工作。虽然在 Office 95 或 4.0 和更早版本的 Visual Basic 中可能已经有 DAO 3.5，但是 Office 95 或 4.0 和更早版本 Visual Basic 中的 DAO 3.5 对 5.0 版并不适用。


Repository 的多线程限制 (ReadMe)

在编写多线程的 repository 应用时，请注意应用各线程对 repository 数据库的提交操作之间的同步。特别的，必须同步使用下面的 C++ 方法：

•	IRelationshipCol::Count

•	IClassDef::ObjectInstances

•	IInterfaceDef::ObjectInstances

•	IRepositoryODBC::ExecuteQuery


如果在 Visual Basic Beta 版中使用 Microsoft Repository (ReadMe)

•	如果在 Visual Basic 5.0 beta 版的基础上安装本版本的 Visual Basic 5.0，会留下一些废弃不用了的 Microsoft Repository 文件，可以将它们删除以节省空间。

从安装 Visual Basic 5.0 的目录出发，查找并删除这些文件：

REPOSTRY\README.WRI

REPOSTRY\BIN\BROWSER.EXE

在 Windows 的系统目录中，查找并删除这些文件：

REPAUTO.CNT

REPAUTO.HLP

REPCOM.CNT

REPCOM.HLP

•	beta 版的 repository 数据库已经不再有效。如果继续使用 beta 版的 Microsoft Repository，那么必须删除旧版本的 repository 数据库。在 Windows 目录的 MSAPPS\REPOSTRY 目录下，查找并删除这个文件：

REPOSTRY.MDB

如果在安装 5.0 版的 Visual Basic 之前删除了该文件，并且选择安装了 Microsoft Repository，那么在安装过程中会重新创建该文件。如果在安装 5.0 版的 Visual Basic 之后删除该文件，并且已经选择安装了 Microsoft Repository，那么再次启动 5.0 版的 Visual Basic 时该文件会被重新创建。在这种情况下，可以发现 Visual Basic 启动耗时会较长。


对 RDC 的 Resultset 赋值不更新绑定的控件 (ReadMe)

将控件绑定到 RemoteData 控件 (RDC) 的结果集时，在该控件中不会自动显示该结果集。通过下面的步骤，可以看到这种情况：

1	启动 Visual Basic 并打开标准 EXE 工程。

2	引用 RDC。

3	在窗体中放置 RDC。

4	在窗体放置 TextBox 控件。

5	设置 TextBox 的如下属性：

    DataSource: MSRDC1

    DataField: au_lname

6	在窗体中放置 CommandButton 控件，并在其 Click 事件中添加如下代码：

  Dim cn As New rdoConnection

  cn.Connect = _

   "dsn=pinkpearl;database=rdobugs;uid=rdo;pwd="

  cn.EstablishConnection

  Set MSRDC1.Resultset = cn.OpenResultset("select * _

   from authors]")

7	运行该工程 (F5)。

8	单击该CommandButton。

可以看到被绑定的控件并没有被置入数据。必须使用 MSRDC1.Refresh 命令才能在绑定控件中置入数据。使用“新命”令时，服务器将会重新发送整个结果集。在某些情况下，这将花费较长的时间。

解决方案：

要解决这个问题，可以在代码中设置了结果集之后，设置绑定控件的 datafield。比如在

Set MSRDC1.Resultset = cn.OpenResultset("select * _

 from authors]")

之后可以添加

Text1.DataField = "au_lname"

这样就强制绑定管理器设置并更新绑定，即将数据置入绑定控件中。


不能对 RemoteData 控件的 Resultset 赋值 (ReadMe)

在试图将仅向前的 resultset 赋给 RemoteData 控件 (RDC) 时，会得到“非法对象”错误。通过如下步骤，可以看到这种情况：

1	启动Visual Basic。

2	在 Form1中放置 RemoteData 控件。

3	通过“工程”菜单中的“引用”命令添加引用到 RDO。

4	在 Form_Load 事件中添加如下代码：

Dim x as new rdoConnection

Dim y as rdoQuery

x.Connect = "DSN=Union;UID=rdo;PWD="

x.EstablishConnection

Set y = x.CreateQuery("Query1", "SELECT * FROM _

    authors")

x.Query1

   '下一行将产生“非法对象”错误

Set MSRDC1.Resultset = x.LastQueryResults

5	按下 F5。

产生该错误的原因是将不能赋给 RDC 的仅向前的结果集赋给了 RDC。如果要将结果集赋给 RDC，则必须是键集或静态。比如：

Dim x As New rdoConnection

Dim y As rdoQuery

x.Connect = "DSN=Union;database=rdobugs;UID=rdo;PWD="

x.EstablishConnection

Set y = x.CreateQuery("Query1", "SELECT * FROM _

 authors")

y.CursorType = rdOpenKeyset

y.LockType = rdConcurRowVer

x.Query1

Set MSRDC1.Resultset = x.LastQueryResults


存在 UserDocument 对象和设计者时切换文件夹会产生 GPF (ReadMe)

如果创建 ActiveX EXE 工程，并在其中加入 UserDocument 对象，以及 ActiveX 设计者，然后改变“工程”窗口中文件夹的属性，则“工程”窗口中 UserDocument 的引用将消失。

在很多情况下，这将引起一般保护错误 (GPF)。这是因为 Visual Basic 在“工程”窗口中查找工程项目以便保存。如果切换了文件夹，然后试图保存该工程或关闭 Visual Basic，则 Visual Basic 认为在工程窗口中应存在的某个工程项目，比如 UserDocument 对象，从窗口中消失了，将产生 GPF。


IStudio/ActiveX 和 ScriptPad 不能改变具有 VB 创建的 Font 属性的字体 (ReadMe)

如果在 Visual Basic 中创建 Font 属性，然后试图用 ScriptPad 或 Istudio 通过它来改变字体，那么会发现字体并没有改变。通过如下步骤，可以看到这种情况：

1	启动 Visual Basic，并创建新的 ActiveX 控件工程。

2	用控件界面向导创建 Font 属性。（将其影象为 UserControl.Font）

3	在 WriteProperties 事件中添加 On Error Resume Next。

4	确保 Font 属性的 ProcID 被设置为“Font”。

5	编译 ActiveX 控件。

6	启动 ScriptPad 或 Istudio。

7	将该控件放置在 HTML 页中。

8	改变属性表中的显示字体。

9	关闭设计者。

可以看到字体并没有改变。

出现该问题的原因是 WriteProperties 事件：

Call PropBag.WriteProperty("Font", UserControl.Font, _

 Ambient.Font)

没有写任何字体信息。这是由于 Font 对象等价于 Ambient.Font，如下面的代码所示：

MsgBox IIF(Font IS Ambient.Font, "The Font object is _

identical to Ambient.Font", "Different Objects")

下面的代码演示了该问题：

'MappingInfo=UserControl,UserControl,-1,Font

Public Property Get Font() As Font

    Set Font = UserControl.Font

End Property

Public Property Set Font(ByVal New_Font As Font)

    Set UserControl.Font = New_Font

    PropertyChanged "Font"

End Property

'初始化 UserControl 的属性

Private Sub UserControl_InitProperties()

    Set Font = Ambient.Font

End Sub

'装载属性值

Private Sub UserControl_ReadProperties(PropBag As _

 PropertyBag)

    Set Font = PropBag.ReadProperty("Font", _

 Ambient.Font)

End Sub

'写回属性值

Private Sub UserControl_WriteProperties(PropBag As _

 PropertyBag)

    Call PropBag.WriteProperty("Font", Font, _

 Ambient.Font)

End Sub

UserControl_InitProperties 将 font 设置为 ambient.font。所以在 ActiveX 控件项目属性表中设置属性时，不是创建新的 Font 对象并设置它（如属性浏览器那样），而是向已有的 Font 对象中添加新的值。这就意味着该属性改变时没有调用 Set/Let，而只调用了 Get。

解决方案：

要解决这个问题，可以将 UserControl_InitProperties 中的代码由：

Set Font = Ambient.Font

改为：

Set Font.Name = Ambient.Font.Name

Set Font.Size = Ambient.Font.Size

（等等）


PropertyPage 对象不支持 Activate 和 Deactivate 事件 (ReadMe)

在 Activate 和 Deactivate 事件的“应用于”列表中，误加了 PropertyPage 对象。


Visual Basic 5.0 的双向特性 (ReadMe)

Visual Basic 是支持双向特性（也称为 "BiDi"）的，但在产品包和其它印刷的文档中都没有提到这一特性。仅在 32 位双向平台单独的帮助文件中，才有有关该特性的联机文档。

“双向”是说明软件产品支持阿拉伯文或其它由右向左书写的文字的普通术语。更特别的，双向特性指的是，产品具有同时处理、显示由左向右和由右向左书写文字文本的能力。例如，显示同时含有英文单词和阿拉伯文单词的句子，就需要具有双向的功能。

Microsoft Visual Basic 5.0 具有创建、运行完全支持双向文字能力的 Windows 应用的基本特性。然而，只有在双向的 32 位 Microsoft Windows 环境中安装 Microsoft Visual Basic 5.0 才具有该特性。比如在阿拉伯文 Microsoft Windows 95 中就具有该特性。同样其它双向的 32 位 Microsoft Windows 环境中也具有该特性。

为提供创建具有双向特性对象的简单机构，在窗体、控件和 Visual Basic 对象中都添加了 RightToLeft 属性。虽然每套 Microsoft Visual Basic 5.0 中都有 RightToLeft，但是只有当 Microsoft Visual Basic 5.0 安装到双向 32 位 Microsoft Windows 环境中它才会起作用。

双向特性的联机帮助中说明了所有的 Microsoft Visual Basic 5.0 双向特性。在双向 32 位 Microsoft Windows 环境中安装 Microsoft Visual Basic 5.0 之后，选择“帮助”菜单中的“双向特性”项，即可获得双向特性的联机帮助。另外也可以通过找到并双击 Bhelp32.hlp 文件获得该联机帮助。

为与 Microsoft Visual Basic 4.0 兼容，在 Microsoft Visual Basic 5.0 中有两个版本的 32 位 Grid 控件 (Grid32.ocx)，但没有安装。它们都放在产品介质的 \Tools 文件夹中。该文件的标准版本和双向版本分别放在 \Controls 和 \Controls\Bidi 子文件夹中。


转换 RDC 后 VB5 不更新 RDO 引用 (ReadMe)

如果转换使用较早版本的远程数据对象 (RDO) 的 Visual Basic 4.0 工程，Visual Basic 不会自动将旧版本的 RDO 引用转换为新版本的 RDO。为改正这一问题，可以单击“工程”菜单中的“引用”，取消使用旧版本的 RDO，然后选用新版本的 RDO。


如果 RDC 使用批处理游标则绑定的 Image 控件不显示图片 (Readme)

如果将 Image 控件绑定到 RemoteData 控件 (RDC) 的保存图象的字段，而该 RDC 使用批处理游标 (CursorDriver = rdUseClientBatch)，则 Image 控件将不显示对应的图象。

将 RDC 的 Options 属性设置为 128 (rdFetchLongColumns)，即可解决该问题。


升级 VB 企业版要删除 Autmgr32.exe (ReadMe)

升级到 Visual Basic 5.0 企业版之后删除 Visual Basic 4.0 的企业版时，就会删除 Automation 管理器。为了防止和解决这个问题，或者在升级到 VB 5.0 之前删除 Visual Basic 4.0，或者在删除 Visual Basic 4.0 之后重新从 Visual Basic 5.0 中安装 Automation 管理器。

缺省情况下，Visual Basic 5.0 安装到下列目录：\Program Files\DevStudio\VB。因为这与 Visual Basic 4.0 不同，它是安装在自己的目录（Windows NT 3.51 是 C:\VB，Windows 95 和 Windows NT 4.0 是 C:\Program Files\Microsoft Visual Basic），所以安装 Visual Basic 5.0 并不自动升级 Visual Basic 4.0。可以同时运行两套程序。

在 Visual Basic 4.0 安装中，Automation 管理器并不是作为共享部件安装的。因此，就会在删除 Visual Basic 4.0 之后被删除。要重新安装 Visual Basic 5.0 的 Automation 管理器，从“控制面板”中选择“添加/删除程序”，在系统已安装的程序列表中选择 Visual Basic 5.0 企业版，按“添加/删除”按钮，然后按“重新安装”按钮。


ListBox 控件的 ItemCheck 事件中的 Unload Me 语句引起 GPF (ReadMe)

在 ListBox 控件的 ItemCheck 事件中试图使用 Unload Me 卸载窗体将引起 GPF。例如：

Private Sub Form_Load()

    Dim i%

    For i = 0 To 20

        List1.AddItem i

    Next i

End Sub

Private Sub List1_ItemCheck(Item As Integer)

    Unload Me

End Sub

如果按下空格键，或试图使用命令按钮选择列表框中的项目，此例也将产生一个 GPF。

卸载窗体的推荐过程是，在 CommandButton 或 Menu 控件的 Click 事件中添加 Unload 语句。


CommonDialog 控件常数 cdlHelpContents 可能已经过时 (ReadMe)

用 Windows 帮助编译器的较新版本创建的帮助文件可能不支持用 CommonDialog 控件常数 cdlHelpContents 访问目录主题。例如，像在下例中那样试图访问帮助文件目录主题可能不会产生预期的结果：

Private Sub cmdHelpContents_Click()

    dlgCommon.HelpFile = "help\vb5.hlp"

    dlgCommon.HelpCommand = cdlHelpContents

    dlgCommon.ShowHelp

End Sub

用 Windows 帮助编译器的较新版本创建的帮助文件使用 .cnt 文件显示帮助查看器应用程序中的目录主题。这与以前的版本不同。因此，CommonDialog 控件常数 cdlHelpContents 不再有效。

SDK 平台（以前的 Win32 SDK）中总结了下面的改变信息：

“过去，应用程序用 WinHelp 函数的 HELP_CONTENTS 和 HELP_INDEX 命令显示帮助文件的目录主题和关键字索引。这些命令不再推荐使用。使用 HELP_FINDER 命令来代替。”

Visual Basic 5.0 不对 WinHelp 函数的 HELP_FINDER 命令提供等价的 CommonDialog 控件常数。为了在帮助文件中访问目录主题，像这个示例一样，声明 WinHelp 命令为常数：

Const HelpFinder = &h000B

关于使用 WinHelp 命令的详细信息，参考 SDK 平台。


编译 OCX 或 DLL 时出现的“权限禁止”或“意外的错误” (ReadMe)

在下列情况下，如果选择“二进制兼容”选项编译 ActiveX 控件或 ActiveX DLL 工程，可能会遇到这些错误：

•	将工程编译到为二进制兼容指定的同一个 .ocx（或 .dll）文件，以及

•	在同一个 Visual Basic 会话期内不止一次地编译 .ocx（或 .dll）文件。

注意   在接收到“在代码生成器或链接器内发生意外错误”的消息之后，如果错误日志含有“LINK : 致命错误 LNK1104: 不能打开文件 <path>\<filename>”，则必须关闭 Visual Basic 并删除该消息中命名的文件。

解释

一般说来，不应当将部件编译到为二进制兼容指定的同一个文件。这样做，会引起用这些临时编译的外部接口信息批量地更新文件，请参阅联机手册中的“版本兼容性”。

换一种做法，用下列的缩微化法则来确定使用哪一种版本兼容选项：

•	如果正在创建新的控件（或代码部件），选择“工程兼容”并指定正常编译产生的文件。

注意   “工程兼容”是新工程的缺省选项。

•	如果正在创建已经发行给其它开发者的控件（或代码部件）的新版本，并且想使新版本与用早期版本编译过的应用程序兼容，则选择“二进制兼容”，并指定已发行的 .ocx（或 .dll ）文件的引用副本。

重要   这应当是已分布到开发者手中的文件的副本；不指定正常编译工程所要产生的文件。

•	如果正在创建已经发行给其它开发者的控件的新版本，并需要作一些更改，以防止该控件与先前编译过的应用程序一道工作，则选择“工程兼容”，并指定正常编译文件。

“工程兼容”保证现存工程中的控件副本，在向开发者分布新版本时能容易地升级。但它不保证控件的新版本能与用早期版本编译过的应用程序兼容。

重要   当编写不与先前编译过的应用程序一起工作的版本时，别忘记更改 .ocx 文件的名字。标准的惯例是在文件名中包含版本号。如果正在创建代码部件的新版本，也应当更改工程名。

可以在“工程属性”对话框的“部件”选项卡中选择版本兼容选项。

注意    如果客户程序正在使用被编译的 .ocx 文件，还能发生“权限禁止”。这时必须关闭所有的客户程序— 例如，Microsoft Internet Explorer 或 Microsoft ActiveX Control Pad— 以求释放该 .ocx 文件，可以重新编译。


UserControl 对象不支持 DDE (ReadMe)

用 Visual Basic 编写的控件不支持与 UserControl 对象之间的、或者与 UserControl 对象的成员控件之间的动态数据交换 (DDE)。

注意   UserControl 对象上的成员控件将显示面向 DDE 的属性、方法和事件。但是，如果试图设置 LinkMode 属性，会发生运行时错误 369“在 ActiveX DLL 中的操作无效”。

详细信息

允许控件支持 DDE（如 LinkMode 属性或 LinkOpen 事件）的属性、方法和事件并不是控件的一部分。它们是被控件的 Extender 对象添加的，但是仅当控件的类型库包含必要的接口才行。这些接口不包括在编译 ActiveX 控件工程时创建的类型库中，所以，在最后的 .ocx 文件中的控件不能够支持 DDE。

给予控件的属性、方法和事件以标准名称，不能使 DDE 支持控件，因为这些属性和方法必须是容器提供的。事实上，如果提供有标准名称的事件（如 LinkOpen），Visual Basic 将不允许将控件的实例放在窗体上。


更改 UserControl 属性不影响已经编译的应用程序 (ReadMe)

如果发行用 Visual Basic 编写的控件，而事后又决定发行该控件的增强版本，一些兼容性的问题将不通过版本兼容性能来处理。

例如，考虑下面的情况：

•	发行 SuperDuperComm.ocx version 1.0，并将其分布到开发者手中。该控件在运行时是可见的。

•	开发者分布用 SuperDuperComm 编译的应用程序。

•	当发行 version 2.0 of SuperDuperComm 时，根据开发者的反馈将 UserControl 对象的 InvisibleAtRuntime 属性设置为 True。用“二进制兼容”（用“工程属性”对话框的“部件”选项卡进行设置）保证新版本与用 1.0 版编译的应用程序一道工作。

•	新的 SuperDuperComm 被安装在有用 1.0 版编译的应用程序的机器上，而开发者报告：该控件在运行时仍然可见。

其中的原因是，运行时的不可见性是容器（例如，Visual Basic 窗体）提供的服务，由于控件的 1.0 版不要求这种服务，所以，编译过的容器不支持这种服务。

决定于容器支持的服务的 UserControl 对象的其它属性有：

•	ControlContainer

•	CanGetFocus

•	Alignable

•	ForwardFocus

•	DefaultCancel

•	ToolboxBitmap

•	Public

从控件的一个版本到下一个版本之间，如果改变了这些属性的话，将不影响在已编译的应用程序中控件的性能。

有关的问题将在联机手册的“控件的版本问题”中讨论。


在 Access 中不能辨认使用 OLE 数据类型的事件参数 (ReadMe)

Microsoft Access 不辨认列于下表的标准 OLE 数据类型，要将它们转换如下：

OLE 数据类型	在 Access 中为
OLE_TRISTATE	Long
OLE_HANDLE	Long
OLE_OPTEXCLUSIVE	Boolean
OLE_COLOR	0
例如，假定在用 Visual Basic 编写的控件中声明了如下事件：

Event TestType(ByVal OT As OLE_TRISTATE, _

ByVal OO As OPT_EXCLUSIVE, ByVal OC As OLE_COLOR)

如果编译的控件用在 Microsoft Access 中，该事件过程将是：

Private Sub MyControl1_TestType(ByVal OT As Long, _

ByVal OO As Boolean, ByVal OC As 0)

End Sub

对于除 OLE_COLOR 外的所有类型，Microsoft Access 使用的数据类型和标准数据类型同样大小。但是，OLE_COLOR 的代码不编译。因此，如果希望控件能用于 Microsoft Access，请不要用 OLE_COLOR 作为事件参数的数据类型。


含有 User Forms 文本框的 UserControl 可能不工作在 UserForm 之上 (ReadMe)

用于 Microsoft Office 应用程序的 Microsoft User Forms 含有许多和 Visual Basic 固有控件类似的控件。这些控件可以用在 Visual Basic 窗体上，或放在 UserControl 或 UserDocument 设计器上。

注意   若在应用程序或 .ocx 中使用这些控件，在安装程序中，安装程序向导必须包括 Microsoft User Forms 的支持 DLL。

下列情况会有问题：

•	通过在 UserControl 设计器上放置 User Forms Textbox 来编写 Visual Basic 中的控件，再生成 .ocx 文件。

•	在 User Form 上放置新控件的实例。

•	当窗体运行时，在 User Forms Textbox 中键入可能不行。

不建议在 UserControl 对象上使用 User Forms Textbox 控件。


对象可用调用树中的 Friend 方法终结 (ReadMe)

当调用对象的属性和方法时，过程在它返回之前被保留在调用树中（即堆栈中）。如果所有对对象的引用被释放，而对象的诸多公共属性或方法中的一个仍在调用树中的话，Visual Basic 将不允许这个对象终结。只有不再有公共的属性或方法留在调用树中之后，对象的终结事件才能发生。

Visual Basic 为公共成员提供这种保护，是因为如果允许对象终结，而其代码仍在调用树中，该对象使用的内存将被释放，当成员最后返回时程序就会失败。

用 Friend 关键字声明的属性和方法没有这种保护。在大多数情况下，这种保护没有必要，因为在原始的使用 Friend 成员的编程方案中，当有对象的代码在堆栈中，终结这个对象非常困难。

这样的事可能发生的一种情况就是当 Friend 方法用来引发公共事件，以及 Friend 方法被 Visual Basic 以外的事件所调用，例如，用 AddressOf 操作符安装系统定时器。在这种情况下，该方法必须从 Friend 改为 Public，避免潜在的程序失败。

使用在 Coffee 示例应用程序中的 XTimer 类提供了这样的示例。


手工编辑 VB_PredeclaredId 属性引起的问题 (ReadMe)

如果用 Visual Basic 以外的文本或代码编辑器来编辑 Visual Basic 的源文件，请注意不要改变属性 VB_PredeclaredId 的设置值。特别是改变这个属性会引起有关 GlobalMultiUse 类和 GlobalSingleUse 类的严重问题。

一般来说，不应当手工编辑属性，在这样做时可能将模块放入内部不一致的状态。


AmbientProperties.Font 复制容器的环境字体 (ReadMe)

当访问 AmbientProperties 对象的 Font 属性时，得不到对于容器的字体的引用。只能得到字体的副本（复制品）。

原因是在容器中添加控件时，AmbientProperties.Font 通常用于初始化该控件的字体。如果提供了对于字体本身的引用，则控件字体的改变会同时改变容器的字体。

如果因为某种原因，控件需要引用容器的字体，可以通过 UserControl 对象的 Parent 属性来访问容器，再得到对容器字体的引用。


为内部使用 GlobalMultiUse 对象而声明全局变量 (ReadMe)

在 ActiveX Exe 或 ActiveX DLL 工程中，将某类的 Instancing 属性设置为 GlobalMultiUse 或 GlobalSingleUse，可将该类的属性和方法添加到任何客户工程的全局名空间中去。也就是，可以使用这些属性和方法，就象它们已经具备全局的功能一样，用不着显式创建这个类的实例。

关于这种全局对象的创建和使用，请参阅联机手册的“全局对象和代码库”。本主题还要讨论全局对象的限制，尤其是下列限制：

“当从其它工程中引用这个部件时，全局对象的属性和方法只变成全局名空间的一部分。在创建 GlobalMultiUse 类模块的工程的内部，从这个类创建的对象才是原始的对象。”

也就是，如果创建含有 Utilities 类的 MyUtilities 工程，Utilities 类的 Instancing = GlobalMultiUse，再赋予该类以 InvertMatrix 方法，于是可以从任何客户工程（只要在其中设置了对 MyUtilities 的引用）中无条件地调用 InvertMatrix。但在 MyUtilities 工程内部必须创建一个 Utilities 类的对象并用这个对象来调用 InvertMatrix。

建议在标准模块中声明一个全局变量（这仅在上面的主题摘要中暗示过），例如：

Public Utilities As New Utilities

其后，什么时候需要使用 InvertMatrix（或者 Utilities 类提供的任何其它过程），可以用类名来限定它：

Utilities.InvertMatrix aintMyLargeMatrix

当第一次用这个方式使用 Utilities 类的方法，这个类的一个实例便自动创建了，因为全局变量被声明为 As New。用类名作为变量名，可以清楚地看出是部件中的哪一个模块提供了这个过程。

注意   必须在标准模块，而不是在类模块中声明这个全局变量，为的是使用上面所说的技巧。


使用 App.PrevInstance 的部件可能引起的问题 (ReadMe)

运行 Windows NT 的计算机可以支持多个桌面系统 (desktops)。当使用为与分布的 COM 一道工作而设计的部件时，会导致下面的情况：

•	用户桌面系统中的客户程序请求该部件提供一个对象。由于在物理上该部件位于同一台机器上，于是该部件在用户的桌面系统上被启动。

•	接着，在另一台计算机上的客户程序用分布的 COM 来请求该部件提供一个对象。在系统的桌面上启动了该部件的第二个实例。

现在有该部件的两个实例运行在同一个 NT 计算机上，在不同的桌面系统上。

这种情况并没有问题，问题在于如果部件的作者已在部件的启动代码中放了 App.PrevInstance 的测试，来阻止该部件的多个副本运行在同一台计算机上。在这种情况下，远程对象的创建将要失败。


不要用浮动的“属性”窗口在多个控件上改变字体 (ReadMe)

在多文档界面 (MDI) 模式中使用 Visual Basic 时，无论是显示停放在主窗口（这是缺省）的“属性”窗口还是浮动的“属性”窗口，都是可能的。

如果“属性”窗口是浮动的，并且选择了两个或多个控件，并且用浮动的“属性”窗口改变了这些控件的 Font 属性，那么在 Visual Basic 中将会引起程序失败。


不要将缺省成员改为 Friend 或 Private (ReadMe)

如果已经用“过程属性”对话框使类的公共属性或方法成为该类的缺省成员，如果没有首先去掉 Default 属性，不要编辑该成员的声明，不要把 Public 改为 Friend 或 Private。不当的操作会在程序中产生严重问题。

如果发现做错了，先重新将成员改为 Public，用“过程属性”对话框去掉 Default 属性。然后可以将声明改回 Friend 或 Private。


DateSerial 的帮助中关于 Year 参数的信息是不对的 (ReadMe)

在 DateSerial 函数的帮助中错误地描述了解释 year 参数的方法。现更正如下：

关于 year 参数，从 0 到 29 之间的值，解释为 2000－2029 年。从 30 到 99 之间的值，解释为 1930－1999 年。所有其它 year 参数，解释为四位十进制（例如，1800）。


如果与 Windows NT 4.0 一起使用 Visual Basic 5.0 … (ReadMe)

Microsoft 定期更新 Windows NT，向用户提供对已发现的问题的最新更正。这些服务包 (Service Packs) 用字母 "SP" 后面加一个数字（例如，"SP1"）命名。

当在运行 Windows NT 4.0 的系统上安装 Visual Basic 5.0 时，Visual Basic 自动安装包括在 SP2 中的 OLE Automation support DLLs。完整的 SP2 更新包括在分布的 CD 上，我们竭力推荐把它用在您的系统上。

注意   如果正在创建的应用程序是运行在 Windows NT 4.0 上的，用户在安装这个应用程序之前，应当将系统更新到 SP2。如果该应用程序使用分布的 COM，这一步特别重要。

下面的问题发生在 SP2 中，在 SP3 中更正了。如果系统中已经使用了 SP2，并且遇到了这些问题，则应当设法获得并使用 SP3。

•	如果对象被创建在第二个线程，而第一个线程仍在初始化 OLE，则 OLE 的初始化可能失败。这非常类似于在资源紧张的条件下（例如多进程的机器）运行多线程 Exe 部件时发生的现象。

•	用分布的 COM 调用在另一台机器上运行的部件中的对象的方法，如果这个方法具有 16 个以上的参数，而且其中 1 到 15 个参数为 ByRef，那么这次调用肯定失败。

•	如果 StdFont 和 StdPicture 没有正确注册，OLEAUT32.DLL 的自注册也会失败（只对 RISC）。

•	往 Picture 对象中加载图元文件时对齐失败（只对 RISC）。

•	在 16 色模式中显示 GIF 和 JPEG 文件时有问题。

•	字体名长于 16 字符，就会覆盖堆栈中的数据 （只对 RISC）。

•	在改变一个或几个属性之后再复制双字节的字体，沿袭下来的字体可能处于不一致状态。（解决办法是在复制字体之前先读一个属性。）

•	调色板的性能与 Visual Basic 4.0 不一致。

•	使用显示属性页的控件时程序失败（只对 RISC）。

•	显示双字节字体（例如，日文）时有问题。

•	在 Windows NT 系统和 UNIX 系统之间使用分布的 COM 时，Variants （变体）类型的数据不能正确传递。

注意   在 VB5 CD 上 SP3 不可用。关于 SP3 的可用性信息，可以从 Microsoft Visual Basic Web Site 获得。与 SP2 一样，用户在安装应用程序之前应当将系统更新到 SP3。

上面列表中的某些项也影响到运行在 Windows 95 上面的 Visual Basic 应用程序。SP3 不能用于更新 Windows 95。当前 Microsoft 正在调研 Windows NT 以外的操作系统的分布机制；可以在 Microsoft Visual Basic Web Site 上面看到有关信息。


在 Windows 95 中，MaskPicture 属性需要黑白位图 (ReadMe)

当多色位图被赋予 UserControl 的 MaskPicture 属性，以及白色以外的颜色被赋予 MaskColor 属性时，控件的表现就象它的 MaskColor 属性已被设置为 white 一样。

当控件用在运行 Windows 95 的系统上时会出现这样的问题。要纠正这个问题，使用两种颜色的位图—在控件的透明部位用白色，在控件不透明的部位用黑色。

注意   将 MaskColor 设置为 white，使得透明性在运行 Windows NT 的系统上也能正常工作。

用如下方法改变象素，可将有色位图转换为黑白位图：如果象素为希望的屏蔽色，将它设置为白；如果象素为其它颜色，将它设置为黑。


在启动期间，Exe 部件暂停从第二个 Exe 创建对象 (ReadMe)

如果进程外部件 (ActiveX Exe) 的启动代码试图从第二个进程外部件创建对象，在返回控件到客户 Exe 之前，该部件将挂起。

这仅发生在运行 Windows 95 的系统上。

该部件仅当所有三个程序（客户以及两个部件）都是单线程 .exe 文件时才挂起。将第二个部件提供的对象的创建延迟一段时间即可避免这个问题。

通过用 Windows 95 的分布的 COM 支持包将 Windows 95 的机器升级，也可以纠正这个问题。


属性页的 StandardSize 属性没有像期望的那样工作 (Readme)

当设置为 1 - 小或 2 - 大时，属性页的 StandardSize 属性可能没有给出期望的结果。这个属性仅根据作者的显示驱动程序和分辨率影响属性页的尺寸。不期望的结果可能发生在其他显示上。

建议使用缺省的 StandardSize 属性值（1 - 自定义），并像处理任何其他窗体那样处理属性页。


PaintPicture 方法：Opcode 参数仅应用于位图 (Readme)

Opcode，PaintPicture 方法的最后一个可选参数，用来传递一个对位图的位操作。当传递其他图像类型时在这个参数上放一个值将引起“无效的过程调用或无效的参数”错误。这是由设计决定的。为了防止这个错误，对任何非位图的图像保留 Opcode 参数为空。


帮助按钮不显示在属性页上 (Readme)

在设计环境中使用 UserControl 时，属性页上的“帮助”按钮在第一次显示属性页时可能没有显示出来。为了解决这种情况，打开然后关闭 UserControl 设计器。下一次访问属性页时“帮助”按钮将出现。

这是一个已知的问题，仅出现在设计环境中；编译的 UserControl 的属性页不出现这种情况。


在窗体加载之前引用私有 UserControl 可以引起错误 (Readme)

如果在加载包容窗体之前试图引用 UserControl 将发生“类型不匹配”错误。例如，下例的 Set 语句将引起错误：

Sub Main()

    Dim a As UserControl1

    Set a = Form1.UserControl11

End Sub

为了防止这个错误，在引用 UserControl 之前加载窗体：

Sub Main()

    Dim a As UserControl1

    Form1.Show

    Set a = Form1.UserControl11

End Sub

这种现象仅出现在 UserControls 是通过“工程”菜单上的“添加用户控件”命令添加到工程中的，并且 Public 属性设置为 False 的情况。通过“引用”对话框添加的公有 UserControls 不会引起错误。


改变窗体或模块名称的大小写可以引起加载错误 (Readme)

改变窗体或其他模块的 Name 属性值的大小写，而不改变名称本身，在下一次加载包含本窗体或模块的工程时可能引起“名称冲突”错误信息。例如，将“Form1”改为“form1”将引起错误；将“Form1”改为“formX”则不会引起错误。

错误引起的原因是：模块名称保存在工程文件中 - 改变工程文件内的名称的过程不是大小写敏感的，而读工程加载时名称的过程则是大小写敏感的。


控件创建版本安装了一些只读的文件 (Readme)

包含在 Visual Basic 控件创建版本内的一些文档文件安装时设为只读属性。这将在试图卸载 Visual Basic 时引起“只读”警告信息。

为了防止这个警告信息，在卸载之前改变 Visual Basic 目录中任何只读文件的属性。


允许作为可选参数的固定类型的对象 (ReadMe)

可选参数允许的类型的描述有误。用 Optional 指定的参数可以有指定的对象类型。例如，只要对象类型在声明的可视范围内，参数说明 Optional MyArg As Worksheet 是有效的。唯一禁止使用的类型是用户自定义类型。


错误地叫作属性的方法 (ReadMe)

DesignerWindow 在帮助主题的标题中作为属性引用了。实际上是一个方法。主题中的实质信息是正确的。


错误地叫作方法的属性 (ReadMe)

在帮助主题的标题中下列插入元素作为方法引用了。它们实际上是属性：ProcBodyLine、ProcCountLines、ProcOfLine、ProcStartLine。主题中的实质信息是正确的。


遗漏属性主题 (RDO) (ReadMe)

下面的 RDO 属性没有帮助主题：

rdoQueries 属性

rdoResultSets 属性

rdoTables 属性

rdoConnections 属性

rdoColumns 属性

rdoParameters 属性

rdoEnvironments 属性

这些属性用于访问相应 RDO 对象的集合。例如，rdoQuery 对象有 rdoParameters 属性。这个属性就是应用于那个查询的 rdoParameter 对象的集合。这些属性的集合及其下面的对象在联机帮助中都有完整的文档。


“插入用户连接对象”中的错误

在《客户/服务器应用程序开发指南》的“插入用户连接对象”的开头处的一个过程的第四步是不正确的，应该忽略。正确的过程已经由前面三步完整地描述清楚了。


Status 属性 (RDO) 应用于行和列 (Readme)

RDO Status 属性的帮助主题的文本仅提到了行，其实该属性可应用于行和列。