您的位置:寻梦网首页编程乐园VB 编程乐园VB问题全功略

VB问题全功略(35)

上一页(35)下一页

171、如何防止使用者按下 CTRL + ALT + DEL
172、如何将 Excel 的资料表导入 Access资料库?
173、取得个人电脑中的设定资讯
174、您想知道有谁正在使用您的 Access 资料库吗?
175、为何声明资料库型态变量时出现《编译错误:使用者自订型态尚未定义》

171、如何防止使用者按下 CTRL + ALT + DEL

有些时候,我们的应用程序执行时,不希望使用者按下 CTRL + ALT + DEL 来异常结束程序或关机,这时候我们可以在启动程序时,将 CTRL + ALT + DEL 功能键之功能取消,然后在结束程序之前,再从新恢复 CTRL + ALT + DEL 之功能。

在模组声明区中加入以下声明及模组:

Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long

Public Const SPI_SCREENSAVERRUNNING = 97

Public Sub Disable_Ctrl_Alt_Del()
'让 CTRL+ALT+DEL 失效
Dim AyW As Integer
Dim TurFls As Boolean
AwY = SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, TurFls, 0)
End Sub

Public Sub Enable_Ctrl_Alt_Del()
'让 CTRL+ALT+DEL 恢复功能
Dim AwY As Integer
Dim TurFls As Boolean
AwY = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, TurFls, 0)
End Sub

'实际使用时,在 Form 中加入以下程序码:

Private Sub Form_Load()
Disable_Ctrl_Alt_Del
End Sub

Private Sub Form_Unload(Cancel As Integer)
Enable_Ctrl_Alt_Del
End Sub

172、如何将 Excel 的资料表导入 Access资料库?

将程序码做成模组,只要传入必要之参数即可!

此一模组共有四个参数:
1、sSheetName:要导出资料的资料表名称 (Sheet name),例如 Sheet1
2、sExcelPath:要导出资料的 Excel 文件路径名称 (Workbook path),例如 C:\book1.xls
3、sAccessTable:要导入的 Access Table 名称,例如 TestTable
4、sAccessDBPath:要导入的 Access 文件路径名称,例如 C:\Test.mdb

在声明区中加入以下声明:

Private Sub ExportExcelSheetToAccess(sSheetName As String, sExcelPath As String, sAccessTable As String, sAccessDBPath As String)
Dim db As Database
Dim rs As Recordset
Set db = OpenDatabase(sExcelPath, True, False, "Excel 5.0")
Call db.Execute("Select * into [;database=" & sAccessDBPath & "]." & sAccessTable & " FROM [" & sSheetName & "$]")
MsgBox "Table exported successfully.", vbInformation, "Yams"
End Sub

使用范例如下:将 C:\book1.xls 中的 Sheet1 导入 C:\Test.mdb 成为 TestTable

ExportExcelSheetToAccess "Sheet1", "C:\book1.xls", "TestTable", "C:\Test.mdb"

173、取得个人电脑中的设定资讯

许多在控制面板中的设定,如果在 VB 的程序中需要知道的话,我们都可以透过 GetLocaleInfo 这个 API 来取得!以下我们已经将它模组化 (WinLocaleInfo),只 传入一个参数即可得到解答!

在声明区中加入以下的声明及模组:

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Public Function WinLocaleInfo(ByVal lnfoType As Long) As String
Dim sLCData As String
Dim nRet As Long
nRet = GetLocaleInfo(0, lnfoType, sLCData, 0)
If nRet Then
sLCData = Space$(nRet)
nRet = GetLocaleInfo(0, lnfoType, sLCData, Len(sLCData))
If nRet Then
WinLocaleInfo = Left$(sLCData, nRet)
End If
End If
End Function

实际在运用时,可传入的参数相当多,连我也不知道到底有多少个,不过别担心,只要在 VB 附的 API 检视员中就可以找到所有可以传入的参数了!这些参数有一个共通点,都是以 "LOCALE_" 为开头字串,以下举几个例子给大家看看:

LOCALE_SCURRENCY = &H14 ' 货币符号
LOCALE_SDATE = &H1D ' 日期分隔字元
LOCALE_SDAYNAME1 = &H2A ' 完整星期名称
LOCALE_SDECIMAL = &HE ' 小数点符号

'以下是一个实例:

Private Sub Command1_Click()
Text1 = WinLocaleInfo(&H14) '可能返回 NT$
Text2 = WinLocaleInfo(&H1D) '可能返回 /
Text3 = WinLocaleInfo(&H2A) '可能返回 星期一
Text4 = WinLocaleInfo(&HE) '可能返回 .
End Sub

174、您想知道有谁正在使用您的 Access 资料库吗?

如果您使用 Access 建立了一个多人使用的资料库环境,有时候您必须要知道有谁正在使用程序连进这个共享的资料库,但是您又不想因为如此而要建立一套完整的 Access 安全系统,您有二个选择:

第一个:

您可以在资料库中建立一个 "Login Table",每次使用者进入或离开系统时就 Update 这个 Table. 

第二个:

较好一点,您可以使用 msldbusr.dll,它可以告诉您目前正连进资料库的电脑名称 (Computer Name),这些资料其实是存放在扩展名为 LDB 的文件中。一旦您从 DLL 中抓到这些资料,您便可以送出讯息,通知 Client 端的使用者 (Remote User) 结束应用程序,以中断和资料库的连结,然后您便可以使用 Exclusive Mode 来维护资料库了。

