VBGood网站全文搜索 Google

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

201、避免使用没有效率的 IIF Function 及 Choose Function!
202、使用一个指令建立目录 (巢状目录)
203、如何在资料库中存入单引号?
204、如何算出 TextBox 中目前光标是在第几行?
205、当前操作系统的语言集

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

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

203、如何在资料库中存入单引号?

当您想要新增一笔资料到 Access 或 Oracle 时,若文字栏位中含有单引号,便会产生错误!

在以下的例子中,我们告诉您如何使用 Chr$(34) 将含有单引号之字串存入 Jet database engine 中!

Private Sub CmdAddNew_Click()
Dim dbCustomer As Database 注释: 声明资料库
Dim strSql As String 注释: SQL 字串
Dim strodbc As String 注释: ODBC 字串

注释: 以下为资料库中客户档之三个栏位变量声明
Dim strCustID As String 注释: 客户代码
Dim strFirstName As String 注释: 客户名称
Dim strAddress As String 注释: 客户地址

strodbc = "odbc;uid=scott;pwd=tiger;dsn=myconnect"
Set dbCustomer = OpenDatabase("myconnect", dbDriverNoPrompt, False, strodbc)

strCustID = "A003"
strFirstName = "Annie"
strAddress = "Reflection注释:s"

strSql = "insert into CUSTOMER values(注释:" & strCustID & "注释:"
strSql = strSql & ",注释:" & strFirstName & "注释:,"
strSql = strSql & Chr(34) & strAddress & Chr(34) & ")"

dbCustomer.Execute (strSql)
dbCustomer.Close
End Sub

注释:如果您还想要更详细的资料,您可以参考 Microsoft Knowledge Base 中的 Q147687。

204、如何算出 TextBox 中目前光标是在第几行?

在很多文字编辑器中,都可以告诉您,目前您的光标是在文字编辑器的第几行,我们也来实作一下!

在 Form 中放入一个 TextBox 并将 Multiline 属性设为 True,放入一个 Label 用来显示目前光标所在的行数,在表单声明区中加入以下声明及模组:

Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Const EM_LINEFROMCHAR = &HC9

Function LineNo(txthwnd As Long) As Long
On Local Error Resume Next
LineNo = SendMessageLong(txthwnd, EM_LINEFROMCHAR, -1&, 0&) + 1
LineNo = Format$(lineno, "##,###")
End Function

注释:呼叫这个模组时要导入的是 TextBox 的 hwnd
注释:实际使用时,必须在 TextBox 的以下几个事件中呼叫这个模组,才会完全正确:
注释:1. Change事件:输入资料时可侦测计算
注释:2. Click 事件:用鼠标移动光标时可侦测计算
注释:3. KeyUp 事件:用上下左右键移动光标时可侦测计算

Sub Text1_Change()
Label1 = LineNo(Text1.hwnd)
End Sub

Private Sub Text1_Click()
Label1 = LineNo(Text1.hwnd)
End Sub

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Label1 = LineNo(Text1.hwnd)
End Sub
205、当前操作系统的语言集

声明:
Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
例子:
Dim LocaleID As Long
LocalID = GetSystemDefaultLCID

= &H404 中文繁体(台湾)
= &H804 中文简体(大陆)
= &H409 英文 ...