有一段工作代码,需要显示其工作进度!但是工作的进度需要在另一个模式对话框中显示,该如何实现啊?
解决方案 »
- DATAGRID突然不能用了
- 对于clear_zero我要说两句
- 关于ADO问题!跪求帮忙啊!!分数送光都无所谓啊!
- [再开一帖,为求心服!!!代码见内!!]用API在VB中实现10ms定时器,编译以后就可能错误退出,VB做不10ms定时器吗??
- 一个ACCESS数据连接问题
- 数据库查询语句写法有什么格式要求么?
- 用winsock连接出错后,如何重新连接???
- sql server2000如何将图片,写入数据库中[在线等待]谢谢
- 关于help的问题~
- 深港两地如何共享SQL7数据?
- 执行sql语句的问题!!!!!!!!急!!!!!
- Is anyone know how to not resize the column of listview?
而且在新线程中,访问主线程的对象(如控件、ADO对象等)必须手动做列集处理
那是顶级COM高手才能玩得转的所以还是不用模式对话框现实一点
http://dev.csdn.net/develop/article/13/13308.shtm
只有等到模态窗口关闭时,该消息循环才终止,这时函数才返回
所以模态窗口显示时,以前的工作必然冻结
其实还有另外一个办法:
由于当模态对话框显示时会不断发送WM_ENTERIDLE消息
挂接WH_MSGFILTER钩子
在该钩子的回调函数中判断WM_ENTERIDLE消息,然后处理一小部分工作(不能太长,要不然会卡)但是这样需要把一个简单的循环分散了来写,对程序员的代码架构水平是很严峻的考验
综上所述,不用模态对话框是最简单方法
把其它窗体中你不想让他接收的消息拦截掉即可,这个需要进行子类处理了
参考:
http://discuss.fogcreek.com/joelonsoftware3/default.asp?cmd=show&ixPost=104273
把Form1中变化的数据做个接口,Form2(模态窗口)显示时,以前的工作必然冻结) 中加个定时器访问那个接口就可以了!至于接口就很方便了,有多种方法。
//http://discuss.fogcreek.com/joelonsoftware3/default.asp?cmd=show&ixPost=104273
DoEvents的本质就是处理线程积压消息,所以DoEvents循环就是消息循环
还是需要将代码分散,原来只需要简单写个循环就行而且Timer的触发频率低,无法有效的利用CPU资源
Option Explicit
Dim i As LongPrivate Sub Command1_Click()
Form2.Show vbModal
DoEvents
End SubPrivate Sub Timer1_Timer()
i = i + 1
Form2.Label1 = i
End Sub
其实这是个题目!而且题目明确要求是一定要用 show vbmodal 来显示模式对话框
别人要求这么做,我也没办法啊,所以来这里问.
只有MsgBox才会导致时钟停止
关键是在Timer中是不适合做繁重工作
再详细一点描述一下要求在from1中设计一个循环,从1到100000递增,并且将其显示在一个本文框中
当用户点击“start”按钮开始这个循环
开始循环的时候必须显示一个模式对话框(form2)(必须用 show vbModal),form2上有一个进度条和一个结束按钮,进度条显示循环的进度,当用户点结束按钮的时结束循环。
这样行不:
Form1:
Public Sub ForValues(ByVal n As Long, ByVal v As Integer)
Dim i As Long
For i = 1 To n
DoEvents
Form1.Text1.Text = i
If Form2.b = False Then Exit Sub
Form2.Pb.Value = i / v
Next i
End SubPrivate Sub Command1_Click()
Form2.Show vbModal
End SubForm2:
Public b As BooleanPrivate Sub Command1_Click()
b = False
Unload Me
End SubPrivate Sub Form_Activate()
Dim n As Long
Dim v As Integer
b = True
Pb.Max = 100
Pb.Min = 0
Pb.Value = 0
n = 100000
v = 1000
Call Form1.ForValues(n, v)
End Sub?????
Private Sub Timer1_Timer()
i = i + 1
Form2.Label1 = i
End Sub
提供几个公开方法
SetMax
SetValue然后SetWindowPos 放在最上层