Delegate .... kann man es so machen ?

NReim

Grünschnabel
Erstmal ein Nettes Hallo in die Runde ...

Ich würde gerne von euch eine rückmeldung haben ob es an meiner Methode wie ich Steuerelemente aus einem anderem Thread Update etwas auszusetzen gibt oder ob das so ligitim ist !!

Kurze Hintergrund Info ...
Ich habe eine Form mit ca 30 Textboxes und diverse Listboxes, da ich nicht für jede einzelne box nen delegaten mit dazugehöriger subroutine schreiben möchte, habe ich mir überlegt das ich einen Delegaten zum Updaten der Texte in Textboxen schreibe und einen der in Listboxen einen neuen eintrag hinzufügt usw ...

Vorab noch, es funktioniert so tadellos. Aber bei mir schleichen sich sehr oft zweifel ein ob ich da irgendein mist e der zwar klappt, aber nur weil im hintergrund 1000 schutzmechanismen im .Net Framework greifen müssen. Wovon ich jetzt nicht ausgehe weil ich keine warnungen oder sonstigen fehler in der console gezeigt bekomme ...

So hier mein Code !
Code:
Public Class Form1

    Public Delegate Sub textbox_delegate(ByVal thisvalue As Object, ByVal this_control As TextBox)

    Public Delegate Sub listbox_delegate(ByVal thisvalue As Object, ByVal this_control As ListBox)


    Sub Textbox_text_update(ByVal thisvalue As String, ByVal this_control As TextBox)

        this_control.Text = thisvalue

    End Sub


    Sub Textbox_bgcolor_update(ByVal thisvalue As Color, ByVal this_control As TextBox)

        this_control.BackColor = thisvalue

    End Sub


    Sub Listbox_value_add(ByVal thisvalue As String, ByVal this_control As ListBox)

        this_control.Items.Add(thisvalue)

    End Sub

Private Sub btn_test_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_test.Click


        BGW.RunWorkerAsync()


    End Sub



    Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork

        Dim geklappt As Boolean = False

        Dim fillthistext As String
        Dim bg_color As New Color


        fillthistext = "BLABLABLA"
        bg_color = Color.Red

        txt_textbox_1.Invoke(New textbox_delegate(AddressOf Textbox_text_update), fillthistext, txt_textbox_1)
        txt_textbox_1.Invoke(New textbox_delegate(AddressOf Textbox_bgcolor_update), bg_color, txt_textbox_1)

        lb_listbox.Invoke(New listbox_delegate(AddressOf Listbox_value_add), fillthistext, lb_listbox)


        fillthistext = "BLUBBLUBBLUB"
        bg_color = Color.Yellow

        txt_textbox_2.Invoke(New textbox_delegate(AddressOf Textbox_text_update), fillthistext, txt_textbox_2)
        txt_textbox_2.Invoke(New textbox_delegate(AddressOf Textbox_bgcolor_update), bg_color, txt_textbox_2)

        lb_listbox.Invoke(New listbox_delegate(AddressOf Listbox_value_add), fillthistext, lb_listbox)


        fillthistext = "HAHAHAHAHAH"
        bg_color = Color.Blue

        txt_textbox_3.Invoke(New textbox_delegate(AddressOf Textbox_text_update), fillthistext, txt_textbox_3)
        txt_textbox_3.Invoke(New textbox_delegate(AddressOf Textbox_bgcolor_update), bg_color, txt_textbox_3)

        lb_listbox.Invoke(New listbox_delegate(AddressOf Listbox_value_add), fillthistext, lb_listbox)


        fillthistext = "HIHIHIHIHIHIH"
        bg_color = Color.Orange

        txt_textbox_4.Invoke(New textbox_delegate(AddressOf Textbox_text_update), fillthistext, txt_textbox_4)
        txt_textbox_4.Invoke(New textbox_delegate(AddressOf Textbox_bgcolor_update), bg_color, txt_textbox_4)

        lb_listbox.Invoke(New listbox_delegate(AddressOf Listbox_value_add), fillthistext, lb_listbox)



    End Sub


PS: Oder gibt es sogar noch eine bessere ( z.B. weniger code ) methode für mein Anliegen
 
Zuletzt bearbeitet:
Hallo NReim,

du kannst durchaus einen allgemeinen Delegaten verwenden, das ist kein Problem.
Kürzer würde es z.B. mit einem anonymen Delegaten funktionieren:
Visual Basic:
Dim fillthistext As String
Dim bg_color As New Color

fillthistext = "BLABLABLA"
bg_color = Color.Red

txt_textbox_1.BeginInvoke( Function MethodInvoker(delegate() As Shadows txt_textbox_1.Text = fillthistext End Function Dim ) As )
txt_textbox_1.BeginInvoke( Function MethodInvoker(delegate() As Shadows txt_textbox_1.BackColor = bg_color End Function Dim ) As )

Ich hoffe der Code passt; ich mach sonst nur C# :)

Gruß
MCoder
 
Hallo MCoder

Deine Variante gefällt mich auch sehr gut, leider aber funktioniert dein Code so nicht in VB ... vieleicht haben wir ja hier noch einen er der mir deine Möglichkeit in VB umsetzen kann .. Ich habe mich eben mal dran versucht aber noch keinen erfolg gehabt ...
 
schade, in C# funktioniert's jedenfalls so:
C#:
string str     = "abcd";
Color  bgcolor = Color.Red;
        
m_oTextBox.BeginInvoke( new MethodInvoker(delegate() { m_oTextBox.Text = str; } ) );
m_oTextBox.BeginInvoke( new MethodInvoker(delegate() { m_oTextBox.BackColor = bgcolor; } ) );
Ich hab's dann nur durch so einen automatischen Konvertierer gejagt. Offensichtlich mit zweifelhaften Erfolg :(

Bekommst du eine Fehlermeldung?

Gruß
MCoder
 
Hallo

Ja ich bekomme 2 Fehlermeldungen in meiner Fehlerliste angezeigt

1. "(" erwartet.
2. "MethodInvoker" ist ein Typ und kann nicht als Ausdruck verwendet werden.

Daraufhin habe ich vor -> MethodInvoker noch die ( gesetzt = (MethodInvoker

nun bekomme ich den Fehler:

1. Arraygrenzen können nicht in Typbezeichnern stehen.

und der befehl -> delegate <- ist unterstrichen ....
 
Hallo,

soweit ich inzwischen herausgefunden habe, funktionieren anonyme Methodenaufrufe nicht in VB (leider).
Evt. wäre da noch was mit Lamda-Ausdrücken zu machen, aber da kenne ich mich nicht besonders gut aus.

Gruß
MCoder
 
Hallo

Also VB hat mir auch irgendwas erzählt von Lamda-Werten, Aber da habe ich noch garkeinen plan von ..

Ich denke ich werde meine Methode erstmal so fortsetzen, sie funktioniert ja ! Und bischen Code habe ich so auch gespart ...

Ich möchte mich trozdem bei dir bedanken, das du dir die Zeit genommen hast mir zu helfen. Auch wenn es letztendlich nur die aussage war das meine methode kein schrott ist .... Aber das ist doch schonmal besser als garnichts oder. :-D

Ich wünsche dir ein schönes WE ...

Mfg:
 
Zurück