这是一个标签打印应用程序。希望通过一个标签中显示的计数器显示进度。即希望它看起来像这样... 1000增量到1001增量到1002,1003等。非常简单的pgm,所以很明显,从开始到结束的处理是即时的。因此,结束号码弹出的权利,而不是 Flink 的排序序列。不需要数字是可读的,而只是模拟过程。因为它是一个打印程序,有时间显示。2在处理结束时,最后的数字应该在屏幕上。3我想也许我可以在更新标签之前用计时器来计时。4我的编码显然是不正确的。5在这里。6任何建议都将不胜感激。我是一个79岁的修补程序员(工作早在COBOL的日子),所以要善良LOL。
Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click
' Print button
Dim toPrint As Integer = Me.NumericUpDown2.Value
Dim RetVal As Object
Dim TopPos As String = "375,200"
Dim InfoPos As String = "360,260"
startNo = TextBox2.Text
For index As Integer = 1 To toPrint
RetVal = RDP.PrintRawData("^XA^LL450^PQ" & arrCust(4) & "^CFB,30^FO" & TopPos & "^FD" & arrCust(5) & StartNo & "^FS^FO" & InfoPos & "^FD" & arrCust(2) & "^FS^XZ")
Timer1.Interval = 1000
Timer1.Start()
startNo += 1
Next
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Label4.Text = startNo
End Sub
1条答案
按热度按时间muk1a3rh1#
问题是循环永远不会将控制权交还给底层的windows事件消息泵,因此在所有操作完成之前,永远没有机会处理任何paint消息来重绘标签。
要解决这个问题,我们首先需要解决两个冲突的语句:
从开始到结束是瞬间的
以及
由于这是一个打印程序,因此有时间进行此显示。
如果第一条语句为真,我会将计时器更改为更频繁地计时(每200毫秒左右;更快只是浪费),并在循环中忍受一个丑陋的
Application.DoEvents
调用,这样标签就有机会重画。(另外:在进入循环之前启动定时器 * 一次 *,而不是在每次迭代时启动)。如果后一种说法是正确的,我将重复关于避免
Application.DoEvents
的常见警告(这个方法有很多“陷阱”),相反,我将以正确的方式来做,并使用BackgroundWorker
component。