下面的一段代码,用的是RichText控件,实现的是RichText文本中字符串的全部查找并替换功能,在VB中调试时一点错误都没有,但是一旦编译成可执行文件后,执行这一段代码时却总是会出现“运行时错误5,无效的过程调用或参数”的错误信息,然后才出现msgbox的搜索完毕的对话框,点确定后整个可执行文件异常结束!那个错误处理根本就不管用,请教各位大虾这是怎么回事?!
Private Sub cmdReplaceAll_Click()
On Error GoTo er1:
Dim s1 As String, s0 As String, s2 As String, t As Integer
t = 0
s1 = txtS1.Text
s2 = txtS2.Text
curN = 0
Dim n As Integer
Do
s0 = frmMain!txtCode.Text
n = InStr(curN + 1, s0, s1)
If n <> 0 Then
frmMain!txtCode.SelStart = n - 1
frmMain!txtCode.SelLength = Len(s1)
frmMain!txtCode.SelText = s2
t = t + 1
curN = n - Len(txtS1.Text) + Len(txtS2.Text)
Else
Me.Hide
MsgBox CStr(t) + "处搜索替换完毕!", vbInformation + vbOKOnly, "完成"
Unload Me
Exit Sub
End If
Loop
Exit Sub
er1:
Me.Hide
MsgBox "未知错误!", vbExclamation + vbOKOnly, "错误"
Unload Me
End Sub
Private Sub cmdReplaceAll_Click()
On Error GoTo er1:
Dim s1 As String, s0 As String, s2 As String, t As Integer
t = 0
s1 = txtS1.Text
s2 = txtS2.Text
curN = 0
Dim n As Integer
Do
s0 = frmMain!txtCode.Text
n = InStr(curN + 1, s0, s1)
If n <> 0 Then
frmMain!txtCode.SelStart = n - 1
frmMain!txtCode.SelLength = Len(s1)
frmMain!txtCode.SelText = s2
t = t + 1
curN = n - Len(txtS1.Text) + Len(txtS2.Text)
Else
Me.Hide
MsgBox CStr(t) + "处搜索替换完毕!", vbInformation + vbOKOnly, "完成"
Unload Me
Exit Sub
End If
Loop
Exit Sub
er1:
Me.Hide
MsgBox "未知错误!", vbExclamation + vbOKOnly, "错误"
Unload Me
End Sub
另外要实现你所想要的功能,上述代码似乎复杂化了,而且好象在结束后并不能保证全文不再出现要被替换的串。
还有do...loop是不是少了条件(condition)?
frmMain!txtCode.Text这样的,可能我說的不對.
frmmain.txtcode.text
已试过,编译为P代码也不行;另外由于该窗体中除了“全部替换”外还有“替换”按钮(替换时也出现同样错误),无法用Replace来实现。To province_(雍昊):
应该不是这个参数的问题,因为在VB环境中调试时根本不会出现错误,但是编译为exe以后执行与调试时相同的替换操作时就会出错,而且错误处理也不会被执行,这是我最想不通的地方!代码或许啰嗦点,因为这个替换窗口是总在最前的,不得不先hide再msgboxTo faysky2():
frmmain本来就show着的啊,unload这个替换窗口后应该不会去执行frmMain_Load啊
这句有可能出现问题
如当n为1时,len(txts1.text)为4,len(txts2.text)为3
这时curn的结果就是-1
当循环到n = InStr(curN + 1, s0, s1)这句时curN + 1=0
OK,它出错了~~所以还是建议用replace函数好得多
比如我打开一个3K左右的文件,把里面的0全部替换成1,在VB环境中会顺利替换成功,提示11处被替换,但是编译成exe文件以后,同样打开这个文件,把0全部替换成1,就会出现“运行时错误5,无效的过程调用或参数”的错误信息,确定后才出现11处被替换的提示,而此时点击确定按钮后会退出整个可执行文件!
n = n - Len(txtS1.Text) + Len(txtS2.Text)
下一次的搜索开始位置
Option Explicit
Private Sub cmdReplaceAll_Click()
On Error GoTo er1:
Dim s1 As String, s0 As String, s2 As String, t As Integer
t = 0
s1 = txtS1.Text
s2 = txtS2.Text
Dim n As Integer
Do
s0 = Me!txtCode.Text
n = InStr(curn + 1, s0, s1)
If n <> 0 Then
Me!txtCode.SelStart = n - 1
Me!txtCode.SelLength = Len(s1)
Me!txtCode.SelText = s2
t = t + 1
n = n - Len(txtS1.Text) + Len(txtS2.Text)
Else
Me.Hide
MsgBox CStr(t) + "处搜索替换完毕!", vbInformation + vbOKOnly, "完成"
Unload Me
Exit Sub
End If
Loop
Exit Sub
er1:
Me.Hide
MsgBox "未知错误!", vbExclamation + vbOKOnly, "错误"
Unload Me
End Sub
1、该段代码在VB的调试环境中无论怎样运行都不会发生错误,然而一旦编译成exe文件后就会出错,虽然执行的替换操作是一模一样的;
2、运行exe文件时,当出现“运行时错误5,无效的过程调用或参数”的错误信息后,点“确定”后程序并不会立刻退出,而是继续往下运行,至出现 "xx处搜索替换完毕!"的对话框,点确定后整个程序才异常结束退出!
小弟不懂VB,来此学习
看到你的问题想试着回答一下,错了表怪我VB代码有没有错或是其它的什么小弟就不知道了
不过你的错误我是很熟悉的
检查一下你的程序里有没有连接数据库的地方吧,不是连接数据库的方法错误,就是有对数据库进行操作时传递的参数错误
特别是SELECT操作时,可能某个参数的值为NULL,将会报此错误
不是的话表拍我
我的这个程序没有涉及到数据库操作,但是非常谢谢你的参与!To homezj(小吉):
你真神了,分析得非常正确,我正是在frmMain的Active()事件中有个txtCode.SetFocus导致了这个错误,问题终于解决了,非常感谢你的解答,既解决了我多日来的难题,又让我学到了一个新知识!