Avatar billede jesperbaldur Nybegynder
17. april 2007 - 12:19 Der er 9 kommentarer og
1 løsning

Vente til form har lukket med videre eksekvering

Jeg har to forme: form1 og form2. Fra form1 kan jeg åbne form2.

Dim f2 As New Form2
f2.show()
textbox1.text = "1"

Men hvordan stopper jeg eksekvering af koden ved linien f2.show() i form1 indtil form2 lukker, således at textbox1.text = "1" først bliver eksekveret efter form2 er lukket?

Jeg har forsøgt lidt med threads, men har ikke kunne få det til at virke.
Avatar billede thesurfer Nybegynder
17. april 2007 - 12:51 #1
Hvis du smide det i en tråd, kan du prøve med noget i denne stil:

Dim f2 As New Form2
f2.show()
while(f2 ikke er disposed)
{
// loopen kører sålænge at f2 ikke er nedlagt
}
textbox1.text = "1"

Måske er det:

while(f2 is not disposed)
{
}

Jeg programmerer ikke i VB.Net, men C#, hvor det er smule anderledes..
Avatar billede thesurfer Nybegynder
17. april 2007 - 12:56 #2
Jeg kommer lige i tanke om, at det er kun C# der bruger "{}"..

VB.Net:

while(f2 is not disposed)
end while
Avatar billede thesurfer Nybegynder
17. april 2007 - 13:07 #3
Eksempel:

Public Class Form1

    Dim f2 As New Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Dim f2 As New Form2
        f2.Show()
        Dim t As System.Threading.Thread
        t = New System.Threading.Thread(AddressOf Me.doit)
        t.IsBackground = True
        t.Start()
    End Sub

    Private Sub opdater()
        TextBox1.Text = "1"
    End Sub

    Private Sub doit()
        While (Not f2.IsDisposed())

        End While
        opdater()
    End Sub
End Class

Hvis du bruger Microsoft Visual Studio 2005, skal du invoke textboxen, før du kan give den værdien..

Det skal man pga restriktioner/sikkerheden..
Avatar billede thesurfer Nybegynder
17. april 2007 - 13:20 #4
Jeg har kigget lidt på http://www.code-magazine.com/Article.aspx?quickid=0211141 og prøvet mig frem..

Det gav følgende:

Public Class Form1

    Dim f2 As New Form2

    Delegate Sub delegateOpdater(ByVal Text As String)
    Private mellemmand As delegateOpdater

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Dim f2 As New Form2
        f2.Show()
        Dim t As System.Threading.Thread
        t = New System.Threading.Thread(AddressOf Me.doit)
        t.IsBackground = True


        Me.mellemmand = New delegateOpdater(AddressOf Me.opdater)

        t.Start()
    End Sub

    Private Sub opdater(ByVal tekst As String)
        If TextBox1.InvokeRequired Then
            TextBox1.Invoke(New delegateOpdater(AddressOf opdater), tekst)
        Else
            TextBox1.Text = tekst
        End If

    End Sub

    Private Sub doit()
        While (Not f2.IsDisposed())

        End While
        Me.mellemmand("1")
    End Sub

End Class
Avatar billede thesurfer Nybegynder
17. april 2007 - 13:30 #5
Jeg har ryddet lidt op i koden, for fået tråden til at sove 1 ms, så den ikke tager 100% af cpu ressourcerne:

Public Class Form1

    Dim f2 As New Form2
    Delegate Sub delegateOpdater(ByVal Text As String)
    Private SkrivTilTextbox As New delegateOpdater(AddressOf Me.invokeOpdater)
    Dim t As System.Threading.Thread

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        f2.Show()
        t = New System.Threading.Thread(AddressOf Me.doit)
        t.IsBackground = True
        t.Start()
    End Sub

    Private Sub invokeOpdater(ByVal tekst As String)
        If TextBox1.InvokeRequired Then
            TextBox1.Invoke(New delegateOpdater(AddressOf invokeOpdater), tekst)
        Else
            TextBox1.Text = tekst
        End If
    End Sub

    Private Sub doit()
        While (Not f2.IsDisposed())
            ' lav ingen ting.. og hop ud af loopen, så snart f2 lukkes/nedlægges
            Threading.Thread.Sleep(1) ' sover 1 ms (millisekund) før den fortsætter
        End While
        Me.SkrivTilTextbox("1") ' dette er teksten der sendes til TextBox1
    End Sub

End Class
Avatar billede bernhof Nybegynder
17. april 2007 - 14:44 #6
Har du prøvet med ShowDialog? Så behøver du ikke rode dig ud i noget med tråde:

Dim f2 As New Form2
f2.ShowDialog()
textbox1.text = "1"
Avatar billede bernhof Nybegynder
24. april 2007 - 20:57 #7
Fik du det til at virke?
Avatar billede bernhof Nybegynder
10. oktober 2007 - 00:15 #8
Any news?
Avatar billede jesperbaldur Nybegynder
15. januar 2008 - 10:11 #9
Jeg undskylder lige den lange svar tid, og vil bede om et svar.
Avatar billede bernhof Nybegynder
15. januar 2008 - 10:15 #10
Ok, jeg går ud fra du fik det til at virke så :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester