VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB问题全功略(25)
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10828, 日期:2002-01-28
VB问题全功略(25)

121、取得印表机的连接埠
122、读取及设定文件的属性
123、避免 Null 产生的错误
124、如何找出 Windows 目录的正确路径?
125、如何找出 System 目录的正确路径?

121、取得印表机的连接埠

在测试上一个《问题 100》模拟【网路上的芳邻】及【我的电脑】中的【连线 / 中断网路磁碟机】 (二) 时,我们用到了 WNetConnectionDialog API,这个 API 又让我想到了另一个小功能!

您设定过印表机吗,如果有,在设定印表机时,设定问话框中有一个 Tab 是【详细资料】页,在此页中有一个按钮是让我们《取得印表机连接埠》,WNetConnectionDialog 这个 API 的功能之一就是叫出《取得印表机连接埠》问话框!

注释:一样在声明区中加入以下声明:

Private Declare Function WNetConnectionDialog Lib "mpr.dll" (ByVal hWnd As Long, ByVal dwType As Long) As Long

Sub ShowPrinterPort(hWnd As Long)
WNetConnectionDialog hWnd, 2
End Sub

注释:在程序中使用方法如下:

Private Sub Command1_Click()
ShowPrinterPort Me.hWnd
End Sub

122、读取及设定文件的属性

当我们在任一个文件上按滑鼠右键,选择【内容】,在文件内容的【一般】页签中我们可以看到每一个文件有四个属性:保存、只读、隐藏及系统。

使用 GetFileAttributes 及 SetFileAttributes 二个 API 我们就可以读取及设定这四个属性。

注释:请在声明区中加入以下声明:

注释:设定文件属性
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
注释:读取文件属性
Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long

Const FILE_ATTRIBUTE_READONLY = &H1 注释:设定为只读
Const FILE_ATTRIBUTE_HIDDEN = &H2 注释:设定为隐藏
Const FILE_ATTRIBUTE_SYSTEM = &H4 注释:设定为系统
Const FILE_ATTRIBUTE_ARCHIVE = &H20 注释:设定为保存
Const FILE_ATTRIBUTE_NORMAL = &H80 注释:设定为一般 (取消前四种属性)

注释:要设定二种以上的属性可以用 or 串联以上之属性,来看看例子:

注释:设定 db1.mdb 为只读
SetFileAttributes "c:\db1.mdb", FILE_ATTRIBUTE_READONLY
注释:设定 db1.mdb 为只读 + 隐藏
SetFileAttributes "c:\db1.mdb", FILE_ATTRIBUTE_READONLY Or FILE_ATTRIBUTE_HIDDEN
注释:设定 db1.mdb 为只读 + 隐藏 + 系统 + 保存
SetFileAttributes "c:\db1.mdb", FILE_ATTRIBUTE_READONLY Or FILE_ATTRIBUTE_HIDDEN _
Or FILE_ATTRIBUTE_SYSTEM Or FILE_ATTRIBUTE_ARCHIVE
注释:取消 db1.mdb 所有设定
SetFileAttributes "c:\db1.mdb", FILE_ATTRIBUTE_NORMAL

注释:要读取文件目前的属性,则是用 GetFileAttributes API,以读取 db1.mdb 为例:

MsgBox GetFileAttributes("c:\db1.mdb")

注释:返回值如上面的常数声明值,例如:
注释:若返回值为 6 ( =2+4 ) 表示此文件为 隐藏 + 系统
注释:但是若返回值为 128 表示此文件未设定任何属

123、避免 Null 产生的错误

当我们从资料库读出资料时,有的栏位之内容可能为 Null,若不加以处理而要将资料搬给某一栏位时,会有错误产生,虽然 VB 本身有提供一个 IsNull 函数以供判断,但是您知道吗,我写了这么多年的 VB 资料库程序,从来没有用过 IsNull 来判断资料库栏位值,为什么呢?我又怎么做呢?

其实很简单,我不管从资料库读出来的是不是 Null,写法一律如下:

Text1.text = rs1("Field1") & ""

如果这个栏位的值是 Null,加上 ( & 〃 ) 之後就变成了 "" 了!

但是要小心,我的新同事们常常会犯一个错误,我们看看以下二个式子:

1、Text1.text = Trim(rs1("Field1")) & "" 注释: ( 可能是错的 )

2、Text1.text = Trim(rs1("Field1") & "") 注释: ( 这样写才对 )

第一个式子如果栏位值是 Null,使用 trim$ 便会产生错误,对於这些状况,其实只要记住一个原则即可:

不管从资料库读出之资料要做什么动作,不管三七二十一先加上 ( & 〃 ) 就对了

再来看看一个例子,以加深印象:

Text1.text = Format( (rs1("Field1") & ""), "yymmdd")

124、如何找出 Windows 目录的正确路径?

有时候我们在程序中必须用到 Windows 的目录,以存取 Windows 目录下的文件,照理说,这应该是最简单的功能,前提是每个人在 Setup Windows 必须采用 Windows 的预设目录名称,也就是 C:\Windows,但是常常不是这样,有时候由于要使新旧版本共存,或者其他原因,有人会将 Windows 目录改成 c:\win95、c:\win98、Windows95 或 Windows98......

若是程序中必须用到 Windows 目录,要找到正确的路径,做法如下:

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

Const MAX_PATH = 260

Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public Function GetWinPath()
Dim strFolder As String
Dim lngResult As Long
strFolder = String(MAX_PATH, 0)
lngResult = GetWindowsDirectory(strFolder, MAX_PATH)
If lngResult <> 0 Then
GetWinPath = Left(strFolder, InStr(strFolder, Chr(0)) - 1)
Else
GetWinPath = ""
End If
End Function

注释:在程序中使用方法如下:

Private Sub Command1_Click()
Call MsgBox("您电脑中 Windows 目录的正确路径是: " & GetWinPath, vbInformation)
End Sub

125、如何找出 System 目录的正确路径?

和《问题104》如何找出 Windows 目录的正确路径?一样,由于有很多系统文件都放在 System 目录下,有时候我们在程序中必须用到 System 的目录,以存取 System 目录下的文件,但是有时候由於要使新旧版本共存,或者其他原因,有人会将 Windows 目录改成 c:\win95、c:\win98、Windows95 或 Windows98......

若是程序中必须用到 System 目录,要找到正确的路径,做法如下:

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

Const MAX_PATH = 260

Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public Function GetSystemPath()
Dim strFolder As String
Dim lngResult As Long
strFolder = String(MAX_PATH, 0)
lngResult = GetSystemDirectory(strFolder, MAX_PATH)
If lngResult <> 0 Then
GetSystemPath = Left(strFolder, InStr(strFolder, Chr(0)) - 1)
Else
GetSystemPath = ""
End If
End Function

注释:在程序中使用方法如下:

Private Sub Command1_Click()
Call MsgBox("您电脑中 System 目录的正确路径是:" & GetSystemPath, vbInformation)
End Sub