在这里,我们要说明的是第二种方法,也就是使用 msldbusr.dll。它提供了二个 Function,说明如下:

1、LDBUser_GetUsers:呼叫后会返回二部份,一个是使用者阵列,一个是连结到资料库的使用者数。

Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() _
As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer

lpszUserBuffer():返回使用者阵列,注意!必须使用 ReDim 声明成变动阵列!
lpszFilename:资料库名称 ( .mdb 完整路径 ),若 .ldb 文件不存在,会返回错误代码。
nOptions:下参数声明资料回传的型态。可以使用的参数有四个,如下:

1=返回自从 .ldb 产生后,所有曾经使用资料库的使用者机器名称 (Computer Name) 及数目。
2=只返回目前正在使用资料库的使用者机器名称 (Computer Name) 及数目。
4=只返回导致目前资料库损毁的使用者机器名称 (Computer Name)。
8=只返回使用者的总数,但是并不返回使用者阵列。


2、LDBUser_GetError:呼叫 LDBUser_GetUsers 若有错误产生,可根据返回的错误代码找到说明。

Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo As Long) As String

nErrorNo:呼叫 LDBUser_GetUsers 产生错误所返回的代码,介于 -1 至 -14 之间。说明如下:

-1 = Can't open the LDB file. ( 无法开启 LDB 文件 )
-2 = No user connected. ( 没有使用者在使用资料库 )
-3 = Can't create an array. ( 无法建立阵列 )
-4 = Can't redimension array. ( 无法重新建立阵列 )
-5 = Invalid argument passed. ( 传入无效的参数 )
-6 = Memory allocation error. ( 内存配置错误 )
-7 = Bad index. ( 无效的索引 )
-8 = Out of memory. ( 内存不足 )
-9 = Invalid argument. ( 无效的参数 )
-10= LDB is suspected as corrupted. ( LDB 文件可能损毁 )
-11= Invalid argument. ( 无效的参数 )
-12= Unable to read MDB file. ( 无法读取 MDB 文件 )
-13= Can't open the MDB file. ( 无法开启 MDB 文件 )
-14= Can't find the LDB file. ( 找不到 LDB 文件 )


'范例程序:( 移除所有的 Form,请将以下程序复制到 .bas 文件中即可执行 )

Option Explicit

Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() _
As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer

Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo As Long) As String

Sub MAIN()
Dim psMDBFilename As String
psMDBFilename = InputBox("请输入资料库名称:")
If Len(psMDBFilename) Then
ShowUsers psMDBFilename
End If
End Sub

Sub ShowUsers(psFilename As String)
ReDim lpszUserBuffer(1) As String
Dim psError As String
Dim cUsers As Long
Dim iLoop As Long

'呼叫 LDBUser_GetUsers 返回使用者阵列
cUsers = LDBUser_GetUsers(lpszUserBuffer(), psFilename, 1)

'确认是否返回使用者阵列
If (cUsers = 0) Then
Debug.Print "No Users."
GoTo Exit_ShowUsers
End If

'若有错误则显示错误讯息
If (cUsers < 0) Then
psError = LDBUser_GetError(cUsers)
Debug.Print "Error #:"; cUsers; "--"; psError
GoTo Exit_ShowUsers
End If

'显示使用者阵列
For iLoop = 1 To cUsers
Debug.Print "User "; iLoop; ":"; lpszUserBuffer(iLoop)
Next iLoop

Exit_ShowUsers:
End Sub

'除了上面的范例之外,Microsoft 也提供了一个更完整的范例,它有一个容易理解的介面设计:
如果您在这个主题中想要更多的资讯,或想取得 Microsoft 提供的更多的工具程序,您可以参考:
http://support.microsoft.com/support/kb/articles/q176/6/70.asp

175、为何声明资料库型态变量时出现《编译错误:使用者自订型态尚未定义》

很多人在学习用 VB 撰写资料库程序时,都会从使用 VB 提供的 Data Control 加上各种资料库感知控制项 ( Data Aware Control ) 开始,因为这样子的组合,您甚至一行程序都不用写就可以完成一支简单的资料库程序了!

然而,为了程序控制的灵活度或其他原因,您会开始想要自己声明资料库物件,自己控制各种资料的处理动作,于是您在程序中加入了类似以下的声明: ( 因为书上及 Help 都这么写 )

Dim DB As Database
Dim SS As Snapshot
:

写了一支很简单的程序之後,当您想看看成果,而按下【开始执行】的按钮时,却从电脑中发出了一声令人惊心动魄、代表错误的声响! (如果您有装 Sound Card 的话) 您一遍一遍的检查程序,已经是最简单的程序了,怎么可能会错误呢!让我们来看看错误讯息:《编译错误:使用者自订型态尚未定义》

其实您的程序并没有错,您声明的资料型态也都是对的,只是定义它的物件程序库或型态程序库并没有在 Visual Basic 中注册而已。解决方法如下:

从【专案】功能表中选择【设定引用项目】,在【可引用的项目】栏中选择【Microsoft DAO x.x Object Library】【Microsoft DAO x.x/x.x Compatibility Library】即可。

其中 x.x 代表的是某一个资料库引擎的版本,x.x/x.x 则代表相容于好几个版本的资料库引擎!

如果您的公司中有人使用 Access2.0 / Access95 / Access97 ...等多个不同的版本时,您可以使用 【Microsoft DAO 2.5/3.5 Compatibility Library】。

上一页(35)下一页