Avatar billede Droa Seniormester
30. april 2013 - 11:41 Der er 5 kommentarer og
1 løsning

Deligate Invoke fra et moduls tråd til Textbox1

Så jeg har lidt et problem med at forstå delegates, og hvordan man bruger dem korrekt.

Jeg har bøvlet med dette problem i 2 dage.. jeg laver en form med en TextBox (Textbox1) og prøver at skrive til den fra en tråd fra et Andet modul, i en klasse... det virker helt fint, vis det ligger i samme modul, men ligeså snart det er mellem 2 moduler, så sker der intet?

Form1.vb

Public Class Form1

    Public Sub addText(ByVal text)
        If Me.TextBox1.InvokeRequired Then
            Dim d As delAddtext = New delAddtext(AddressOf addText)
            Me.TextBox1.Invoke(d, text)
        Else
            Me.TextBox1.Text &= text
        End If
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim test As Module1.TestClass = New TestClass()
    End Sub
End Class



Module1.vb

Delegate Sub delAddtext(ByVal text)
Module Module1
    Class TestClass
        Public Sub New()
            Dim t As Threading.Thread = New Threading.Thread(AddressOf Runner)
            t.Start()
        End Sub

        Public Sub Runner()
            For i = 0 To 100
                Form1.addText("hej")
                Threading.Thread.Sleep(1000)
            Next
        End Sub
    End Class
End Module



hvad gør jeg forkert?
Avatar billede Droa Seniormester
30. april 2013 - 12:54 #1
jeg fandt ud af problemet, Man skal åbenbart sende Form1 til den anden classe, og bruge variablen i min TestClass istedet for.



TestClass

Dim frm As Form1

public sub new(ByVal frm As Form1)
  Me.frm = frm




Form1

new TestClass(Me)




Jeg forstår ikke helt hvorfor det ikke skal være en ByRef.. men det er vel bare sådan VB.NEt virker :(
Avatar billede arne_v Ekspert
30. april 2013 - 19:38 #2
Form er en reference type, saa du sender en referance over som vaerdi fremfor at sende en referance til en referance.

Var det totalt sort snak?

:-)

Lad mig give et eksempel:

Imports System
Imports System.Text

Namespace E
    Public Class Program
        Private Shared Sub VV(ByVal v As Integer)
            v = 456
        End Sub
        Public Shared Sub ValTypByVal()
            Dim v As Integer = 123
            VV(v)
            Console.WriteLine(v)
        End Sub
        Private Shared Sub VR(ByRef v As Integer)
            v = 456
        End Sub
        Public Shared Sub ValTypByRef()
            Dim v As Integer = 123
            VR(v)
            Console.WriteLine(v)
        End Sub
        Private Shared Sub RV1(ByVal sb As StringBuilder)
            sb.Append("DEF")
        End Sub
        Private Shared Sub RV2(ByVal sb As StringBuilder)
            sb = New StringBuilder("DEF")
        End Sub
        Public Shared Sub RefTypByVal()
            Dim sb As New StringBuilder("ABC")
            RV1(sb)
            Console.WriteLine(sb)
            RV2(sb)
            Console.WriteLine(sb)
        End Sub
        Private Shared Sub RR1(ByRef sb As StringBuilder)
            sb.Append("DEF")
        End Sub
        Private Shared Sub RR2(ByRef sb As StringBuilder)
            sb = New StringBuilder("DEF")
        End Sub
        Public Shared Sub RefTypByRef()
            Dim sb As New StringBuilder("ABC")
            RR1(sb)
            Console.WriteLine(sb)
            RR2(sb)
            Console.WriteLine(sb)
        End Sub
        Public Shared Sub Main(args As String())
            ValTypByVal()
            ValTypByRef()
            RefTypByVal()
            RefTypByRef()
            Console.ReadKey()
        End Sub
    End Class
End Namespace
Avatar billede Droa Seniormester
02. maj 2013 - 09:37 #3
det forklarede en del, mange tak :)

jeg tror os jeg forstod din korte forklaring, da det ville give mening at gøre det sådan :)
Avatar billede Droa Seniormester
06. maj 2013 - 10:52 #4
venter på et svar fra arne_v :)
Avatar billede arne_v Ekspert
06. maj 2013 - 15:21 #5
ok

(selvom jeg jo faktisk slt ikke svarede paa det oprindelige spoergsmaal)
Avatar billede Droa Seniormester
07. maj 2013 - 09:12 #6
Siden der ikke var andre der deltog, er der kun os to at give point til, og når du tager dig tid at fremvise kode, er det os 200 point værd, selvom de ingen værdi har :)
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