标题VB编俱乐部
栏目软件世界
作者庞一鸣
发布1999年第24期13版
大家好,版主我最近有两大喜事:一是我的女儿刚过了三周岁的生日(可是,我这个做爹的那天却无法回家,谨以本期内容作为给她的生日祝福,祝她健康成长、美丽聪明!)二是VBForums 的首期网上HTML 版本终于新鲜出炉了。大家提交问题或解答问题,可使用 VBForums@126.com 或 VBForums@bigfoot.com邮件地址,也可以通过访问网站 http://VBForums.yeah.net 在 BBS板上讨论。订阅VBForums请向 sub-vbforums@e-lists.lawton.com.cn 发送一封空白信即可。
问题1:(难度系数:初级)
我用ADO访问ACCESS数据库时用AddNew方法往里添加一条纪录,但当输入不符要求的数据时,ado会引发一个异常,这时我应该在异常处理中废弃当前纪录,重新加入新的记录;可实际上,我发现什么也做不了了,任何操作(如cancleUpdate,update,move,AddNew)都返回错误或引发异常,我可以确定权限和共享都正确,怀疑是ado的缓冲机制有bug,请哪位高手指点。
答:在操纵记录时应对各种可能出现的错误做相应的陷阱处理。根据错误号代表的含义来改正错误,如:
on error goto ErrorCode
rst001.AddNew 或 rst001.Update ....
…
exit Sub
ErrorCode:
Select case Err.Number
Case 94
Msgbox "Null无效错误"
Case 461
MsgBox "指定的格式与数据格式不匹配"
Case ErrNumber
…
End Select
问题2(难度系数:初级)
如何打开加密的数据库(access)?
答:打开加密的ACCESS采用如下命令:
Set Db = WS.OpenDatabases ("MyDBFile.mdb",False,False,";PWD=密码")
(记住前面有个分号。)
问题3(难度系数:中级)
如何使用MSCOMM32.OCX发送大于80H的字符,可否给个示例程序?
答:该接发方式为
MSComm1.InputMode=comInputModeBinary
如发一个A0H
Dim TxData(0) As Byte
TxData(0)=&HA0
MSComm1.Output=TxData
这是接收方寄存器为8位的情况,如为16位,则:
Dim TxData(1) As Byte
TxData(0)=&HA0
TxData(1)=&H0
MSComm1.Output=TxData
问题4(难度系数:中级)
我有一程序,将生成一个数据文件,生成之后要将该文件以附件的方式发到指定的信箱。现在我要在程序上直接提供发送按钮,调用默认的邮件处理程序将附件发送,并附上主题和简单的内容。不知如何实现?
答:可使用MAPISESSION、MAPIMESSAGES控件实现调用默认的支持MAPI的电子邮件如OUTLOOK EXPRESS、EXCHANGE。其中MAPISESSION实现登录、MAPIMESSAGES实现信息操作。
MAPISession1.signon
MAPIMessages1.SessionID = MAPISession1.SessionID
MAPIMessages1.Compose '创建一封新的消息
MAPIMessages1.RecipAddress = "xxx@aaa.com"
MAPIMessages1.AddressResolveUI = True
MAPIMessages1.ResolveName
MAPIMessages1.MsgSubject = Trim(txtSubject)
MAPIMessages1.MsgNoteText = Trim(txtText)
MAPIMessages1.AttachmentPathName = "c:\Detlog.txt" 'attach file location
MAPIMessages1.Send'发送
MAPISession1.SignOff
详见vb5.0 onlinebook。(由lsh提供答案)
问题5(难度系数:中级)
用VB生成EXE文件后,如何在后面加上参数?这个参数怎样传给VB?(就像:notepad c:\vb.txt 一样)
答:对于使用 Visual Basic 开发并编译为 .exe 文件的应用程序,VB提供了一个Command 对象,该对象返回出现在命令行中应用程序名之后的任何参数。下面函数演示了如何获取参数的所有技术细节。
Function GetCommandLine(Optional MaxArgs)
'声明变量。
Dim C, CmdLine, CmdLnLen, InArg, I, NumArgs
'检查是否提供了 MaxArgs 参数。
If IsMissing(MaxArgs) Then MaxArgs = 10
' 使数组的大小合适。
ReDim ArgArray(MaxArgs)
NumArgs = 0: InArg = False
'取得命令行参数。
CmdLine = Command()
CmdLnLen = Len(CmdLine)
'以一次一个字符的方式取出命令行参数。
For I = 1 To CmdLnLen
C = Mid(CmdLine, I, 1) '检测是否为 space 或 tab。
If (C <> " " And C <>vbTab) Then
'若既不是 space 键,也不是 tab 键,则检测是否为参数内含之字符。
If Not InArg Then
'新的参数。检测参数是否过多。
If NumArgs = MaxArgs Then Exit For
NumArgs = NumArgs + 1
InArg = True
End If
'将字符加到当前参数中。
ArgArray(NumArgs) = ArgArray(NumArgs) + C
Else
'找到 space 或 tab。将 InArg 标志设置成 False。
InArg = False
End If
Next I
ReDim Preserve ArgArray(NumArgs) '调整数组大小使其刚好符合参数个数。
GetCommandLine = ArgArray() '将数组返回。
End Function
问题6:(难度系数:高级)
我现在编了一个屏幕保护程序,但不能拦截"ctrl+alt+del"的操作,不知如何处理?
答:需要调用API函数"SystemParametersInfo"拦截"ctrl+alt+del","ctrl+esc","alt+tab"三组热键。将以下代码加入你的一般模块:
Option Explicit
Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" _
(ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByValfuWinIni As Long) As Long
Public Const SPL_SCREENSAVERRUNNING = 97
以下加入你的窗体
Option Explicit
'读取窗体时使热键失效
Private Sub Form_Load()
SystemParametersInfo SPL_SCREENSAVERRUNNING, True, ByVal 1&, 0
End Sub
'程序退出时使热键有效
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
SystemParametersInfo SPL_SCREENSAVERRUNNING, False, ByVal 1&, 0
End Sub
切记:一定要一起使用,否则使热键失效后,只有重新启动Windows热键才会恢复。(由HBG提供解答)