VB语句详解——Declare语句
2008-06-13 22:40:48.0

作者:杜勇

描述:用于在模块或窗体中声明对动态链接库(DLL)中外部过程的引用,在引用API函数时经常用到。
一、语法:
语法1
[Public|Private]Declare Sub name Lib"libname"[Alias"aliasname"][([arglist])]
语法2
[Public|Private]Declare Function name Lib"libname"[Alias"aliasname"][([arglist])][As type]
Declare语句的语法包含下面部分:

部分
描述
Public 可选的。用于声明其引用是全局的(公用的),也就是说该引用的过程在整个工程中都可以使用。Public只能在模块中声明。
Private 可选的。用于声明其引用是局部的,也就是说只能在该声明所在的模块或窗体中使用。
Sub或Function 可选的(但二者必须选其一)。Sub表示该过程没有返回值;Function表示该过程会返回一个可用于表达式的值。
Name 必需的。为合法的过程名。
Lib 必需的。Declare的子句。
Libname 必需的。所声明过程的动态链接库名或代码资源名。
Alias 可选的。表示将被调用的过程在动态链接库(DLL)中还有另外的名称。当动态链接库的过程与同一范围内的公用变量、常数或任何其它过程的名称相同时,可以使用这个参数。
Aliasname 可选的。动态链接库或代码资源中的过程名。如果首字符不是数字符号(#),则aliasname是动态链接库中该过程的入口处的名称。如果首字符是(#),则随后的字符必须指定该过程的入口处的顺序号。
Arglist 可选的。代表调用该过程时需要传递的参数列表。
Type 可选的。Function过程返回值的数据类型;可以是VB变量的各种类型、用户定义类型或对象类型,不支持定长的String。

arglist参数的语法以及语法各个部分如下:
[Optional][ByVal|ByRef][ParamArray]varname[()][As type]

部分
描述
Optional 可选的。表示参数不是必需的。如果使用该选项,则arglist中的后续参数都必需是可选的,而且必须都使用Optional关键字声明。
ByVal 可选的。表示该参数按值传递。
ByRef 可选的。表示该参数按地址传递,是缺省选项。
ParamArray 可选的。只用于arglist的最后一个参数,表示最后的参数是一个Variant元素的Optional的数组。使用ParamArray关键字可以提供任意数目的参数。ParamArray关键字不能与ByVal、ByRef或Optional一起使用。
Varname 必需的。代表传给该过程的参数的变量名;遵循标准的变量命名约定。
() 对数组变量是必需的。指明varname是一个数组。
Type 可选的。传递给该过程的参数的数据类型;可以是VB变量的各种类型、用户定义类型或对象类型,不支持定长的String。

二、说明:
  如果引用API函数,可以从API Text Viewer直接将声明复制过来,方法是在程序菜单里选择Microsoft Visual Studio 6.0——Microsoft Visual Studio 6.0 Tools——API Text Viewer,在API Viewer的File菜单里点击Load Text File,打开WIN32API。选择你需要的API函数,添加到Selectde Items里,但要注意根据需要选择Public或Private,然后单击复制。
  对Function过程而言,过程的数据类型决定其返回值的数据类型。可以在arglist之后使用As子句来指定函数返回值的数据类型。在arglist中,可以使用As子句来指定任何传给该过程的参数的数据类型。
注意:在Declare语句的参数表中不能使用定长的字符串;只能用变长的字符串。

三、应用举例:
  该示例演示如何在使用Declare语句来声明API函数,使某一窗体保持在前面。建立一标准工程,将窗体改名为FrmMain。在窗体上添加一命令按钮,将下面的程序粘贴过去。
Private Sub Command1_Click()
 FrmFore.Show '显示第二个窗体
End Sub
  在工程上添加一个窗体,改名为FrmFore。在窗体上添加两个命令按钮,将下面的程序粘贴过去。
Option Explicit

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long '声明API函数

Private Sub Command1_Click()
 Dim rtn
 rtn = SetWindowPos(FrmFore.hwnd, -1, 0, 0, 0, 0, 3)
 Me.Caption = "窗体在前"
End Sub

Private Sub Command2_Click()
 Dim rtn
 rtn = SetWindowPos(FrmFore.hwnd, -2, 0, 0, 0, 0, 3)
 Me.Caption = "活动窗体"
End Sub
  在工程(Project)菜单打开属性对话框,在对话框中的Starup Object选择FrmMain,然后点击确定。
  运行程序时,出现的是第一个窗体,单击显示辅窗体,第二个窗体出现,位于第一个窗体前面。我们分三步来演示这个程序:
一、单击第一个窗体,则第一个窗体到第二个窗体的前面,再单击第二个窗体,第二个窗体又到了前面。
二、这时单击第二个窗体的命令按钮1,然后单击第一个窗体,那么我们可以看到,第一个窗体只被激活,但第二个窗体始终在第一个窗体的前面。
三、最后单击第二个窗体的命令按钮2,此时的情况如同第一步。


文章评论
[以下网友留言只代表其个人观点,不代表中华网的观点或立场]
发表评论
昵 称:
主 页:
内 容:
表 情: