登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

VB使用大全 - 12  

2007-09-08 14:37:19|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

186、谁终结了我的程序?

您开发的应用程序或许写得非常完整,您也很满意,但有时候却莫名其妙地出现了一点问题,在不该结束程序的时候,它被强迫结束了!可能使用者是按下了 Ctrl + Alt + Del,使用 Microsoft Windows 工作管理员关闭应用程序,或者强迫关机了!然而您的程序却没有考虑到这一点。

在正常情况下要结束一个表单,会经过三个事件 (当您使用 End 结束程序时是例外!),顺序如下:

1、Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

2、Private Sub Form_Unload(Cancel As Integer)

3、Private Sub Form_Unload(Cancel As Integer)

在这三个事件中都允许您设定 Cancel=True 来避免表单被结束,但是它们是不分青红皂白的,唯一能让您分辨表单为什么被结束的,就是在 Form_QueryUnload 中的 UnloadMode 参数!

unloadmode 参数返回下列的值:

常数 值 描述

vbFormControlMenu 0 使用者从表单上的控制功能表中选取「关闭」指令。

vbFormCode 1 Unload 陈述式被程序代码呼叫。

vbAppWindows 2 目前 Microsoft Windows 作业环境任务结束。

vbAppTaskManager 3 Microsoft Windows 工作管理员正在关闭应用程序。

vbFormMDIForm 4 因为 MDI 表单正在关闭的缘故,MDI 子表单正在关闭。

vbFormOwner 5 表单因其拥有人关闭而关闭。

所以下次您就可以在 Form_QueryUnload 中利用 UnloadMode 参数来判断程序是否 要做什么特别处理!

187、完全模拟【开始】中的【关机】功能

在【问题:如何从您的应程序中结束 Windows 重开机?】我们曾经提到过,如何由程序中强迫关机、重开机,但是在这个主题中,我们要告诉您的,是如何模拟按下了【开始】中的【关机】选项,屏幕变成灰灰一片,并且在屏幕中央出现【关闭 Windows】问话框!

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

Declare Function SHShutDownDialog Lib "shell32" Alias "#60" (ByVal lType As Long) As Long

Public Const EWX_LOGOFF = 0

Public Const EWX_SHUTDOWN = 1

Public Const EWX_REBOOT = 2

Public Const EWX_FORCE = 4

Public Const EWX_POWEROFF = 8

要 Show 出【关闭 Windows】问话框时用法如下:

SHShutDownDialog EWX_SHUTDOWN

188、如何将桌面上所有的视窗最小化?

有很多好用的桌面工具软件都有提供这个功能,将桌面上所有的视窗最小化,也会提供将它们复原的功能,当然,要提供这种功能的软件,执行后都是将程序缩到桌面右下角的工具列中,使用 Menu 来操控,否则,将桌面上所有的视窗最小化,也包括它自己的程序本身的视窗的!

'请在视窗声明区中加入以下声明及模组:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const WM_COMMAND As Long = &H111

Private Const MIN_ALL As Long = 419

Private Const MIN_ALL_UNDO As Long = 416

Public Sub MinimizeAll()

Dim lngHwnd As Long

lngHwnd = FindWindow("Shell_TrayWnd", vbNullString)

Call PostMessage(lngHwnd, WM_COMMAND, MIN_ALL, 0&)

End Sub

Public Sub RestoreAll()

Dim lngHwnd As Long

lngHwnd = FindWindow("Shell_TrayWnd", vbNullString)

Call PostMessage(lngHwnd, WM_COMMAND, MIN_ALL_UNDO, 0&)

End Sub

'而实际使用之范例如下:

Private Sub Command1_Click()

MinimizeAll '将桌面上所有的视窗最小化

End Sub

Private Sub Command2_Click()

RestoreAll '将最小化的视窗还原

End Sub

189、如何动态新增、移除 ODBC DSN?

一般我们建立 Client 端 DSN 都是在使用者的机器上进入【控制台】【ODBC 资料来源管理员】去建立,但是如果我们开发的 APP 使用者很多时,这就有点累人了,所以我们可以将这个动作放在程序中!

新增 DSN 的方法有二种:

1、使用 DBEngine 物件的 RegisterDatabase 方法

2、呼叫 SQLConfigDataSource API

不管使用以上任何一种方法新增 DSN,一共会写入二个地方,一个是注册表,一个是 ODBC.INI。

而删除 DSN 的方法同上面的第二种方法,呼叫 SQLConfigDataSource API。

以下之模组以 Oracle73 Ver 2.5 为例,在 Form 的声明区中加入以下声明及模组:

Private Const ODBC_ADD_DSN = 1 ' Add data source

Private Const ODBC_CONFIG_DSN = 2 ' Configure (edit) data source

Private Const ODBC_REMOVE_DSN = 3 ' Remove data source

Private Const vbAPINull As Long = 0& ' NULL Pointer

Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Long, ByVal fRequest As Long, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

Public Sub CreateDSN(sDSN As String)

Dim nRet As Long

Dim sDriver As String

Dim sAttributes As String

sDriver = "Oracle73 Ver 2.5"

sAttributes = "Server=Oracle8" & Chr$(0)

sAttributes = sAttributes & "DESCRIPTION=" & sDSN & Chr$(0)

'sAttributes = sAttributes & "DSN=" & sDSN & Chr$(0)

sAttributes = sAttributes & "DATABASE=DBFinance" & Chr$(0)

sAttributes = sAttributes & "Userid=Scott" & Chr$(0)

'sAttributes = sAttributes & "PWD=myPassword" & Chr$(0)

DBEngine.RegisterDatabase sDSN, sDriver, True, sAttributes '注一

'nRet = SQLConfigDataSource(vbAPINull, ODBC_ADD_DSN, sDriver, sAttributes) '注二

End Sub

Public Sub DeleteDSN(sDSN As String)

Dim nRet As Long

Dim sDriver As String

Dim sAttributes As String

sDriver = "Oracle73 Ver 2.5"

sAttributes = sAttributes & "DSN=" & sDSN & Chr$(0)

nRet = SQLConfigDataSource(vbAPINull, ODBC_REMOVE_DSN, sDriver, sAttributes)

End Sub

'假设要产生的 DSN 为 Test,实际使用范例如下:

Private Sub Command1_Click()

CreateDSN "Test"

End Sub

Private Sub Command2_Click()

DeleteDSN "Test"

End Sub

'而写到系统的资料如下:

1、ODBC.INI

[ODBC 32 bit Data Sources]

Test=Oracle73 Ver 2.5 (32 bit)

[Test]

Driver32=C:\ORAWIN95\ODBC250\sqo32_73.dll

2、注册表

机码:HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources

名称:Test 资料:Oracle73 Ver 2.5

机码:HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\Test

名称:Description 资料:Test

名称:Driver 资料:C:\ORAWIN95\ODBC250\sqo32_73.dll

名称:Server 资料:Oracle8

名称:UserId 资料:Scott

※注一及注二可任选一种,只要将不使用的方法 Mark 起来即可!

※若您想使用其他之资料库,只要将以上模组稍作修改即可!

190、如何从全路径文件名中分别抓出路径及文件名?

这是一个很简单很常碰到的问题,只要有用到文件的程序常常都会需要处理这样的问题!既然很简单为什么还要提出这样的问题呢?没错,是很简单,但是我的着眼点是:它太常出现了,值得做成模组!

要解决这个问题,第一个要了解的就是全路径文件名称的构成要素:磁盘代号、目录名称、文件名称,而这三个组成要素之间,都是使用反斜线符号 (即 "\") 分开!

所以,要从全路径文件名中分别抓出路径及文件名,第一件事就是要找到从右边倒数的第一个反斜线符号!

不多说,直接来看看模组及实例:

'模组:抓出路径

Function ExtractDirName(PathName As String) As String

Dim X As Integer

For X = Len(PathName) To 1 Step -1

If Mid$(PathName, X, 1) = "\" Then Exit For

Next

ExtractDirName = Left$(PathName, X - 1)

End Function

'模组:抓出文件名

Function ExtractFileName(PathName As String) As String

Dim X As Integer

For X = Len(PathName) To 1 Step -1

If Mid$(PathName, X, 1) = "\" Then Exit For

Next

ExtractFileName = Right$(PathName, Len(PathName) - X)

End Function

'使用实例:

Private Sub Command1_Click()

Dim PathName As String

PathName = "C:\倪匡小说原稿\未整理小说\黄金故事.txt"

Text1.Text = ExtractFileName(PathName) ' 黄金故事.txt

Text2.Text = ExtractDirName(PathName) ' C:\倪匡小说原稿\未整理小说

End Sub

191、一个快速注册 DLL 及 OCX 的方法

有时候我们在 VB 中要引用某一个 DLL 或 OCX 时,会出现文件未注册的讯息,这时,我们可以使用人工注册的方法,也就是直接在命令列中使用 regsvr32.exe 来做,做法如下:

文件注册:C:\Windows\System\Regsvr32.exe C:\Windows\System\Test.ocx

取消注册:C:\Windows\System\Regsvr32.exe /u C:\Windows\System\Test.ocx

这些动作我们也可以直接写到程序中,使用 Shell 来执行,但是我现在要说的,都不是上面提到的方法!

注意看罗!方法如下:

1、在资源管理器中找到 C:\Windows\System\Regsvr32.exe 并【复制】 ( 按鼠标右键选复制 )

2、将目录移到 C:\Windows\SendTo 后,执行【贴上快捷方式】 ( 按鼠标右键选贴上快捷方式 )

3、将快捷方式名称改成【REGISTER】

4、OK

现在,如果您想替某一个文件做注册动作,例如:C:\Windows\System\Test.ocx,您只要打开资源管理器,找到 C:\Windows\System\Test.ocx,按鼠标右键选【传送到】【REGISTER】即可完成注册动作了!

注:有一个地方要注意的是,Regsvr32.exe 只能注册 32 位的文件!如果要用它来注册 16 位的文件,会有错误讯息产生。

192、如何在程序中设定打印机的打印方向?

当您在使用 VB6 中的 DataReport 时,有没有遇到过一种情形:系统设定的打印机打印方向预设是直印,而您的报表却是横式的,但是您却无法更改印表机的打印方向,除非您到控制台的打印机中去更改预设为横印!

如果您不希望使用者自行去更改打印机的设定,您就必须在程序中帮他设定好,以下的模组文件 Orient.bas 就是用来设定打印机的直印或横印的,说明如下:

Sub ChngPrinterOrientationLandscape(ByVal frm As Form):设定为直印

Sub ChngPrinterOrientationPortrait(ByVal frm As Form):设定为横印

在程序中使用方式如下:

1、设定为直印:ChngPrinterOrientationPortrait Me

2、设定为横印:ChngPrinterOrientationLandscape Me

193、如何更改在 VB 编辑环境中文件存取的预设路径?

我开发系统时,会将所有系统的原始程序码存放在固定的目录下,例如 c:\work,而各系统的目录就是:

人事系统:c:\work\employee

会计系统:c:\work\account

销售系统:c:\work\sale

所以我会希望在 VB 的编辑环境中,每次做开档、存档时的预设路径是 c:\work,但是 VB 预设的路径却不是如此,通常预设路径就是系统安装的路径,如下:〈指安装时不异动预设路径时〉

VB版本 预设开档、存档的预设路径

VB3: C:\VB

VB4-16: C:\VB4

VB4-32: C:\Program Files\Microsoft Visual Basic

VB5: C:\Program Files\DevStudio\VB

VB6: C:\Program Files\Microsoft Visual Studio\VB98

通常我们都不会直接将文件存在这些目录下,但是您每次开档、存档它总是停在那儿,然后您才开始重新更改目录到您要的路径上,才能存档或开档,这让人有点厌烦,如果您要让预设路径停在某一个您指定的路径,例如 c:\work,作法如下:

1.找到启动 VB 的快捷方式,可能在【开始】【程序集】中或在桌面上! (注一)

2.在快捷方式上按鼠标右键,选【内容】,出现内容问话框。

3.选择第二个页签,就是【快捷方式】页签。

4.将【开始位置】栏之路径改成您要的路径,就 OK 了!

更改完毕之后,下一次您在 VB 编辑环境中,要做开档、存档时的预设路径就是您自己设定的路径了!

注一:找到启动 VB 的快捷方式档的方法如下:

1.如果快捷方式在桌面上,您直接做以上的 4 个动作即可。

2.如果快捷方式是在【开始】【程序集】中,则它们的位置是在 c:\windows\Start Menu 之中。(注二)

注二:要找 c:\windows\Start Menu 之中的快捷方式,有二个方法:

1.直接由资源管理器找到 c:\windows\Start Menu 的目录,再找寻快捷方式。

2.在任务栏上空白处按鼠标右键,选【属性】,出现【任务栏属性】问话框。选择【开始菜单栏】页签,按下【进阶】按钮,会出现【资源管理器--Start Menu】,就可以找到快捷方式档了。

194、如何抓出 Access 的 Table 栏位中的【叙述】部份呢?

不知道大家是否使用过 Microsoft Office 的 Access 来打印过 Access 资料库的文件架构?也就是 Access 的【文件产生器】。如果您没有使用过,现在可以试看看!在 Access 的 Menu 中选择【工具】【分析】【文件产生器】,稍待一会儿就会出现【文件产生器】视窗。

将资料库文件架构印出来,可以方便我们在程序设计时对于资料库的存取,及资料库栏位的比对。不过 Access 虽然有中文版,但是它终究是国外的人开发的产品,我在使用时,就一直有个麻烦,那就是在简式打印时,它对于每一个栏位,只会打印出栏位名称、资料类型及栏位大小。 (缺【叙述】的中文说明)

如果您在设计 Table 时,使用中文为栏位名称,那就没有问题,每一个栏位,只要打印出栏位名称、资料类型及栏位大小就够了,不过据我所知,由于习惯及其他因素(例如: 和其他不同类型的资料库做转移,像 Oracle/SQLServer),许多人还是使用英文来命名栏位,然后在【叙述】中输入中文说明,那样的话【文件产生器】产生的文件就有点不符合 求了,因为它不会印出【叙述】的中文部份!

既然【文件产生器】不太符合某些人的实际需求,而又不想自己做文件,那就只能自己写程序来做了!要如何抓出 Access 的 Table 栏位中的【叙述】部份呢?

以下是一个实际范例,您只要在 Form 中放一个 CommandButton (Command1) 即可:

Dim db As Database

'以下 Function  要二个参数,sTable 是 Table 名称,sField 是栏位名称

Function Getdescription(sTable As String, sField As String) As String

Dim Sna As Recordset

Dim i As Integer

Dim existDescr As Boolean

Set Sna = db.OpenRecordset(sTable, dbOpenTable)

existDescr = False

For i = 0 To Sna(sField).Properties.Count - 1

If Sna(sField).Properties(i).Name = "Description" Then

existDescr = True: Exit For

End If

Next

If existDescr Then

Getdescription = Sna(sField).Properties("Description")

Else

Getdescription = ""

End If

End Function

Private Sub Command1_Click()

Dim x As String

MsgBox Getdescription("AABLE_L", "AABLE_LNO")

End Sub

Private Sub Form_Load()

Set db = opendatabase("c:\hris\ability.mdb") '资料库

End Sub

195、如何叫出 IP 组态视窗?

有人会说,这些资料直接进到【控制面板】的【网路】不是就可以看到了吗?没错,都可以看得到,但是很多公司在替使用者做完网路设定之后,怕使用者进去乱改,造成内部网路连线的问题,都会将控制面板中的部份项目锁定或移除 (使用 System Policy Editor)!其实也不要乱改,不知道各位有没有发现?每次您进到【控制面板】的【网路】中去看一些设定之后,您若按下【确定】按钮,即使您没有更改任何东西,Win95/98 也会重新安装驱动程序,它会要求您放入光碟,这样子有时候就会造成问题!所以每次我看完网路设定之后,总是按【取消】按钮来退出控制面板!

其实 Windows 还有提供一支程序可以让我们看到这些配接卡、网路卡的 IP 设定!那就是 WINIPCFG.EXE。所以只要以下的程序码就可以了:

Private Sub Command1_Click()

Shell "c:\WINDOWS\WINIPCFG.EXE", 1

End Sub

196、如何一次关闭 MDIForm 内的所有子表单?

以下这段程序可以让您一次关闭 MDIForm 内的所有子表单,首先在 MDIForm 中建立一个 Menu,假设取名为 mnuCloseAll,则程序码如下:

Private Sub mnuCloseAll_Click()

'Screen.MousePointer = vbHourglass

Do While Not (Me.ActiveForm Is Nothing)

Unload Me.ActiveForm

Loop

'Screen.MousePointer = vbDefault

End Sub

197、按下 CommandButton 之前后,如何让鼠标停留在同一个物件中?

在一般表单输入画面中,使用者输入了一笔资料后,会去按 '存档' 按钮,当然他也可能去按任一个按钮,但是不管他是按那一个按钮,如果您不在程序中将鼠标移到下一笔输入的第一个栏位,或其他特定的栏位,使用者便必须自己去移动鼠标,如果这个使用者是使用键盘输入,那更是麻烦!他必须使用 Tab 键一个物件一个物件移动光标。

下面这个范例将示范如何做到在按下 CommandButton 之前后,让鼠标停留在同一个物件中!请在表单中放入二个 TextBox 及一个 CommandButton,不必更改任何属性,将以下之程序复制到表单中:

Dim mCtl As Control

Private Sub Command1_Click()

' 在这一个段落中可以执行您想做的动作, 例如存档动作

' 然后将鼠标移回按下 Command1 之前鼠标停留的物件上

On Error Resume Next

mCtl.SetFocus

End Sub

Private Sub Text1_GotFocus()

Set mCtl = Text1

End Sub

Private Sub Text2_GotFocus()

Set mCtl = Text2

End Sub

198、您用过【符号字型】吗?

有时候您是否觉得,同样的开发环境,为什么 Microsoft 写出来的程序,画面总是在某些地方看来特别一点点,例如 CommandButton 的样子就是和我们自己写的不一样,您总是感觉他们的 CommandButton 上放的是图形,其实,在 CommandButton 上的不是图形,只不过是某一种字型而已!而且这些字型在每一台 Windows95 / Windows98 / NT 上都有,如果没有,您只要安装了 IE4 或 IE5 就有了。

举个例子好了,如果您要在 CommandButton 上放一个向右或向左的箭头,不使用图片的话,您会使用【>】【<】,但是您在 Microsoft 写出来的程序中看到的是【4】【3】,为什么呢?因为它用的是一种符号字型,就是 Marlett 字型的 3 【4】及 4【3】!

这些字型在那里呢?在本页的下方列了七种符号字型,每一种字型分别列出了 0-9 / a-z / A-Z 共 62 个字元,如果在某些栏位中您看到的仍然是 0-9 / a-z / A-Z,表示您的电脑中没有这种字型,当然,符号字型不只这七种而已,如果您想知道您的电脑中暗藏多少种符号字型的话,方法如下:

在任何可以设定字型的应用程序中,叫出【字型】设定对话框,我们就用 VB 的开发环境来举例好了:

1、在表单上放一个 Label,Caption 随意输入 0-9 / a-z / A-Z 的字元,在属性表中设定字型 (Font)。

2、在【字型】设定对话框的左上方,您随便选择一种【字型】。

3、看看【字型】设定对话框的右下方,【字集】也会跟著改变!每一种字型会包含一种以上的字集。

4、如果字集中出现的是 symbol,表示这种字型就是符号字型!

5、按下确定按钮,看看 Label 上面的字有何改变,很令人惊讶吧!

6、Marlett 字型的 012345 变成了 012345了!

这些符号字型有的非常精美,下一次要使用图片之前,记得找一找符号字型,使用符号字型不但美观,而且可以避免使用图片,让程序瘦身!

注:符号字型范例

( 由于此页档案太大,怕影响速度,所以移除了部份英文字元,若有需要,请自行测试 )

字型

Marlett

Monotype Sorts

r_symbol

MT Extra

Wingdings

Wingdings 2

Wingdings 3

0

0

0

0

0

0

0

0

1

1

1

1

1

1

1

1

2

2

2

2

2

2

2

2

3

3

3

3

3

3

3

3

4

4

4

4

4

4

4

4

5

5

5

5

5

5

5

5

6

6

6

6

6

6

6

6

7

7

7

7

7

7

7

7

8

8

8

8

8

8

8

8

9

9

9

9

9

9

9

9

a

a

A

a

a

a

a

a

:

:

:

:

:

:

:

:

A

a

A

A

A

A

A

A

:

:

:

:

:

:

:

:

Z

Z

Z

Z

Z

Z

Z

Z

199、避免使用没有效率的 IIF Function 及 Choose Function!

IIF Function 的功能是根据逻辑判断,返回给定的二个值中的一个 (二选一);

Choose Function 的功能是从引数串列中选择并返回一个值 (多选一)。

二个函数的语法如下:

IIf(expr, truepart, falsepart)

Choose(index, choice-1[, choice-2, ... [, choice-n]])

这二个函数乍看之下,好像和 IF....Else IF....Else....End IF 是一样的,没错,结果好像是一样的,但是事实上 IF....Else....End IF 却比较有效率和安全多了,为什么呢?

1、IIf 会计算 truepart 以及 falsepart,虽然它只返回其中的一个,所以您应该要留意这项副作用,

例如,如果 falsepart 会产生除以零的错误,那么程序就会发生错误,即使 expr 为 True。

2、Choose 会计算串列中的每个选择项,即使它只返回一个选项值。所以您应该注意这项副作用,

例如,当您在每个选择项中使用了 MsgBox 函数,那么每计算一个选择项,就会显示一次讯息方块。

而 IF....Else....End IF 却没有上述的缺点!

所以,虽然 IIF 及 Choose Function 的程序码看起来相当简洁,但效率不见得比较好,最重要的,是可能还会导致错误产生。我的建议就是:能不用就不用!

200、如何用TextBox打开和保存文件

作为轻量级的控件,TextBox控件使用率很高,但相关的资料极少谈及如何用TextBox控件打开和保存文件,大都采用回避的态度,对VB初学者带来很多不便。笔者近日为友人做一个英文朗读软件,按友人的要求,软件要能象MS的记事本那样能打开和保存文档。其实实现方法并不复杂,现将心得写出来,希望对大家有帮助。如果您有更好的方法,请来信:handanfang@163.net

'新建标准EXE,加入一个TextBox控件,一个公共对话框,两个菜单。

'打开

Private Sub mnuOpen_Click()

CommonDialog1.Filter = "文档文件(*.txt)|*.txt|所有文件(*.*)|*.*"

CommonDialog1.ShowOpen

Open CommonDialog1.FileName For Input As #1

Text1.Text = StrConv(InputB$(LOF(1), 1), vbUnicode)

Close #1

End Sub

'保存

Private Sub mnuSave_Click()

On Error Resume Next

CommonDialog1.Filter ="文档文件(*.txt)|*.txt|所有文件(*.*)|*.*"

CommonDialog1.ShowSave

Open CommonDialog1.FileName For Output As #1

Print #1, Text1.Text

Close 1

End Sub

TextBox只支持打开64K以下的文件,建议最好设置出错处理。

以上程序在PWin98、VB6.0下调试通过

201、避免使用没有效率的 IIF Function 及 Choose Function!

IIF Function 的功能是根据逻辑判断,返回给定的二个值中的一个 (二选一);

Choose Function 的功能是从引数串列中选择并返回一个值 (多选一)。

二个函数的语法如下:

IIf(expr, truepart, falsepart)

Choose(index, choice-1[, choice-2, ... [, choice-n]])

这二个函数乍看之下,好像和 IF....Else IF....Else....End IF 是一样的,没错,结果好像是一样的,但是事实上 IF....Else....End IF 却比较有效率和安全多了,为什么呢?

1、IIf 会计算 truepart 以及 falsepart,虽然它只返回其中的一个,所以您应该要留意这项副作用,

例如,如果 falsepart 会产生除以零的错误,那么程序就会发生错误,即使 expr 为 True。

2、Choose 会计算串列中的每个选择项,即使它只返回一个选项值。所以您应该注意这项副作用,

例如,当您在每个选择项中使用了 MsgBox 函数,那么每计算一个选择项,就会显示一次讯息方块。

而 IF....Else....End IF 却没有上述的缺点!

所以,虽然 IIF 及 Choose Function 的程序码看起来相当简洁,但效率不见得比较好,最重要的,是可能还会导致错误产生。我的建议就是:能不用就不用!

202、使用一个指令建立目录 (巢状目录)

假设您需要建立目录,不管是在根目录或者是好几层的目录,例如:C:\Dir1\Dir2\Dir3\Dir4 下面这个模组都可以满足您的需求!它只需要一个参数,就是完整的目录名称 (指全路径),例如:"C:\Dir1\Dir2\Dir3\Dir4"。

如果您给的目录中,前几层目录都已经存在,例如:"C:\Dir1\Dir2\",则它只会帮您再往下建立 Dir3 及 Dir4 二层目录而己。除了本机的磁盘之外,您已经 Mapped 的网路磁盘也可以做到!而如果您没有给定磁盘代号,它会将目录建立在应用程序的预设目录之下!

Public Function MkDirs(ByVal PathIn As String) As Boolean

Dim nPos As Long

MkDirs = True '先假设成功

If Right$(PathIn, 1) <> "\" Then PathIn = PathIn + "\"

nPos = InStr(1, PathIn, "\")

Do While nPos > 0

If Dir$(Left$(PathIn, nPos), vbDirectory) = "" Then

On Error GoTo Failed

MkDir Left$(PathIn, nPos)

On Error GoTo 0

End If

nPos = InStr(nPos + 1, PathIn, "\")

Loop

Exit Function

Failed:

MkDirs = False

End Function

'使用范例如下:在 Text1 中输入要建立的目录 (指全路径)

Private Sub Command1_Click()

Dim istrue As Boolean

istrue = MkDirs(Text1)

If istrue Then

MsgBox "目录已成功建立!", 64, "建立目录"

Else

MsgBox "建立目录失败!", 16, "建立目录"

End If

End Sub

'或许您在测试时找不到失败的范例,给您一个提示:将目录建在只读光盘驱动器试试!

  评论这张
 
阅读(877)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018