⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pr35.htm

📁 VB一些常见的问题的解决方法35
💻 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 &quot;user32&quot; Alias   
&quot;SystemParametersInfoA&quot; (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, &quot;Excel 5.0&quot;)<br>  
Call db.Execute(&quot;Select * into [;database=&quot; &amp; sAccessDBPath &amp;   
&quot;].&quot; &amp; sAccessTable &amp; &quot; FROM [&quot; &amp; sSheetName   
&amp; &quot;$]&quot;)<br>  
MsgBox &quot;Table exported successfully.&quot;, vbInformation, &quot;Yams&quot;<br>  
End Sub<br>  
<br>  
使用范例如下:将 C:\book1.xls 中的 Sheet1 导入 C:\Test.mdb 成为   
TestTable<br>  
<br>  
ExportExcelSheetToAccess &quot;Sheet1&quot;, &quot;C:\book1.xls&quot;,   
&quot;TestTable&quot;, &quot;C:\Test.mdb&quot;<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 &quot;kernel32&quot; Alias   
&quot;GetLocaleInfoA&quot; (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   
检视员中就可以找到所有可以传入的参数了!这些参数有一个共通点,都是以   
&quot;LOCALE_&quot; 为开头字串,以下举几个例子给大家看看:<br>  
<br>  
LOCALE_SCURRENCY = &amp;H14 ' 货币符号<br>  
LOCALE_SDATE = &amp;H1D ' 日期分隔字元<br>  
LOCALE_SDAYNAME1 = &amp;H2A ' 完整星期名称<br>  
LOCALE_SDECIMAL = &amp;HE ' 小数点符号<br>  
<br>  
'以下是一个实例:<br>  
<br>  
Private Sub Command1_Click()<br>  
Text1 = WinLocaleInfo(&amp;H14) '可能返回 NT$<br>  
Text2 = WinLocaleInfo(&amp;H1D) '可能返回 /<br>  
Text3 = WinLocaleInfo(&amp;H2A) '可能返回 星期一<br>  
Text4 = WinLocaleInfo(&amp;HE) '可能返回 .<br>  
End Sub<br>  
<br>  
<font color="#FF0000">174、您想知道有谁正在使用您的 Access   
资料库吗?<a name="174"></a></font><br>  
<br>  
如果您使用 Access   
建立了一个多人使用的资料库环境,有时候您必须要知道有谁正在使用程序连进这个共享的资料库,但是您又不想因为如此而要建立一套完整的   
Access 安全系统,您有二个选择:<br>  
<br>  
第一个:<br>  
<br>  
您可以在资料库中建立一个 &quot;Login Table&quot;,每次使用者进入或离开系统时就   
Update 这个 Table.&nbsp;<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 &quot;MSLDBUSR.DLL&quot; (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 &quot;MSLDBUSR.DLL&quot; (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 &quot;MSLDBUSR.DLL&quot; (lpszUserBuffer()   
_<br>  
As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer<br>  
<br>  
Declare Function LDBUser_GetError Lib &quot;MSLDBUSR.DLL&quot; (ByVal nErrorNo   
As Long) As String<br>  
<br>  
Sub MAIN()<br>  
Dim psMDBFilename As String<br>  
psMDBFilename = InputBox(&quot;请输入资料库名称:&quot;)<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 &quot;No Users.&quot;<br>  
GoTo Exit_ShowUsers<br>  
End If<br>  
<br>  
'若有错误则显示错误讯息<br>  
If (cUsers &lt; 0) Then<br>  
psError = LDBUser_GetError(cUsers)<br>  
Debug.Print &quot;Error #:&quot;; cUsers; &quot;--&quot;; psError<br>  
GoTo Exit_ShowUsers<br>  
End If<br>  
<br>  
'显示使用者阵列<br>  
For iLoop = 1 To cUsers<br>  
Debug.Print &quot;User &quot;; iLoop; &quot;:&quot;; 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 + -