# Option Explicit 语句应用方案

## 知识概述

### Option Explicit 语句

在模块级别中使用，强制显式声明模块中的所有变量。

语法

Option Explicit

如果使用 Option Explicit 语句，则必须写在模块的所有过程之前。

示例

完整程序代码：

窗体代码：

Option Explicit

Private Sub Form_Load()

Dim c As Currency0

'd = 10 '产生错误

End Sub

模块代码：

Option Explicit

Type Currency0

a As String

End Type

如果使用 Option Explicit 语句，必须写在模块的所有过程之前。

如果模块中使用了 Option Explicit，则必须使用 Dim、Private、Public、ReDim 或 Static 语句来显式声明所有的变量。如果使用了未声明的变量名在编译时间会出现错误。

如果没有使用 Option Explicit 语句，除非使用 Deftype 语句指定了默认类型，否则所有未声明的变量都是 Variant 类型的。

注意：如果试图使用一个未声明的变量，则会在编译时导致错误。Option Explicit语句只能在模块级使用。

## 应用一：网络映射

映射网络驱动器和断开已经映射的网络驱动器。程序运行时，单击“映射网络驱动器”按钮，在弹出如图 1 所示的对话框窗口中选择映射的驱动器和文件夹路径之后，单击“确定”按钮，完成驱动器的映射；当网络驱动器不在需要的时候，单击“断开网络驱动器”按钮，在弹出 “中断网络驱动器连接”对话框中，选中要断开的驱动器之后，单击“确定”按钮，断开驱动器连接，如图 2 所示。

图 1 映射网络驱动器

图 2 断开已经映射的网络驱动器

实现的过程如下。

（1）新建一个工程，在工程中新建一个窗体。

（2）在窗体上添加 2 个 CommandButton 控件。

（3）程序完整代码如下：

Option Explicit

Private Declare Function WNetConnectionDialog Lib "mpr.dll" (ByVal hwnd As Long, ByVal dwType As Long) As Long

Private Declare Function WNetDisconnectDialog Lib "mpr.dll" (ByVal hwnd As Long, ByVal dwType As Long) As Long

Private Sub Command1_Click() '映射驱动器

WNetConnectionDialog Me.hwnd, &H1

End Sub

Private Sub Command2_Click() '端开已经映射的驱动器

WNetDisconnectDialog Me.hwnd, &H1

End Sub

## 应用二：调用电话拨号程序

通过调用电话拨号程序拨通对方电话的功能，如图 1 所示。运行程序，在“电话号码”文本框中输入电话号码，单击“拨号”按钮，即可通过调用电话拨号程序拨通对方的电话。

图 1 通过调用电话拨号程序实现拨号

程序开发步骤如下。

（1）在 Visual Basic 工程中新建一个窗体，将窗体的 StartUpPosition 属性设置为“2-屏幕中心”。

（2）在窗体上添加一个 Label 控件、一个 TextBox 控件、一个 CommandButton 控件数组和两个 CommandButton 控件。

（3）将 MSCOMM 控件添加到工具箱，并在窗体上添加一个 MSCOMM 控件。

MSComm 控件是 ActiveX 控件，使用前应在 VB 中选择“工程”→“部件”命令，打开“部件”对话框，在该对话框中选择 Microsoft Comm Control 6.0 复选框，如图 2 所示。

图 2 添加 MSComm 控件

单击“确定”按钮，MSChart 等控件将被添加到工具箱中，其中的就是 MSChart 控件。

（4）程序完整代码如下：

Option Explicit

Private Declare Function tapiRequestMakeCall& Lib "TAPI32.DLL" (ByVal DestAddress$, ByVal AppName$, ByVal CalledParty$, ByVal Comment$)

Private Const TAPIERR_NOREQUESTRECIPIENT = -2&

Private Const TAPIERR_REQUESTQUEUEFULL = -3&

Private Const TAPIERR_INVALDESTADDRESS = -4&

Private Sub Text1_Change()

Command3.Enabled = Len(Trim(Text1.Text))

End Sub

Private Sub Command1_Click(Index As Integer) '输入号码

Select Case Index

Case 0

Text1.Text = Text1.Text & 1

Case 1

Text1.Text = Text1.Text & 2

Case 2

Text1.Text = Text1.Text & 3

Case 3

Text1.Text = Text1.Text & 4

Case 4

Text1.Text = Text1.Text & 5

Case 5

Text1.Text = Text1.Text & 6

Case 6

Text1.Text = Text1.Text & 7

Case 7

Text1.Text = Text1.Text & 8

Case 8

Text1.Text = Text1.Text & 9

Case 9

Text1.Text = Text1.Text & 0

End Select

Text1.Enabled = True

End Sub

Private Sub Command2_Click() '清空拨号

Text1.Text = ""

End Sub

Private Sub Command3_Click() '拨号

Dim buff As String

Dim nResult As Long

nResult = tapiRequestMakeCall&(Trim(Text1), CStr(Caption), "Test Dial", "")

If nResult <> 0 Then

buff = "错误信息："

Select Case nResult

Case TAPIERR_NOREQUESTRECIPIENT

buff = buff & "没有可用的拨号程序"

Case TAPIERR_INVALDESTADDRESS

buff = buff & "无效输入"

End Select

MsgBox buff

End If

End Sub

Private Sub Command4_Click()

End

End Sub

## 应用三：如何设计 ODBC 登录对话框

### 实例说明

运行程序，ODBC 登录对话框效果如图 1 所示。

图 1 ODBC 登录对话框

### 思路与技术

为了方便用户配置 ODBC，可以在自己的程序中制作一个 ODBC 登录对话框。那么如何制作 ODBC 登录对话框呢?

ODBC32.DLL 用于实现 ODBC（开放数据库链接）功能的 DLL。该扩展库中的函数提供了一个标准 API，可以获得 DSN、创建环境句柄和实现与不同数据库的链接。

在 VB 程序中调用 SQLAllocEnv%函数初始化 ODBC 接口，获取 ODBC 环境句柄；调用 SQLDataSources 函数来获得 DSN。其他一些比较重要的 ODBC API 函数如下：

l 调用 SQLAllocConnect 函数，获取连接句柄。例如：

`Dim` hdbc `as long`

'连接句柄

`rc=`SQLAllocConnec`（henv, hdbc）`

调用 SQLConnect 函数，建立连接。例如：

Dim sDSN as String,sUID as String,sPWD as String

sDSN="XYGLXT" 'ODBC 数据源名称

sUID="sa" '用户账号

sPWD="" '用户口令

rc=SQLConnect(hdbc,sDSN,Len(sDSN),sUID,Len(sUID),sPWD,Len(sPWD) '建立连接

l 调用 SQLAllocStmt 函数获取语句句柄。

### 开发步骤

（1）新建一个标准工程，默认名为【工程 1】。在该工程中会自动创建一个窗体，默认名为【Form1】。

（2）在【Form1】窗体中放置 2 个 ComboBox 控件、4 个 TextBox 控件、2 个 CommandButton 控件等。主要控件对象的属性如表 1 所示。

表 1 主要控件对象的属性列表

对象 | 属性 | 值 | 功能
Text1 | 名称 | txtUID | 输入用户身份
Text2 | 名称 | txtPWD | 输入用户密码
Text3 | 名称 | txtDatabase | 输入数据库
Text4 | 名称 | txtServer | 输入服务器

（3）程序完整代码。

Option Explicit

Private Declare Function f Lib "ODBC32.DLL" (ByVal henv&, ByVal fDirection%, ByVal szDSN$, ByVal cbDSNMax%, pcbDSN%, ByVal szDescription$, ByVal cbDescriptionMax%, pcbDescription%) As Integer

Private Declare Function SQLAllocEnv% Lib "ODBC32.DLL" (env&)

Const SQL_SUCCESS As Long = 0

Const SQL_FETCH_NEXT As Long = 1

Sub GetDSNsAndDrivers()

Dim i As Integer

Dim sDSNItem As String * 1024

Dim sDRVItem As String * 1024

Dim sDSN As String

Dim sDRV As String

Dim iDSNLen As Integer

Dim iDRVLen As Integer

Dim lHenv As Long '环境句柄

On Error Resume Next

Combo1.AddItem "(None)"

'获得 DSNs

If SQLAllocEnv(lHenv) <> -1 Then

Do Until i <> SQL_SUCCESS

sDSNItem = Space$(1024)

sDRVItem = Space$(1024)

i = SQLDataSources(lHenv, SQL_FETCH_NEXT, sDSNItem, 1024, iDSNLen, sDRVItem, 1024, iDRVLen)

sDSN = Left$(sDSNItem, iDSNLen)

sDRV = Left$(sDRVItem, iDRVLen)

If sDSN <> Space(iDSNLen) Then

Combo1.AddItem sDSN

Combo2.AddItem sDRV

End If

Loop

End If

'删除重复项

If Combo1.ListCount > 0 Then

With Combo2

If .ListCount > 1 Then

i = 0

While i < .ListCount

If .List(i) = .List(i + 1) Then

.RemoveItem (i)

Else

i = i + 1

End If

Wend

End If

End With

End If

Combo1.ListIndex = 0

End Sub

Private Sub Form_Load()

GetDSNsAndDrivers

End Sub

Private Sub Combo1_Click()

On Error Resume Next

If Combo1.Text = "(None)" Then

txtServer.Enabled = True

Combo2.Enabled = True

Else

txtServer.Enabled = False

Combo2.Enabled = False

End If

End Sub

Private Sub cmdOK_Click()

Dim sConnect As String

Dim sADOConnect As String

Dim sDSN As String

If Combo1.ListIndex > 0 Then

sDSN = "DSN=" & Combo1.Text & ";"

Else

sConnect = sConnect & "Driver=" & Combo2.Text & ";"

sConnect = sConnect & "Server=" & txtServer.Text & ";"

End If

sConnect = sConnect & "UID=" & txtUID.Text & ";"

sConnect = sConnect & "PWD=" & txtPWD.Text & ";"

If Len(txtDatabase.Text) > 0 Then

sConnect = sConnect & "Database=" & txtDatabase.Text & ";"

End If

sADOConnect = "PROVIDER=MSDASQL;" & sDSN & sConnect

MsgBox _

"ADO 连接为： " & vbCrLf & _

"Set Cnn = New Connection" & vbCrLf & _

"Cnn.Open """ & sADOConnect & """" & vbCrLf & vbCrLf

End Sub

Private Sub cmdCancel_Click()

Unload Me

End Sub