进度条

hawk8132007 2010-03-17 02:49:19
我要在项目中(VB.NET2005)新建一个Win form,添加两个控件——Label(正在处理数据) 和 ProgressBar。
当我进行某一数据处理时就调用这个form,然后弹出这个提示语和进度条,数据处理完后关闭提示语和进度条。
这个该怎么做?
或者有更好的进度提示方法?
请在代码中给些注释。
...全文
380 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
billow_chentao 2010-03-23
  • 打赏
  • 举报
回复
不能确定任务进度的情况下就提示“正在处理中...”能确定进度时才显示出进度条。
用以下方法
Me.ProgressBar1.Style = ProgressBarStyle.Marquee
可以让进度条一直来回显示。
billow_chentao 2010-03-23
  • 打赏
  • 举报
回复
在调用的窗口里:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.TaskDialog1.OnTask(Nothing, Nothing)
End Sub
Private Sub TaskDialog1_Task(ByVal sender As Object, ByRef e As GaoControl20.TaskEventArgs) Handles TaskDialog1.Task
Dim i As Integer
Do
i += 1
Debug.Print(i)
'e.Title = i & "运行中..."
e.Percent = i
If i > 300 And i < 700 Then
e.CancelButtonVisible = True
Else
e.CancelButtonVisible = False
End If
If e.Cancel = True Then
MsgBox("取消")
Exit Do
End If
Application.DoEvents()
If i > 1000 Then Exit Do
Loop

End Sub
billow_chentao 2010-03-23
  • 打赏
  • 举报
回复
我是把提示框写成了一个组件,以后的程序加载这个组件即可。

''' <summary>
''' 一个运行任务的事件
''' </summary>
''' <remarks></remarks>
<System.Drawing.ToolboxBitmap("D:\GaoControl20\GaoControl20\Resources\Wait03.gif")> _
Public Class TaskEventArgs
Inherits EventArgs
Public Delegate Sub CancelButtonVisibleHandler(ByVal sender As Object, ByVal e As EventArgs)
Public Delegate Sub CancelHandler(ByVal sender As Object, ByVal e As EventArgs)
Public Delegate Sub TitleHandler(ByVal sender As Object, ByVal e As EventArgs)
Public Delegate Sub PercentHandler(ByVal sender As Object, ByVal e As EventArgs)
Public Event CancelButtonVisibleChange As CancelHandler
Public Event CancelChange As CancelHandler
Public Event TitleChange As CancelHandler
Public Event PercentChange As CancelHandler
Dim _CancelButtonVisible As Boolean
Dim _Cancel As Boolean
Dim _Title As String
Dim _Percent As Single
Public Sub New()
Me._CancelButtonVisible = False
Me._Cancel = False
Me._Title = "运行中,请稍候..."
Me._Percent = 0
End Sub
''' <summary>
''' 任务运行时提示条上是否显示终止按钮
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property CancelButtonVisible() As Boolean
Get
Return Me._CancelButtonVisible
End Get
Set(ByVal value As Boolean)
Me._CancelButtonVisible = value
RaiseEvent CancelButtonVisibleChange(Me, Nothing)
End Set
End Property
''' <summary>
''' 是否终止运行的任务
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Cancel() As Boolean
Get
Return Me._Cancel
End Get
Set(ByVal value As Boolean)
Me._Cancel = value
RaiseEvent CancelChange(Me, Nothing)
End Set
End Property
''' <summary>
''' 任务运行时提示条上显示的文本信息
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Title() As String
Get
Return Me._Title
End Get
Set(ByVal value As String)
Me._Title = value
RaiseEvent TitleChange(Me, Nothing)
End Set
End Property
''' <summary>
''' 任务运行时提示条上显示的百分比(显示于文本信息之后)
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Percent() As Single
Get
Return Me._Percent
End Get
Set(ByVal value As Single)
Me._Percent = value
RaiseEvent PercentChange(Me, Nothing)
End Set
End Property
End Class
''' <summary>
''' 一个运行任务
''' </summary>
''' <remarks></remarks>
<System.Drawing.ToolboxBitmap("D:\GaoControl20\GaoControl20\Resources\Wait03.gif")> _
<System.ComponentModel.DefaultEvent("Task")> _
Public Class TaskDialog
Public Enum WaitImageStyle
FINDCOMP
Wait01
Wait02
Wait03
Wait04
End Enum
Dim _ImageStyle As WaitImageStyle = WaitImageStyle.Wait03
Dim _FormBorder As FormBorderStyle = FormBorderStyle.FixedDialog
Dim _FormBackColor As Color
WithEvents frm As New Form
'Dim frm As New Form
WithEvents xTaskEventargs As New TaskEventArgs
'Dim xTaskEventargs As TaskEventArgs
Public Delegate Sub TaskHandler(ByVal sender As Object, ByRef e As TaskEventArgs)
''' <summary>
''' 运行任务事件
''' 在事件中添加要执行的代码段
''' </summary>
''' <remarks></remarks>
Public Event Task As TaskHandler
Public Property ImageStyle() As WaitImageStyle
Get
Return Me._ImageStyle
End Get
Set(ByVal value As WaitImageStyle)
Me._ImageStyle = value
End Set
End Property
Public Property FormBorder() As FormBorderStyle
Get
Return Me._FormBorder
End Get
Set(ByVal value As FormBorderStyle)
Me._FormBorder = value
End Set
End Property
Public Property FormBackColor() As Color
Get
Return Me._FormBackColor
End Get
Set(ByVal value As Color)
Me._FormBackColor = value
End Set
End Property
''' <summary>
''' 触发任务
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Public Sub OnTask(ByVal sender As Object, ByVal e As EventArgs)

Dim btn As New Button
Dim pic As New PictureBox
Try
If Not sender Is Nothing Then
Try
sender.Enabled = False
Catch ex As Exception
End Try
End If
Me.frm = New Form
frm.UseWaitCursor = True
frm.Size = New Size(360, 60)
frm.StartPosition = FormStartPosition.CenterScreen
frm.ShowInTaskbar = False
frm.ControlBox = False
frm.Text = ""
frm.TopLevel = True
frm.TopMost = True
frm.FormBorderStyle = Me._FormBorder
frm.BackColor = Me._FormBackColor
With btn
.Text = "终止"
.Size = New Size(50, 22)
.Location = New Point(300, 30)
.Visible = False
.Name = "btnCancel"
End With
frm.Controls.Add(btn)
frm.CancelButton = btn
With pic
Select Case Me._ImageStyle
Case WaitImageStyle.FINDCOMP
.Image = My.Resources.FINDCOMP
Case WaitImageStyle.Wait01
.Image = My.Resources.Wait01
Case WaitImageStyle.Wait02
.Image = My.Resources.Wait02
Case WaitImageStyle.Wait03
.Image = My.Resources.Wait03
Case WaitImageStyle.Wait04
.Image = My.Resources.Wait04
Case Else
.Image = My.Resources.Wait04
End Select
.SizeMode = PictureBoxSizeMode.AutoSize
.Location = New Point(3, (frm.Height - 6 - .Height) * 0.5)
End With
frm.Controls.Add(pic)
AddHandler btn.Click, AddressOf CancelClick

frm.Show()
Application.DoEvents()
xTaskEventargs = New TaskEventArgs
RaiseEvent Task(sender, xTaskEventargs)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
Finally
If Not sender Is Nothing Then
Try
sender.Enabled = True
Catch ex As Exception
End Try
End If
frm.Dispose()
End Try
End Sub
Private Sub CancelClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
If MsgBox("真要终止当前任务?", MsgBoxStyle.YesNo, "提示") = MsgBoxResult.Yes Then
xTaskEventargs.Cancel = True
End If
End Sub
Private Sub xTaskEventargs_CancelButtonVisibleChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles xTaskEventargs.CancelButtonVisibleChange
Me.frm.Refresh()
End Sub
Private Sub xTaskEventargs_CancelChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles xTaskEventargs.CancelChange

End Sub
Private Sub xTaskEventargs_PercentChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles xTaskEventargs.PercentChange
Me.frm.Refresh()
End Sub
Private Sub xTaskEventargs_TitleChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles xTaskEventargs.TitleChange
Me.frm.Refresh()
End Sub

Private Sub frm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles frm.Paint
Try
Dim xFont As New Drawing.Font("宋体", 9, Drawing.FontStyle.Regular)
Dim sText As String
Dim xBrush As Drawing.Brush = Drawing.Brushes.Black
Dim xLayoutRectangle As RectangleF
Dim xFormat As StringFormat
sText = Me.xTaskEventargs.Title
If Me.xTaskEventargs.Percent <> 0 Then
sText += " " & Me.xTaskEventargs.Percent & "%"
End If
xFont = New Font("", 9, FontStyle.Bold) '字体
xBrush = Drawing.Brushes.Black '填充色
xLayoutRectangle = New RectangleF '位置
With xLayoutRectangle
.Location = New PointF(60, 0)
.Size = New SizeF(300, 60)
End With
xFormat = New StringFormat() '对齐方式
With xFormat
.Alignment = StringAlignment.Near '水平对齐方式
.LineAlignment = StringAlignment.Center '垂直对齐方式
End With
e.Graphics.DrawString(sText, xFont, xBrush, xLayoutRectangle, xFormat) '开始输出
frm.Controls("btnCancel").Visible = Me.xTaskEventargs.CancelButtonVisible
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Sub
End Class

caprason 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yuanhuiqiao 的回复:]
不用进度条了,找个类似于进度条的图片,感觉出是处理中ing...就行
[/Quote]
这个最好,弄个GIF就行
hawk8132007 2010-03-23
  • 打赏
  • 举报
回复
bcrun 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 hawk8132007 的回复:]
我有张类似进度条的图片,能否在处理数据时直接显示这张图片,数据处理完毕后隐藏图片?如果可以的话,怎么处理图片呢?不知道是不是问的问题太菜了。。。都没人理呢!
[/Quote]

是GIF动画吧,找个控件显示下就行了啦,Webbrowser肯定可以显示,不过找个小巧点的控件可能好些
蓟州网络 2010-03-19
  • 打赏
  • 举报
回复
收藏!
tjficcbw 2010-03-19
  • 打赏
  • 举报
回复

For i = 0 To FileListBox1.Items.Count - 1
PictureBox2.Width = (i + 1) / FileListBox1.Items.Count * 585
Application.DoEvents()
Next


以上是我的进度条,我是计算全部文件的,这个PictureBox2在PictureBox1的上面PictureBox1的背景是白的,PictureBox2的背景是兰的,585是PictureBox1的宽度
hawk8132007 2010-03-18
  • 打赏
  • 举报
回复
老是出现问题,郁闷...


能否用图片来模拟进度条?
这又该怎么做?
yanlongwuhui 2010-03-18
  • 打赏
  • 举报
回复
要用多线程来处理
hawk8132007 2010-03-18
  • 打赏
  • 举报
回复
我有张类似进度条的图片,能否在处理数据时直接显示这张图片,数据处理完毕后隐藏图片?如果可以的话,怎么处理图片呢?


不知道是不是问的问题太菜了。。。都没人理呢!
yuanhuiqiao 2010-03-18
  • 打赏
  • 举报
回复
不用进度条了,找个类似于进度条的图片,感觉出是处理中ing...就行
水猿兵团五哥 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xingyuebuyu 的回复:]
Me.ProgressBar1.Style = ProgressBarStyle.Marquee
这样进度条就会一直不停的从头滚动到尾,就像QQ,MSN在登陆时显示的进度条一样,等你项目中的事做完了,你就可以隐藏窗口了.
对于不定时完成的任务都是这样处理的.
[/Quote]

这个才是正道, 不确定什么进度的情况下这样就好了
bcrun 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hawk8132007 的回复:]
项目中无法确定执行进度,有很多互不相干的数据处理的进程,而且有些数据是未知的,也就是说可能会执行很长时间,也可能0.5S就完成.
[/Quote]

寻楼主何不像批量复制文件时那样搞两个进度条,一个是总的任务数的进度,一个是单个任务内部的进度
hawk8132007 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 tjficcbw 的回复:]
设置一picture1,在这个picture1里再加一个picture2,
再另这个picture2的left不断增加到一个程序再回来,再不断增加
[/Quote]

我有张类似进度条的图片,能否在处理数据时直接显示这张图片,数据处理完毕后隐藏图片?如果可以的话,怎么处理图片呢?
hawk8132007 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 tjficcbw 的回复:]
设置一picture1,在这个picture1里再加一个picture2,
再另这个picture2的left不断增加到一个程序再回来,再不断增加
[/Quote]

不明白,能否说详细一点?或者给个例子什么的。
tjficcbw 2010-03-18
  • 打赏
  • 举报
回复
第二种,是picture2的left是固定的 让他宽度从0增加到picture1的宽度就结束了,
第二种用于知道进度的,
第一种用于不知道进度的
hawk8132007 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xingyuebuyu 的回复:]
Me.ProgressBar1.Style = ProgressBarStyle.Marquee
这样进度条就会一直不停的从头滚动到尾,就像QQ,MSN在登陆时显示的进度条一样,等你项目中的事做完了,你就可以隐藏窗口了.
对于不定时完成的任务都是这样处理的.
[/Quote]

你有没有具体的东西?
tjficcbw 2010-03-18
  • 打赏
  • 举报
回复
设置一picture1,在这个picture1里再加一个picture2,
再另这个picture2的left不断增加到一个程序再回来,再不断增加
xingyuebuyu 2010-03-17
  • 打赏
  • 举报
回复
Me.ProgressBar1.Style = ProgressBarStyle.Marquee
这样进度条就会一直不停的从头滚动到尾,就像QQ,MSN在登陆时显示的进度条一样,等你项目中的事做完了,你就可以隐藏窗口了.
对于不定时完成的任务都是这样处理的.
加载更多回复(11)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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