VBGood网站全文搜索 Google

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

221、如何判断目前文件资源管理器中,文件名称之扩展文件名是显示或隐藏?
222、如何判断某一个公立年是否为润年?
223、如何取得某个数值范围间的随机值?
224、如何建立磁盘 / 目录的共享 (Share)?
225、如何快速建立目录

221、如何判断目前文件资源管理器中,文件名称之扩展文件名是显示或隐藏?

由于我在集团性的资讯处工作,所负责的公司系统有的是属于外点,例如润泰建设有个单位是行销业务处,他们的工作是卖公司盖的房子,所以他们的业务人员平常都是待在各工地的接待中心,我替他们开发的销售系统在工地的部份是属于单机作业的,使用 Access 资料库,每一个星期资料回传总公司一次。

业务人员由于流动性大,不太了解系统,有时候,系统出了问题,业务人员又搞不清楚状况,于是我会要求他们将资料库 sale.mdb 回传公司,结果,常闹笑话,原来他们回传公司的,常常不是 sale.ldb 就是 sale.exe,为什么呢?

原因很简单,因为他们的文件资源管理器中,设定了将扩展文件名隐藏起来,结果只看到三个不同图示的 sale 文件 (分别是 Sale.mdb、Sale.ldb、Sale.exe),不太会操作的业务人员根本分不清楚那一个图示的 sale 文件才是资料库文件案!

我们在 VB 的程序中要如何判断,目前文件资源管理器中的设定是否显示扩展文件名呢?

Private Declare Function GetFileTitle Lib "comdlg32.dll" Alias "GetFileTitleA" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Integer) As Integer
Private Function HasExtension(sFileName As String) As Long
Dim sTemp As String
Dim lTemp As Long

sTemp = String(1, 0)
lTemp = GetFileTitle(sFileName, sTemp, Len(sTemp))
If lTemp < 0 Then HasExtension = -1: Exit Function
sTemp = String(lTemp, 0)
Call GetFileTitle(sFileName, sTemp, Len(sTemp))

If (Left$(Right$(Left$(sTemp, lTemp - 1), 4), 1)) = "." Then
HasExtension = 1
Else
HasExtension = 0
End If
End Function
若有显示扩展文件名,返回值是 1,否则返回0。

222、如何判断某一个公立年是否为润年?

这是一个很简单的问题,只要知道公式,就可以了!

润年公式如下:

若公立年可以被 4 整除, 则很有可能为公立年, 除非..
这个公立年可以被 100 整除, 但是不可以被 400 整除, 就不是润年

测试程序及模组如下:

Public Function IsLeapYear(Yr As Integer) As Boolean
注释:设定预设返回值为 False
IsLeapYear = False
注释:若公立年可以被 4 整除, 则很有可能为公立年, 除非..
注释:这个公立年可以被 100 整除, 但是不可以被 400 整除, 就不是润年
If Yr Mod 4 = 0 Then
IsLeapYear = True
If Yr Mod 100 = 0 Then
If (Yr Mod 400) Then IsLeapYear = False
End If
End If
End Function

注释:在表单中放一个 CommandButton 及一个 TextBox

Private Sub Command1_Click()
If IsLeapYear(Text1.Text) Then
MsgBox "公立" & Text1.Text & "年 是 润年", 64, "是"
Else
MsgBox "公立" & Text1.Text & "年 不是 润年", 64, "不是"
End If

223、如何取得某个数值范围间的随机值?

要取得随机值会用到 Randomize 陈述式及 Rnd 函数,先说明如下: 《取材自 Msdn》

──────────────────────────────────
Randomize 陈述式:初始化随机产生器。语法如下:
Randomize [number]
选择性引数 number 可以是一型态为 Variant 的值或任何数值运算式。

Randomize 使用 number 的值当成新的随机种子来起始随机产生器,若要得到一随机值,则可呼叫 Rnd 函数。如果省略 number,则会以作业系统现在时间来当做新的随机种子。

如果没有呼叫 Randomize 来起始随机产生器,Rnd 函数 (没有引数) 则使用上次呼叫 Rnd 函数所得的随机值当做新的随机种子。
──────────────────────────────────
Rnd 函数:返回一型态为 Single 的值,其内容为一随机值。语法如下:
Rnd [(number)]
选择性引数 number 可以是一型态为 Single 的值,或任何数值运算式。

Rnd 函数返回的随机值介于 0 和 1 之间,可等于 0,但不等于 1。若想产生在某个范围内(非 0 到 1)的随机值,可使用下列公式:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

上述公式中,upperbound 是随机范围的上限,而 lowerbound 则是随机的下限。
──────────────────────────────────

