📄 pr35.htm
字号:
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>VB问题全功略(35)</title>
<style type="text/css">font { font-size: 9pt; line-height: 13pt }
p { font-size: 9pt; line-height: 13pt }
td { font-size: 9pt; line-height: 13pt }
select { font-family: 宋体; font-size: 9pt }
input { font-family: 宋体; font-size: 9pt }
textarea { font-family: 宋体; font-size: 9pt }
a { color: blue; font-size: 9pt; text-decoration: none }
a:hover { color: red; text-decoration: underline }
a:active { color: red; text-decoration: underline }
BODY { FONT-SIZE: 12px; SCROLLBAR-HIGHLIGHT-COLOR: #99ccff; SCROLLBAR-SHADOW-COLOR: #99ccff; COLOR: #000000; SCROLLBAR-3DLIGHT-COLOR: #99ccff; SCROLLBAR-TRACK-COLOR: #ffffff; FONT-FAMILY: "宋体"; SCROLLBAR-DARKSHADOW-COLOR: #99ccff; SCROLLBAR-BASE-COLOR: #99ccff}
</style>
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<center>
<table border="0" width="100%">
<tr>
<td width="100%">
<p align="center"></td>
</tr>
<tr>
<td align="left" bgcolor="#99CCFF" width="924"><font color="#FF0000">VB问题全功略(35)
</font><font color="#000080">[<font face="宋体">查找本页请按Ctrl+F]</font></font></td>
</tr>
<tr>
<td width="100%" align="center"></td>
</tr>
</center>
<tr>
<td>
<p align="right">[<a href="pr34.htm"><u>上一页</u></a>]<font color="#FF0000"><b>(35)</b></font>[<a href="pr36.htm"><u>下一页</u></a>]</td>
</tr>
<center>
<tr>
<td><a href="#171">171、如何防止使用者按下 CTRL + ALT + DEL</a><br>
<a href="#172">172、如何将 Excel 的资料表导入 Access资料库?</a><br>
<a href="#173">173、取得个人电脑中的设定资讯</a><br>
<a href="#174">174、您想知道有谁正在使用您的 Access 资料库吗?</a><br>
<a href="#175">175、为何声明资料库型态变量时出现《编译错误:使用者自订型态尚未定义》</a><br>
<br>
<font color="#FF0000">171、如何防止使用者按下 CTRL + ALT + DEL</font><a name="171"></a><br>
<br>
有些时候,我们的应用程序执行时,不希望使用者按下 CTRL +
ALT + DEL
来异常结束程序或关机,这时候我们可以在启动程序时,将
CTRL + ALT + DEL
功能键之功能取消,然后在结束程序之前,再从新恢复 CTRL +
ALT + DEL 之功能。<br>
<br>
在模组声明区中加入以下声明及模组:<br>
<br>
Declare Function SystemParametersInfo Lib "user32" Alias
"SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long,
lpvParam As Any, ByVal fuWinIni As Long) As Long<br>
<br>
Public Const SPI_SCREENSAVERRUNNING = 97<br>
<br>
Public Sub Disable_Ctrl_Alt_Del()<br>
'让 CTRL+ALT+DEL 失效<br>
Dim AyW As Integer<br>
Dim TurFls As Boolean<br>
AwY = SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, TurFls, 0)<br>
End Sub<br>
<br>
Public Sub Enable_Ctrl_Alt_Del()<br>
'让 CTRL+ALT+DEL 恢复功能<br>
Dim AwY As Integer<br>
Dim TurFls As Boolean<br>
AwY = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, TurFls, 0)<br>
End Sub<br>
<br>
'实际使用时,在 Form 中加入以下程序码:<br>
<br>
Private Sub Form_Load()<br>
Disable_Ctrl_Alt_Del<br>
End Sub<br>
<br>
Private Sub Form_Unload(Cancel As Integer)<br>
Enable_Ctrl_Alt_Del<br>
End Sub<br>
<br>
<font color="#FF0000">172、如何将 Excel 的资料表导入 Access资料库?</font><a name="172"></a><br>
<br>
将程序码做成模组,只要传入必要之参数即可!<br>
<br>
此一模组共有四个参数:<br>
1、sSheetName:要导出资料的资料表名称 (Sheet name),例如 Sheet1<br>
2、sExcelPath:要导出资料的 Excel 文件路径名称 (Workbook path),例如
C:\book1.xls<br>
3、sAccessTable:要导入的 Access Table 名称,例如 TestTable<br>
4、sAccessDBPath:要导入的 Access 文件路径名称,例如 C:\Test.mdb<br>
<br>
在声明区中加入以下声明:<br>
<br>
Private Sub ExportExcelSheetToAccess(sSheetName As String, sExcelPath As String,
sAccessTable As String, sAccessDBPath As String)<br>
Dim db As Database<br>
Dim rs As Recordset<br>
Set db = OpenDatabase(sExcelPath, True, False, "Excel 5.0")<br>
Call db.Execute("Select * into [;database=" & sAccessDBPath &
"]." & sAccessTable & " FROM [" & sSheetName
& "$]")<br>
MsgBox "Table exported successfully.", vbInformation, "Yams"<br>
End Sub<br>
<br>
使用范例如下:将 C:\book1.xls 中的 Sheet1 导入 C:\Test.mdb 成为
TestTable<br>
<br>
ExportExcelSheetToAccess "Sheet1", "C:\book1.xls",
"TestTable", "C:\Test.mdb"<br>
<br>
<font color="#FF0000">173、取得个人电脑中的设定资讯</font><a name="173"></a><br>
<br>
许多在控制面板中的设定,如果在 VB
的程序中需要知道的话,我们都可以透过 GetLocaleInfo 这个 API
来取得!以下我们已经将它模组化 (WinLocaleInfo),只 传入一个参数即可得到解答!<br>
<br>
在声明区中加入以下的声明及模组:<br>
<br>
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<br>
<br>
Public Function WinLocaleInfo(ByVal lnfoType As Long) As String<br>
Dim sLCData As String<br>
Dim nRet As Long<br>
nRet = GetLocaleInfo(0, lnfoType, sLCData, 0)<br>
If nRet Then<br>
sLCData = Space$(nRet)<br>
nRet = GetLocaleInfo(0, lnfoType, sLCData, Len(sLCData))<br>
If nRet Then<br>
WinLocaleInfo = Left$(sLCData, nRet)<br>
End If<br>
End If<br>
End Function<br>
<br>
实际在运用时,可传入的参数相当多,连我也不知道到底有多少个,不过别担心,只要在
VB 附的 API
检视员中就可以找到所有可以传入的参数了!这些参数有一个共通点,都是以
"LOCALE_" 为开头字串,以下举几个例子给大家看看:<br>
<br>
LOCALE_SCURRENCY = &H14 ' 货币符号<br>
LOCALE_SDATE = &H1D ' 日期分隔字元<br>
LOCALE_SDAYNAME1 = &H2A ' 完整星期名称<br>
LOCALE_SDECIMAL = &HE ' 小数点符号<br>
<br>
'以下是一个实例:<br>
<br>
Private Sub Command1_Click()<br>
Text1 = WinLocaleInfo(&H14) '可能返回 NT$<br>
Text2 = WinLocaleInfo(&H1D) '可能返回 /<br>
Text3 = WinLocaleInfo(&H2A) '可能返回 星期一<br>
Text4 = WinLocaleInfo(&HE) '可能返回 .<br>
End Sub<br>
<br>
<font color="#FF0000">174、您想知道有谁正在使用您的 Access
资料库吗?<a name="174"></a></font><br>
<br>
如果您使用 Access
建立了一个多人使用的资料库环境,有时候您必须要知道有谁正在使用程序连进这个共享的资料库,但是您又不想因为如此而要建立一套完整的
Access 安全系统,您有二个选择:<br>
<br>
第一个:<br>
<br>
您可以在资料库中建立一个 "Login Table",每次使用者进入或离开系统时就
Update 这个 Table. <br>
<br>
第二个:<br>
<br>
较好一点,您可以使用 msldbusr.dll,它可以告诉您目前正连进资料库的电脑名称
(Computer Name),这些资料其实是存放在扩展名为 LDB
的文件中。一旦您从 DLL
中抓到这些资料,您便可以送出讯息,通知 Client 端的使用者
(Remote User)
结束应用程序,以中断和资料库的连结,然后您便可以使用
Exclusive Mode 来维护资料库了。<br>
<br>
在这里,我们要说明的是第二种方法,也就是使用 msldbusr.dll。它提供了二个
Function,说明如下:<br>
<br>
1、LDBUser_GetUsers:呼叫后会返回二部份,一个是使用者阵列,一个是连结到资料库的使用者数。<br>
<br>
Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer()
_<br>
As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer<br>
<br>
lpszUserBuffer():返回使用者阵列,注意!必须使用 ReDim
声明成变动阵列!<br>
lpszFilename:资料库名称 ( .mdb 完整路径 ),若 .ldb
文件不存在,会返回错误代码。<br>
nOptions:下参数声明资料回传的型态。可以使用的参数有四个,如下:<br>
<br>
1=返回自从 .ldb
产生后,所有曾经使用资料库的使用者机器名称 (Computer Name)
及数目。<br>
2=只返回目前正在使用资料库的使用者机器名称 (Computer Name)
及数目。<br>
4=只返回导致目前资料库损毁的使用者机器名称 (Computer Name)。<br>
8=只返回使用者的总数,但是并不返回使用者阵列。<br>
<br>
<br>
2、LDBUser_GetError:呼叫 LDBUser_GetUsers
若有错误产生,可根据返回的错误代码找到说明。<br>
<br>
Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo
As Long) As String<br>
<br>
nErrorNo:呼叫 LDBUser_GetUsers 产生错误所返回的代码,介于 -1
至 -14 之间。说明如下:<br>
<br>
-1 = Can't open the LDB file. ( 无法开启 LDB 文件 )<br>
-2 = No user connected. ( 没有使用者在使用资料库 )<br>
-3 = Can't create an array. ( 无法建立阵列 )<br>
-4 = Can't redimension array. ( 无法重新建立阵列 )<br>
-5 = Invalid argument passed. ( 传入无效的参数 )<br>
-6 = Memory allocation error. ( 内存配置错误 )<br>
-7 = Bad index. ( 无效的索引 )<br>
-8 = Out of memory. ( 内存不足 )<br>
-9 = Invalid argument. ( 无效的参数 )<br>
-10= LDB is suspected as corrupted. ( LDB 文件可能损毁 )<br>
-11= Invalid argument. ( 无效的参数 )<br>
-12= Unable to read MDB file. ( 无法读取 MDB 文件 )<br>
-13= Can't open the MDB file. ( 无法开启 MDB 文件 )<br>
-14= Can't find the LDB file. ( 找不到 LDB 文件 )<br>
<br>
<br>
'范例程序:( 移除所有的 Form,请将以下程序复制到 .bas
文件中即可执行 )<br>
<br>
Option Explicit<br>
<br>
Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer()
_<br>
As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer<br>
<br>
Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo
As Long) As String<br>
<br>
Sub MAIN()<br>
Dim psMDBFilename As String<br>
psMDBFilename = InputBox("请输入资料库名称:")<br>
If Len(psMDBFilename) Then<br>
ShowUsers psMDBFilename<br>
End If<br>
End Sub<br>
<br>
Sub ShowUsers(psFilename As String)<br>
ReDim lpszUserBuffer(1) As String<br>
Dim psError As String<br>
Dim cUsers As Long<br>
Dim iLoop As Long<br>
<br>
'呼叫 LDBUser_GetUsers 返回使用者阵列<br>
cUsers = LDBUser_GetUsers(lpszUserBuffer(), psFilename, 1)<br>
<br>
'确认是否返回使用者阵列<br>
If (cUsers = 0) Then<br>
Debug.Print "No Users."<br>
GoTo Exit_ShowUsers<br>
End If<br>
<br>
'若有错误则显示错误讯息<br>
If (cUsers < 0) Then<br>
psError = LDBUser_GetError(cUsers)<br>
Debug.Print "Error #:"; cUsers; "--"; psError<br>
GoTo Exit_ShowUsers<br>
End If<br>
<br>
'显示使用者阵列<br>
For iLoop = 1 To cUsers<br>
Debug.Print "User "; iLoop; ":"; lpszUserBuffer(iLoop)<br>
Next iLoop<br>
<br>
Exit_ShowUsers:<br>
End Sub<br>
<br>
'除了上面的范例之外,Microsoft
也提供了一个更完整的范例,它有一个容易理解的介面设计:<br>
如果您在这个主题中想要更多的资讯,或想取得 Microsoft
提供的更多的工具程序,您可以参考:<br>
<a href="../../../support.microsoft.com/support/kb/articles/q176/6/70.asp" target="_blank"><u>http://support.microsoft.com/support/kb/articles/q176/6/70.asp</u></a>
<p><font color="#FF0000">175、为何声明资料库型态变量时出现《编译错误:使用者自订型态尚未定义》<a name="175"></a></font></p>
<p>很多人在学习用 VB 撰写资料库程序时,都会从使用 VB
提供的 Data Control 加上各种资料库感知控制项 ( Data Aware Control
)
开始,因为这样子的组合,您甚至一行程序都不用写就可以完成一支简单的资料库程序了!<br>
<br>
然而,为了程序控制的灵活度或其他原因,您会开始想要自己声明资料库物件,自己控制各种资料的处理动作,于是您在程序中加入了类似以下的声明:
( 因为书上及 Help 都这么写 )<br>
<br>
Dim DB As Database<br>
Dim SS As Snapshot<br>
:<br>
<br>
写了一支很简单的程序之後,当您想看看成果,而按下【开始执行】的按钮时,却从电脑中发出了一声令人惊心动魄、代表错误的声响!
(如果您有装 Sound Card 的话)
您一遍一遍的检查程序,已经是最简单的程序了,怎么可能会错误呢!让我们来看看错误讯息:《编译错误:使用者自订型态尚未定义》<br>
<br>
其实您的程序并没有错,您声明的资料型态也都是对的,只是定义它的物件程序库或型态程序库并没有在
Visual Basic 中注册而已。解决方法如下:<br>
<br>
从【专案】功能表中选择【设定引用项目】,在【可引用的项目】栏中选择【Microsoft
DAO x.x Object Library】【Microsoft DAO x.x/x.x Compatibility Library】即可。<br>
<br>
其中 x.x 代表的是某一个资料库引擎的版本,x.x/x.x
则代表相容于好几个版本的资料库引擎!<br>
<br>
如果您的公司中有人使用 Access2.0 / Access95 / Access97 ...等多个不同的版本时,您可以使用
【Microsoft DAO 2.5/3.5 Compatibility Library】。</td>
</tr>
</table>
</center>
</div>
<div align="center">
<center>
<table border="0" width="100%" cellspacing="1">
<tr>
<td width="100%" bgcolor="#99CCFF">
<p align="center"><font color="#ff0000"><a href="../../index.html" target="_blank">[木瓜软件工作室]</a>
整理</font></td>
</tr>
</table>
</center>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -