Imports System Imports System.Drawing Imports System.Windows.Forms Imports System.Threading
Public Class MainForm Inherits Form Private bar As ProgressBar Private start As Button Private abort As Button Private t As Thread
Public Sub New() bar = New ProgressBar start = New Button abort = New Button SuspendLayout bar.Location = New Point(50, 50) bar.Size = New Size(200, 50) bar.Name = "Progress Bar" bar.Minimum = 0 bar.Maximum = 60 bar.Value = 0 bar.Step = 1 start.Location = New Point(50, 150) start.Size = New Size(200, 50) start.Name = "Start Button" start.Text = "Start" AddHandler start.Click, AddressOf StartClick abort.Location = New Point(50, 250) abort.Size = New Size(200, 50) abort.Name = "Abort Button" abort.Text = "Abort" AddHandler abort.Click, AddressOf AbortClick ClientSize = New Size(300, 350) Controls.Add(bar) Controls.Add(start) Controls.Add(abort) Name = "Main Form" Text = "Main Form" ResumeLayout(False) End Sub
Sub BarUpdate(ByVal i As Integer) bar.Value = i End Sub
Delegate Sub UpdateHandler(ByVal i As Integer)
Sub Copy() Dim i As Integer For i = 0 To 59 If bar.InvokeRequired Then bar.Invoke(CType(AddressOf BarUpdate, UpdateHandler), New Object() {i}) Else BarUpdate(i) End If Thread.Sleep(500) Next End Sub
Sub StartClick(ByVal sender As Object, ByVal e As EventArgs) t = New Thread(AddressOf Copy) t.Start End Sub
Sub AbortClick(ByVal sender As Object, ByVal e As EventArgs) t.Abort End Sub
<STAThread()> _ Public Shared Sub Main(ByVal args As String()) Application.Run(New MainForm) Application.Exit Environment.Exit(0) End Sub End Class
Jeg er lidt forvirret eng. den måde du sender koden på... jeg kan kun skrive kode for hver form.. det ser ud som om, du går længer bag koden.. hvordan gør du det?
Sub Copy() Dim i As Integer For i = 0 To 59 If bar.InvokeRequired Then bar.Invoke(CType(AddressOf BarUpdate, UpdateHandler), New Object() {i}) Else BarUpdate(i) End If Thread.Sleep(500) Next End Sub
InvokeRequired (Invoke) er en større del af Copy... hvad tjekker den?
nu kender jeg kun til thread efter hvad du har lært mig.. så jeg ville lige se om du kunne sige om dette er rigtigt (det virker fint), men om det er sådan du ville gøre :)
Sub BarUpdate(ByVal i As Integer) bar.Value = i End Sub
Sub StatusUpdate(ByVal i As Integer) statuslabel.Text = i End Sub
Delegate Sub UpdateHandler(ByVal i As Integer) Delegate Sub StatusHandler(ByVal i As Integer)
Sub Copy() Dim i As Integer For i = 0 To 100 If bar.InvokeRequired Then bar.Invoke(CType(AddressOf BarUpdate, UpdateHandler), New Object() {i}) statuslabel.Invoke(CType(AddressOf StatusUpdate, StatusHandler), New Object() {i}) Else BarUpdate(i) StatusUpdate(i) End If Thread.Sleep(100) Next End Sub
Nu er jeg lige droppet ind fra sidelinien, og har ikke lige tid til at sætte mig ind i dit spørgsmål fra start af, men til dit sidste spørgsmål kan jeg sige, at hvis det er den samme værdi statuslabel.Text og bar.Value skal indeholde, så behøver du kun kalde én metode:
Sub StatusUpdate(ByVal i As Integer) statuslabel.Text = i.ToString() bar.Value = i End Sub
ahh.. brugte ellers bare "int" i min label, siden den omregner, men det kan jo også bare gøres i selve funktionen :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.