VB之雕虫小技 ◆在程序中调用其它程序 WINDOWS的API中的函数WinExec可以实现在程序中调用其它程序，函数说明如下： UINT WinExec( LPCSTR lpszCmdLine,// 命令行地址
UINT fuCmdShow //刚打开时的窗口类型
);
在使用时要加如下声明:
Private Declare Function WinExec Lib "kernel32"
(ByVal lpCmdLine As String,
ByVal nCmdShow As Long) As Long
如果想在程序中调用Windows中自带的计算器，用下面的代码即可实现:
WinExec "c:/windows/calc.exe", 10
参数10使启动的窗口处于缺省状态，参数3使启动的窗口最大化，参数6使启动的窗口最小化。实际上许多商用软件的计算器都是这样直接调用Windows自带的计算器的。

◆输入数据的合法性检测

一个软件经常需要用户输入一些数据，而这些数据往往需要一定格式，比如输入的是一个整形，或是一个日期等，这样作为软件的设计者必须想到用户出错的可能性，在用户出错时给予提示和纠正。只有这样你的程序才是一个好程序。在VB编程中数据的合法性检测有很多的方法，比如利用一些函数来检测数据的合法性，IsDate就可以用于检测日期型的数据。应用VB中的错误陷阱技术和VB的不同类型数据间的自动转换功能就能很好地实现数据的合法性检测，编程简单而且效果很好，能检测各种类型的数据。
通常输入的如果是字符串就不需要检测，但如果要求输入的是整形或货币形等就必须进行一定的检测。
1. 整形的检测
要求在文本框（Text1）中输入的是一个整数，那么可以在它的LostFocus事件中进行检测，代码如下：
Private Sub Text1_LostFocus()
Dim i As Integer '定义一个整形i
On Error GoTo ERROR1
'设置错误陷阱，如果Text1.Text不是整数跳到ERROR1
i = Text1.Text
'这里可以做其它处理
Exit Sub
ERROR1:
MsgBox ("请输入一个整数")
Text1.SetFocus
End Sub
2. 浮点数的检测
就将i定义成浮点就可以了，代码如下：
Private Sub Text1_LostFocus()
Dim i As Single
On Error GoTo ERROR1
i = Text1.Text
Exit Sub
ERROR1:
MsgBox ("请输入一个单精度浮点数")
Text1.SetFocus
End Sub
同理，如果要的是日期就将i定义成日期就可以了，就是说，要什么样的数据就将i定义成什么样的数据类型就可以了。当然，一定要在LostFocus事件中对数据的合法性进行检测，如果是制作数据库应用程序完全可以在数据被添加到数据库之前再对数据进行检测，这样对用户将更加方便。

◆用VB播放Flash动画

在VB中使用Flash4自带的Swflash.ocx控件来播放Flash动画。
1. 在VB 6.0中新建一个工程，在工具箱上单击右键，在弹出的快捷菜单中选择"部件"命令，在"部件"窗口的控件列表中选择Shockwave flash，然后确定，Flash控件就被加到工具箱中。
2. 将Flash控件放到窗体上，并调整至适当的大小，然后在属性窗口里设置movie属性为Flash动画文件的路径(如：D:\hello.swf)，设置scale model属性为2，quality 属性为1。
3. 双击窗体，在form_load( )过程里加入：
shockwaveflash1.playing=true
按F5键就可以看到播放的Flash动画了。(注意:编译以后的可执行文件不包含动画文件)如果动画里加上动态按钮，配合鼠标位置判断，就可以作成动态工具条或动态菜单了。

◆让VB6.0支持动画光标

在VB6.0中，鼠标指针通常是由窗体或其它控件的MouseIcon属性来设置，但遗憾的是，MouseIcon属性不支持彩色光标(*.cur)和动画光标(*.ani)。因此，要想在程序中使用上述光标，就需发借助Windows API函数SetClassLong,该函数的功能是设置和修改窗体类中某些属性的值，并返回该属性原来的值。
关键函数的介绍:
SetClassLong hwnd,nIndex,dwNewLong
其中，hwnd代表要设置光标的窗体或控件的句柄;nIndex表示设置光标，在这里设为-12;dwNewLong代表新的光标文件，可由另一API函数LoadCur-sorFromFile获得。
设置光标后，在程序结束时，我们要将光标复原，因此要先将SetClassLong返回的原始光标存到变量中，再在窗体的Unload事件中将其还原。
函数声明：
Private Declare Function Load-CursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'以上API函数声明，必须在同一行中结束
Dim NewCur As Long
Dim OldCur As Long
代码段：
Private Sub Form_Load()
NewCur=LoadCursorFromFile("C:\WINDOWS\CURSORS\GLOBE.ANI")
'上面*.ANI动画光标的路径可自己设定
OldCur=SetClassLong(hwnd,-12,NewCur)
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetClassLong hwnd,-12,OldCur
End Sub

◆快速读取TextBox第N行数据

TextBox 是以 vbCr+vbLf 为分行符号， 如果我们要逐一读取TextBox每一行，无非是寻找 vbCr+vb-Lf的所在位置， 然后取出每一行的字串， 不过这个方法不快，而且如果我们要读取第 N 行数据，还是要从第 1、2、…N-1 行逐一读起，实在麻烦。 还好 Windows API 提供有读取 TextBox 第 N 行的功能。
函数声明：
Public Const EM_GETLINE = &HC4
Public Const EM_LINELENGTH = &HC1
Public Const EM_LINEINDEX = &HBB
Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any,lpvSource As Any, ByVal cbCopy As Long)
代码段：
Sub TB_GetLine(ByVal hWnd As Long, ByVal whichLine As Long, Line As String)
Dim length As Long, bArr() As Byte, bArr2() As Byte, lc As Long
lc = SendMessage(hWnd,EM_LINEINDEX, whichLine, ByVal 0&)
length = SendMessage(hWnd, EM_LINELENGTH, lc, ByVal 0&)
If length > 0 Then
ReDim bArr(length + 1) As Byte,bArr2(length - 1) As Byte Call RtlMoveMemory(bArr(0), length, 2)
'准备一个存储器，传递消息之前先在存储器的前两个字节填入存储器的长度
Call SendMessage(hWnd, EM_GET-LINE,whichLine, bArr(0))
Call RtlMoveMemory(bArr2(0), bArr(0), length)
Line = StrConv(bArr2, vbUnicode)
Else
Line = ""
End If
End Sub
' 假设要读取 Text1 第 5 行的数据
Dim S As String
Call TB_GetLine( Text1.hWnd, 5, S )
' 传回值 S 即等于第 5 行的数据
（注：TextBox 的行数是从 0 起算。）
(况峻、崔杰)