|
|
|
VB问题全功略(41) |
[上一页](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 英文 ... |
|