建个项目,两个窗体,form1上放个文本框,按钮各一个,然后拷上我的几行代码,就会重现怪现象

kanzm 2009-02-04 04:50:23
建个项目,两个窗体,form1上放个文本框,按钮各一个,然后拷上我的几行代码,就会重现怪现象
这些代码在vb6环境中运行完全正常,但是编译为exe后就会报错:运行时错误‘5’,无效的过程调用或参数,
现在任何人都可以还原这个现象。


Option Explicit

'这个程序编译成exe执行就会报错,真是怪了,原因是什么呢?
Private Sub Command1_Click()
'注form2是一个空窗体,什么也没有
Form2.Show vbModal
MsgBox "现在如果是exe文件就已经出错了,然后会异常关闭!运行时错误5,无效的过程调用或参数"

End Sub

Private Sub Form_Activate()
Text1.SetFocus
End Sub

Private Sub Form_Load()
Command1.Caption = "点我一下试试"
End Sub
...全文
181 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2009-02-05
  • 打赏
  • 举报
回复
已经回复了:http://topic.csdn.net/u/20090204/09/93485a85-4010-44c6-b392-8d4073f4b597.html
Simao 2009-02-05
  • 打赏
  • 举报
回复
修改一下:
Private Sub Form_Load()
把Text1.SetFocus 改为Text1.TabIndex = 0
Command1.Caption = "点我一下试试"
End Sub
Simao 2009-02-05
  • 打赏
  • 举报
回复
LZ你的理解不对,按你提的要求把你的代码修改如下:
Private Sub Command1_Click()
'注form2是一个空窗体,什么也没有
Form2.Show vbModal
MsgBox "现在如果是exe文件就已经出错了,然后会异常关闭!运行时错误5,无效的过程调用或参数"
Text1.SetFocus
End Sub

Private Sub Form_Activate()
Text1.SetFocus
End Sub

Private Sub Form_Load()
Text1.SetFocus
Command1.Caption = "点我一下试试"
End Sub
红色是我改的内容,把Form_Activate函数删除!
kanzm 2009-02-05
  • 打赏
  • 举报
回复

form2.show vbmodal
后加上一句
doevents
也可以,加上后编译成exe也不报错了。
呵呵。
kanzm 2009-02-04
  • 打赏
  • 举报
回复
好象模式窗体2关闭时,会接着显示
msgbox
然后再将焦点移到form1上呀,
这样理解对吗?
如果这样的话,按理说应该可以执行到窗体1的
form_activate事件呀,为何实际上无法正常执行
form_activate事件呢?
vbman2003 2009-02-04
  • 打赏
  • 举报
回复
在属性窗口中,将text1的tabindex设置为0,然后去掉:
Private Sub Form_Activate()
Text1.SetFocus
End Sub

这样可以达到你要的效果.....
fzx4936 2009-02-04
  • 打赏
  • 举报
回复
text1.setfocus --->text1.tabindex=0
Simao 2009-02-04
  • 打赏
  • 举报
回复
我刚才调试了,是Text1.SetFocus 中的SetFocus的问题,msdn中对setfocus的说明是这样的焦点只能移到可视的窗体或控件。因为在窗体的 Load 事件完成前窗体或窗体上的控件是不可视的,所以如果不是在 Form_Load 事件过程完成之前首先使用 Show 方法显示窗体的话,是不能使用 SetFocus 方法将焦点移至正在自己的 Load 事件中加载的窗体的。
当你操作了command1按钮后,进入模态窗体form2是正常的,当你关闭form2后,卸载form2,此时form1获得焦点,此时再次调用form_activate函数,而没有调用form_load函数,正是因为此时没有调用form_load函数,而只调用了form_activate函数,而form_activate函数中用到了SetFocus函数,所以出错,严格的说是当form2退出后text1对象没有装载所导致的错误.
king06 2009-02-04
  • 打赏
  • 举报
回复
form_activate删掉也是使 Command1_Click()事件发生后结束了程序,所以不报错,因为form2关闭后form1获得焦点触发了它;;; 最简单的方法:去掉VBmodal
king06 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 djj315 的回复:]
当 Show 在显示无模式窗体时,随后遇到的代码则要执行。当 Show 在显示模式窗体 (modal form) 时,则随后的代码直到该窗体被隐藏或卸载时才能执行。
[/Quote]
他说的意思很明确,你试下 我说的方法,要么注释掉"msgbox……" 使 Command1_Click()下面没有可执行的代码了,要么去掉 VBMODAL
kanzm 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 king06 的回复:]
是你的“vbModal”的问题,不要它就没有问题
[/Quote]

应该不是它的问题,请看楼上我的说明。
kanzm 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 djj315 的回复:]
LZ 我刚才用你的代码做了实验,一切正常啊!
至于点击Command1按钮后,当关闭Form2时弹出"现在如果是exe文件就已经出错了,然后会异常关闭!运行时错误5,无效的过程调用或参数"提示,那是正常的,请看msdn中show 的说明:当 Show 在显示无模式窗体时,随后遇到的代码则要执行。当 Show 在显示模式窗体 (modal form) 时,则随后的代码直到该窗体被隐藏或卸载时才能执行。
[/Quote]

你没明白我的意思,我是说我的代码在vb6环境中不报错,运行一点问题都没有,但是在编译为exe会就会出错。
注:msgbox 后面的话,是我加的,为了说明我的情况的。

我发现是在form_activate事件中写:
text1.setfocus
的原因,将这句去了就行了,但是我不明白为什么,
难道设置文本框焦点不能写在form_activate事件中吗?就会出现意想不到的错误吗?
最可怕的是在调试时不出问题,但是编译为exe后就出问题,这才太可怕了。
Simao 2009-02-04
  • 打赏
  • 举报
回复
LZ 我刚才用你的代码做了实验,一切正常啊!
至于点击Command1按钮后,当关闭Form2时弹出"现在如果是exe文件就已经出错了,然后会异常关闭!运行时错误5,无效的过程调用或参数"提示,那是正常的,请看msdn中show 的说明:当 Show 在显示无模式窗体时,随后遇到的代码则要执行。当 Show 在显示模式窗体 (modal form) 时,则随后的代码直到该窗体被隐藏或卸载时才能执行。
king06 2009-02-04
  • 打赏
  • 举报
回复
是你的“vbModal”的问题,不要它就没有问题
king06 2009-02-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 kanzm 的帖子:]
建个项目,两个窗体,form1上放个文本框,按钮各一个,然后拷上我的几行代码,就会重现怪现象
这些代码在vb6环境中运行完全正常,但是编译为exe后就会报错:运行时错误‘5’,无效的过程调用或参数,
现在任何人都可以还原这个现象。


VB code
Option Explicit

'这个程序编译成exe执行就会报错,真是怪了,原因是什么呢?
Private Sub Command1_Click()
'注form2是一个空窗体,什么也没有
Form2.Show vb…
[/Quote]
'MsgBox "现在如果是exe文件就已经出错了,然后会异常关闭!运行时错误5,无效的过程调用或参数"

kanzm 2009-02-04
  • 打赏
  • 举报
回复
我将下面代码删除就正常了,
Private Sub Form_Activate()
Text1.SetFocus
End Sub
可是我必须要在窗体启动后设置焦点呀。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