2008年8月18日星期一

vb技巧10

怎样加速数据库的访问速度?
下面的窍门将教会你如何加速数据库的访问速度,当人们要读取一个数据库时往往会这么做:

Do while not records.eof

combo1.additem records![Full Name]

records.movenext

loop

经常遇到的问题是每次数据库移动到下一条记录的时候,它必须检查是否到达文件底部,这将使数据的访问速度大打折扣。当你需要在一个巨大的数据库中移动或寻找时,最好是这样做:

records.movelast

intRecCount=records.RecordCount

records.movefirstfor intCounter=1 to intRecCount combo1.additem records![Full Name]

records.movenext

next intCounter

试试看,你将得到33%的速度提升!
返回

怎么对付数据库中的空字符?

缺省时的数据库字段为空字符(并不是指一个字符串值为“空格”,而是什么也没有),当你读取这些字段的时候把它们赋值给VB的String变量,你就会得到“变量类型不匹配”的错误。最好的解决方法应当是嵌入一串空格和字段连接起来,请看下面的代码:

Dim DB As Database

Dim RS As Recordset

Dim sYear As String

Set DB = OpenDatabase("Biblio.mdb")

Set RS = DB.OpenRecordset("Authors")

sYear = "" & RS![Year Born]
返回

怎样打开或关闭CD-ROM?

如果你想通过VB打开或者关闭CD-ROM,你可以向Windows Multimedia DLL发出一条相关的命令请求,但是你必须先声明DLL:

在模块文件中加入以下代码:

Declare Function mciSendString Lib "winmm.dll" Alias _"mciSendStringA" (ByVal lpstrCommand As String, ByVal _lpstrReturnString As String, ByVal uReturnLength As Long, _

ByVal hwndCallback As Long) As Long

以下是打开CD-ROM的过程代码:

retvalue = mcisendstring("set CDAudio door open", _

returnstring, 127, 0)

关闭CD-ROM用以下代码:

retvalue = mcisendstring("set CDAudio door closed", _returnstring, 127, 0)
返回

怎样使用VB程序退出Windows?

Public Const EWX_LOGOFF = 0

Public Const EWX_SHUTDOWN = 1

Public Const EWX_REBOOT = 2

Public Const EWX_FORCE = 4

Declare Function ExitWindowsEx Lib "user32" Alias _

"ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved _

As Long) As Long

退出Windows:

t& = ExitWindowsEx(EWX_FORCE OR EWX_REBOOT, 0)
返回

怎样用VB断开与internet的连接?

如果你想终止与internet的连接,可以使用断开连接的方法,首先你必须声明以下函数和变量:

Declarations

Public Const RAS_MAXENTRYNAME As Integer = 256Public Const RAS_MAXDEVICETYPE As Integer = 16

Public Const RAS_MAXDEVICENAME As Integer = 128

Public Const RAS_RASCONNSIZE As Integer = 412Public Const ERROR_SUCCESS = 0&

Public Type RasEntryName

dwSize As Long

szEntryName(RAS_MAXENTRYNAME) As Byte

End Type

Public Type RasConn

dwSize As Long

hRasConn As Long

szEntryName(RAS_MAXENTRYNAME) As Byte

szDeviceType(RAS_MAXDEVICETYPE) As Byte

szDeviceName(RAS_MAXDEVICENAME) As Byte

End Type

Public Declare Function RasEnumConnections Lib _

"rasapi32.dll" Alias "RasEnumConnectionsA" (lpRasConn As _

Any, lpcb As Long, lpcConnections As Long) As Long

Public Declare Function RasHangUp Lib "rasapi32.dll" Alias _

"RasHangUpA" (ByVal hRasConn As Long) As Long

Public gstrISPName As String

Public ReturnCode As Long

断开过程:

Public Sub HangUp()

Dim i As Long

Dim lpRasConn(255) As RasConn

Dim lpcb As Long

Dim lpcConnections As Long

Dim hRasConn As Long

lpRasConn(0).dwSize = RAS_RASCONNSIZE

lpcb = RAS_MAXENTRYNAME * lpRasConn(0).dwSize

lpcConnections = 0

ReturnCode = RasEnumConnections(lpRasConn(0), lpcb, _

lpcConnections)

If ReturnCode = ERROR_SUCCESS Then

For i = 0 To lpcConnections - 1

If Trim(ByteToString(lpRasConn(i).szEntryName)) _

= Trim(gstrISPName) Then

hRasConn = lpRasConn(i).hRasConn

ReturnCode = RasHangUp(ByVal hRasConn)

End If

Next i

End If

End Sub

Public Function ByteToString(bytString() As Byte) As String

Dim i As Integer

ByteToString = ""

i = 0

While bytString(i) = 0&

ByteToString = ByteToString & Chr(bytString(i))

i = i + 1

Wend

End Function

调用断开过程:

Call HangUp
返回

怎样用VB得知系统当前是否处于internet链结状态?

对于那些必须和internet链结才能工作的程序来说,知道当前计算机是否处于链结状态是非常有意义的。当Windows系统处于链结状态时,它会在注册表里改动一个键值,下面的例子告诉你如何读取这个键值,并得知系统是否与internet相连。

声明以下函数变量常量:

Public Const ERROR_SUCCESS = 0&

Public Const APINULL = 0&

Public Const HKEY_LOCAL_MACHINE = &H80000002

Public ReturnCode As Long

Declare Function RegCloseKey Lib "advapi32.dll" (ByVal _hKey As Long) As LongDeclare Function RegOpenKey Lib "advapi32.dll" Alias _"RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As _

String, phkResult As Long) As Long

Declare Function RegQueryValueEx Lib "advapi32.dll" Alias _

"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName _

As String, ByVal lpReserved As Long, lpType As Long, _

lpData As Any, lpcbData As Long) As Long

代码:

Public Function ActiveConnection() As Boolean

Dim hKey As Long

Dim lpSubKey As String

Dim phkResult As Long

Dim lpValueName As String

Dim lpReserved As Long

Dim lpType As Long

Dim lpData As Long

Dim lpcbData As Long

ActiveConnection = False

lpSubKey = "System\CurrentControlSet\Services\RemoteAccess"

ReturnCode = RegOpenKey(HKEY_LOCAL_MACHINE, lpSubKey, _

phkResult)

If ReturnCode = ERROR_SUCCESS Then

hKey = phkResult

lpValueName = "Remote Connection"

lpReserved = APINULL

lpType = APINULL

lpData = APINULL

lpcbData = APINULL

ReturnCode = RegQueryValueEx(hKey, lpValueName, _

lpReserved, lpType, ByVal lpData, lpcbData)

lpcbData = Len(lpData)

ReturnCode = RegQueryValueEx(hKey, lpValueName, _

lpReserved, lpType, lpData, lpcbData)

If ReturnCode = ERROR_SUCCESS Then

If lpData = 0 Then

ActiveConnection = False

Else

ActiveConnection = True

End If

End If

RegCloseKey (hKey)

End If

End Function

下面是使用以上代码的例子:

If ActiveConnection = True then

Call MsgBox("现在处于链结状态。",vbInformation)

Else

Call MsgBox("现在处于断开状态。", vbInformation)

End If
返回

放置“透明”的图片
在 VB 中,如果你试着把一只有鸟的图片放到背景的一棵树上,你就会发现树会被鸟遮住一个矩形的区域(即鸟的图片矩形)。我们可以通过以下方法使图片上非鸟的其它部分变透明:
我们可以利用一个 WinAPI 函数 BitBlt 对图形进行一系列的位操作来达到此目的。
函数声明:
Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
参数解释:
目标环境:hDestDC——目标设备环境;x——左上角;y——顶端;nWidth——宽;nHeight——高
源环境:hSrcDC——源设备环境;xSrc——源左上角;ySrc——源顶端;
dwRop——位处理操作,如 vbSrcAnd;vbSrcAnd;vbSrcCopy;vbSrcErase;vbSrcInvert 等
(目标环境或源环境只能是 Picture, Form 或 Printer 对象。各单位为象素。)
进行处理之前,我们需要对鸟的图片进行处理:先复制一份相同的图形,将其应该透明之处(鸟的背景)设置为黑色(设此图为sPic),再将另一图做以下处理:要复制的地方(鸟)设置为黑色,其余地方设置(鸟的背景)为白色(设此图为Mask)。
设树的图形为名dPic。
最后,请加入以下代码:
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,Mask.hdc,0,0,vbScrCopy)
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,sPic.hdc,0,0,vbScrInvert)
后记:
1、VB 中的 PaintPicture 方法提供类似功能,但速度不及此方法;
2、在此方法上稍微加入一些代码,就不难实现动画的显示。
3、VB 例子中的 CallDlls 就使用此方法。
返回

设置打印页边距
你可以使用打印机的Scale属性来设置打印页边距。下面的代码设置左边距为1/2英寸。右边距为3/4英寸。乘以1440是将英尺转换成twips。
Printer.ScaleLeft = -0.75 * 1440
Printer.ScaleTop = -0.5 * 1440
Printer.CurrentX = 0
Printer.CurrentY = 0

没有评论: