2015-07-11 69 views
0

我正在制作一个简单的进度条用作我的应用程序中的启动画面,但是当代码执行时,加载栏没有到达进度条的末尾。VB - 与进度条有关的问题

我使用的代码:

splashprogressbar.Increment(1) 
    If splashprogressbar.Value = 100 Then 
     Main_Menu.Show() 
     Me.Hide() 
    End If 

当进度条达到100,其已经被设置为最大值打开窗体。

这个问题更多的是与外观而不是功能相关,但我仍然想知道为什么发生这种情况,并希望得到解决。

为了澄清,表单Main_Menu,打开时,酒吧约3/4的方式完成,我无法得到我的头为什么会发生这种情况。有任何想法吗?

+0

不管我做什么,酒吧没有到达终点,除非我最大的值更改为一个数小于调节值,在这种情况下100,但是这不会执行该语句 –

+1

的进度实际上为新值“动画”(它不会立即跳转),因为您调用了Hide(),所以根本没有时间到达那里。请参阅David Heffernan的[hack here](http://stackoverflow.com/a/5332770/2330053)。 –

+1

这是一个众所周知的“错误”。在下面的dupe链接中有一个修复:[更改值时禁用.NET progressbar动画?](http://stackoverflow.com/questions/5332616/disabling-net-progressbar-animation-when-changing-value) –

回答

-1

我无法想象VB有这样的错误。可能你正在运行一个旧的或不兼容的“.Net框架”,导致这种情况。 您可以尝试在运行程序时以编程方式设置最大进度条。在Form1_Load事件 使用此代码:

ProgressBar1.Maximum = 100 

它应该工作。但是如果没有,也许它只是代码相关。尽量填补你的进度这种方式(它必须是一个定时器):

If splashprogressbar.Value = splashprogressbar.Maximum Then 
    Main_Menu.Show() 
    Me.Hide() 
Else 
    splashprogressbar.Value += 100 
End If 

只是一个友好的建议:看来你是模拟假负载棒填充,然后,只有到那时,打开应用程序(可能浪费用户时间)。不要这样做。

+0

当然,如果这个程序将被专业地使用,那当然这将是我实现它的方式很愚蠢,它只是为了视觉吸引力,它是模块的一部分 - 不幸的是你使用的代码似乎并不像解决它或者但是谢谢你的尝试 –

-1

你也可以试试看看下面的链接。这可能有助于你的方法;

Trigger Background Worker

下面是从上面的链接复制...

Dim WithEvents bgWorker As New BackgroundWorker With { _ 
.WorkerReportsProgress = True, _ 
.WorkerSupportsCancellation = True} 

Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork 
    For i As Integer = 0 To 100 
     'Threw in the thread.sleep to illustrate what's going on. Otherwise, it happens too fast. 
     Threading.Thread.Sleep(250) 
     bgWorker.ReportProgress(i) 
    Next 
End Sub 

Private Sub bgWorker_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgWorker.ProgressChanged 
    If e.ProgressPercentage Mod 10 = 0 Then 
     MsgBox(e.ProgressPercentage.ToString) 
    End If 
End Sub 

Private Sub bgWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgWorker.RunWorkerCompleted 
    MsgBox("Done") 
End Sub 
+0

虽然这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 –

+0

好点。下次我会记住这一点...... –

+0

你仍然可以编辑你的答案。 –

-2

你可以尝试这样的事情;

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

    Me.Show() 

    Dim i As Integer 

    splashprogressbar.Minimum = 0 
    splashprogressbar.Maximum = 100 

    If splashprogressbar.Value < splashprogressbar.Maximum Then 

     For i = 0 To 100 
      splashprogressbar.Value = i 
      Application.DoEvents() 
      System.Threading.Thread.Sleep(100) 
     Next 
    End If 
    Me.Hide() 
    MsgBox("Here I am") 'Use your "Main_Menu.Show" here 

End Sub 
+0

这会冻结主界面。 –

+0

怎么样?你需要解释一下好一点......文森特在这里工作得很好。你必须记得调整线程/睡眠时间。我把这个线程/睡眠时间设置为100作为一个夸大的例子。 –

+0

好吧,我现在看到我错过了'Application.DoEvents()'行,一定是因为网站的移动版本。但请记住,尽管这应该是一个闪屏,但以正常(可关闭)形式使用代码会使应用程序在关闭时保持活动状态,直到进度条达到最大值。当达到最大值时,它也会抛出一个NullReferenceException异常,可能是因为进度条被丢弃了。 –