好了,理论说完了,希望您还清醒,来说今天的主题吧!下面的 Random_Number 是完成的模组:

Function Random_Number(ByVal UpperBound As Long, ByVal LowerBound As Long) As Long
Randomize
Random_Number = Int((UpperBound - LowerBound + 1) * Rnd + LowerBound)
End Function

注释:在程序中实际使用的方式如下:

Private Sub Command1_Click()
Dim MyNum As Long
注释:取得 1-100 的随机值
MyNum = Random_Number(100, 1)
Msgbox MyNum
End Sub
注意:或许看上面的理论说明,有一点您还是不很清楚,不过我要再强调一次:

若是您省略掉 Randomize 这个陈述式,而直接使用 Rnd 函数,则当您重复执行程序取随机的功能时,例如一些掷色子的游戏,您每次都会到相同的随机,例如上面的例子,省略掉 Randomize 这个陈述式之后,测试三次结果如下: 《完全相同》

第一次:71,54,58,29,31,78,2,77,82,71,5.....
第二次:71,54,58,29,31,78,2,77,82,71,5.....
第三次:71,54,58,29,31,78,2,77,82,71,5.....


224、如何建立磁盘 / 目录的共享 (Share)?

在【文件资源管理器】或【我的电脑】中,我们都可以直接在磁盘或目录上按滑鼠右键,选【属性】,在【共享】页中设定磁盘或目录的共享,如图:


我在集团的资讯部门工作,要处理一二十家以上的公司系统,在正常的状况下,为了方便,我们在机器交给使用者使用时,会替他们将某个磁盘或某个目录设定可以共享,但是并不是每个使用者都喜欢开放自己的电脑让别人存取,于是他们便会将共享的功能取消,造成资讯人员些许不方便。

这时候,也不必和使用者争得脸红脖子粗的,反正山不转路转,我们就不知不觉地,让使用者自己在莫名其妙的情形下,按照您的意思,在某个磁盘或某个目录设定您想要设定的共享,然后又神不知鬼不觉地取消共享!

要怎么做呢?其实很简单,就是将设定/取消共享的功能写在 VB 程序中,像人事差勤系统是每个使用者都要使用的系统,我们就在这些系统的 VB 程序中,去设定/取消共享!而且使用者完全没有感觉!

下面这个模组文件中 (.bas文件) 已经有完整的声明及完成的二个模组,只要呼叫这二个模组,就可以建立/取消磁盘或目录的资料分享:

源代码下载

这二个模组说明如下:

Public Function CreateShare _ 注释: 建立共享模组
(ByVal sSharePath As String, _ 注释: 完整路径
ByVal sShareName As String, _ 注释: 共享名称
ByVal sRemark As String, _ 注释: 说明
ByVal sROPass As String, _ 注释: 只读密码
ByVal sRWPass As String) As Long 注释: 完整存取密码

Public Function DeleteShare _ 注释: 取消共享模组
(ByVal sShareName As String) As Long 注释: 共享名称

呼叫范例如下:

Private Sub Command1_Click()
注释: 建立共享 CDISK
CreateShare "C:\", "CDISK", "小纪的 C 磁盘", "JWHR", "JWHRW"
End Sub

Private Sub Command2_Click()
注释: 取消共享 CDISK
DeleteShare "CDISK"
End Sub
注:就像一般教人家做坏事的书或电视节目一样,我也要声明一下:
注:以上方式请用于正途 (系统需要),请勿使用以上方法来不当窃取不该看的文件!
225、如何快速建立目录

声明:
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long
函数:
注释:Call CreateNewDirectory("c:\test\directory\vb\tips\")
Public Sub CreateNewDirectory(NewDirectory As String)
Dim sDirTest As String
Dim SecAttrib As SECURITY_ATTRIBUTES
Dim bSuccess As Boolean
Dim sPath As String
Dim iCounter As Integer
Dim sTempDir As String
iFlag = 0
sPath = NewDirectory
If Right(sPath, Len(sPath)) <> "\" Then
sPath = sPath & "\"
End If
iCounter = 1
Do Until InStr(iCounter, sPath, "\") = 0
iCounter = InStr(iCounter, sPath, "\")
sTempDir = Left(sPath, iCounter)
sDirTest = Dir(sTempDir)
iCounter = iCounter + 1
注释:create directory
SecAttrib.lpSecurityDescriptor = &O0
SecAttrib.bInheritHandle = False
SecAttrib.nLength = Len(SecAttrib)
bSuccess = CreateDirectory(sTempDir, SecAttrib)
Loop
End Sub