Elemente aus fremder Form steuern - funktioniert nicht

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Denis_Class.

    Elemente aus fremder Form steuern - funktioniert nicht

    Kurz und knapp mein Problem:

    -ich schreibe ein Programm, dass mit einem Arduino kommuniziert.
    -Dabei laufen alle Befehle und Aktionen auf eine Form (Im Bild - die Form "System_Datenlogger")
    -Diese Form soll dann alle anderen Elemente in ca. 4 anderen Formen steuern. Unter anderem auch Bilder von Buttons ändern usw.

    Wenn ich nun (wie im Bild) an der Form "Menü_Controller" etwas ausführe (Button drücken, der eine Funktion eines Moduls startet) - siehe Code:

    VB.NET-Quellcode

    1. Public Sub Bt_Relais_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt_Relais_1.Click
    2. Relais_1_schalten()
    3. End Sub


    VB.NET-Quellcode

    1. Function Relais_1_schalten()
    2. System_log.Pb_Upload_Status.Image = My.Resources.Upload_active
    3. If System_log.Relais_1_Status = 0 Then
    4. System_log.Relais_1_Status = 1
    5. Relais_Schalten(System_log.Relais_1_Name_On)
    6. Menü_Controller.Bt_Relais_1.Image = My.Resources._On
    7. Menü_Controller.Button1.Image = My.Resources._On
    8. Else
    9. System_log.Relais_1_Status = 0
    10. Relais_Schalten(System_log.Relais_1_Name_Off)
    11. Menü_Controller.Bt_Relais_1.Image = My.Resources.Off
    12. Menü_Controller.Button1.Image = My.Resources.Of
    13. End If
    14. Return True
    15. End Function



    Dann funktioniert das auch alles Super. Nur, wenn ich aus dem Fremden Thread die Funktion starten möchte geht das nicht.
    Bsp. Wenn der Arduino der Hauptform sendet, dass das Relais_1 ausgeschalten wurde (aus welchen Gründen auch immer) dann soll aus der Hauptform in der Form "Menü_Controller" das Image desdementsprechenden Buttons geändert werden.

    Leider komme ich hier trotz einiger Artikel aus google-suchen nicht weiter.

    Bitte um Hilfe!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Denis_Class“ ()

    Kannst Du bitte mal den Quelltext in Deinem Post (nachträglich) so formatieren, dass er hier wie bei Dir im Editor aussieht?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So soll es sein.

    Denis_Class schrieb:

    Nur, wenn ich aus dem Fremden Thread die Funktion starten möchte geht das nicht.
    Das Zauberwort heißt Invoke.
    Trag das mal auf der Hauptseite in das Suchen-Fenster ein, da bekommst Du sehr viele Treffer, von denen musst Du Dir die zutreffenden nraussuchen.
    Und wenn es dann noch Probleme gibt, meldest Du Dich wieder. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Zauberwort heißt Invoke.
    Trag das mal auf der Hauptseite in das Suchen-Fenster ein, da bekommst Du sehr viele Treffer, von denen musst Du Dir die zutreffenden nraussuchen.
    Und wenn es dann noch Probleme gibt, meldest Du Dich wieder. :thumbsup:


    Danke, aber ich hatte das gestern bereits versucht, nachdem ich:
    msdn
    gelesen hatte. Aber ich komm da nicht ganz mit zu recht.

    Ich werd mich nun mal durch das Forum lesen
    Poste mal bitte ein entsprechendes Stück Code von Dir.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Poste mal bitte ein entsprechendes Stück Code von Dir.



    VB.NET-Quellcode

    1. Public Sub Bt_Relais_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt_Relais_1.Click
    2. Relais_1_schalten()
    3. End Sub


    das ist die Picturebox (die ich alt Button Nutze), diese liegt in der Form

    VB.NET-Quellcode

    1. Public Class Menü_Controller


    Nun moche ich aus einer anderen Form

    VB.NET-Quellcode

    1. Public Class System_log


    mit dem DataReceived Event diese Picture-Box und einige andere ändern lassen (also deren Images aus meinen Ressourcen)
    So wollte ich das:

    VB.NET-Quellcode

    1. Private Sub Serial_Port_Arduino_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Serial_Port_Arduino.DataReceived
    2. Pb_Download_Status.Image = My.Resources.Download_active 'Downloadpfeil aktivieren
    3. Dim ToRead As Integer = 0
    4. ToRead = Serial_Port_Arduino.BytesToRead
    5. If ToRead > 0 Then
    6. Dim Buffer(ToRead - 1) As Byte
    7. Serial_Port_Arduino.Read(Buffer, 0, ToRead)
    8. Serial_Input = Serial_Input & _Encoding.GetString(Buffer)
    9. Else
    10. '
    11. End If
    12. Select Case Serial_Input
    13. Case "Relais_1_on!"
    14. Menü_Controller.Button1.Image = My.Resources._On
    15. Case "Relais_2_on!"
    16. Menü_Controller.Bt_Relais_2.Image = My.Resources._On
    17. Case "Relais_3_on!"
    18. Menü_Controller.Bt_Relais_3.Image = My.Resources._On
    19. Case "Relais_4_on!"
    20. Menü_Controller.Bt_Relais_4.Image = My.Resources._On
    21. Case "Relais_5_on!"
    22. Menü_Controller.Bt_Relais_5.Image = My.Resources._On
    23. Case "Relais_6_on!"
    24. Menü_Controller.Bt_Relais_6.Image = My.Resources._On
    25. Case "Relais_7_on!"
    26. Menü_Controller.Bt_Relais_7.Image = My.Resources._On
    27. Case "Relais_8_on!"
    28. Menü_Controller.Bt_Relais_8.Image = My.Resources._On
    29. Case "Relais_1_off!"
    30. Menü_Controller.Button1.Image = My.Resources.Off
    31. Case "Relais_2_off!"
    32. Menü_Controller.Bt_Relais_2.Image = My.Resources.Off
    33. End Select
    34. Pb_Download_Status.Image = My.Resources.Download_notactive 'Downloadpfeil deaktivieren
    35. End Sub


    Und genau hier hörts bei mir auf.
    Ich hatte versucht:

    VB.NET-Quellcode

    1. Menü_Controller.Bt_Relais_2.Invoke(System.Drawing.Image(AddressOf Menü_Controller.Bt_Relais_2), Menü_Controller.Bt_Relais_2, My.Resources._On)

    Aber das geht ja ersichtlich ned
    Probier es mal so:

    VB.NET-Quellcode

    1. Me.Invoke(Sub() Menü_Controller.Bt_Relais_2.Image = My.Resources._On)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Probier es mal so:

    VB.NET-Quellcode

    1. Me.Invoke(Sub() Menü_Controller.Bt_Relais_2.Image = My.Resources._On)
    Okay, einen Schritt weiter, DANKE, ich habs nun ohne exeption und folgendes kommt:

    Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.


    muss ich nun noch prüfen ob es einem anderen thread angehört, und wenn ja wie erstelle dich das handle oder wie behebe ich obige ausnahme?
    Was ist da Me? Eine Form habe ich mal angenommen.
    Wenn er im Thread steht, darf da nicht Me, sondern die Instanz der anzeigenden Form stehen.

    VB.NET-Quellcode

    1. Private myfrm As Form1
    2. Sub Init(frm As Form1)
    3. myfrm =frm
    4. End Sub
    5. Sub xxx()
    6. ' ...
    7. myfrm.Invoke(...)
    8. ' ...
    9. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Private myfrm As Menü_Controller
    2. Sub Init(ByVal frm As Menü_Controller)
    3. myfrm = frm
    4. End Sub
    5. Sub xxx()
    6. ' ...
    7. myfrm.Invoke((Sub() Menü_Controller.Bt_Relais_1.Image = My.Resources._On))
    8. ' ...
    9. End Sub


    ...

    Das hier startet das ganze bei eingehenden bits am seriellen port:

    VB.NET-Quellcode

    1. Select Case Input
    2. Case "Relais_1_on!"
    3. xxx()


    wenn ich nun xxx aufrufe kommt, "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    Sorry bin auf diesem Gebiet ne null, meine "basteleien" waren bisher wesentlich einfacher. Will dir echt nicht auf die nerven gehen.
    Vor xxx muss ich ja init() aufrufen, richtig?

    mit was rufe ich init() auf? mit dem Thread der das aufruft(Public Class System_log)? oder mit der Form, in der das Element liegt (Public Class Menü_Controller)?

    Denis_Class schrieb:

    Vor xxx muss ich ja init() aufrufen, richtig?
    mit was rufe ich init() auf?
    Menü_Controller als Aufrufparameter ist definitiv falsch, das sollte eine Form sein, und zwar die Form, die dieses Menü enthält.
    Init wird aufgerufen sofort bach Instanziierung Deiner Relais-Klasse.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Denis_Class schrieb:

    Vor xxx muss ich ja init() aufrufen, richtig?
    mit was rufe ich init() auf?
    Menü_Controller als Aufrufparameter ist definitiv falsch, das sollte eine Form sein, und zwar die Form, die dieses Menü enthält.
    Init wird aufgerufen sofort bach Instanziierung Deiner Relais-Klasse.
    Dann musste es passen. Menü_Controller ist eine Form.
    Supi, das werde ich heute Abend mal probieren.
    Vielen dank rod!
    @Denis_Class: Hör doch bitte mal auf, die ganzen Posts vor Dir zu zitieren :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry, das passiert in der Eile, wenn ich mit dem hdy im web unterwegs bin - sicher nicht bewusst!

    So, nun sitz ich am PC, hab ne Stunde lang rumprobiert, das bekomme ich noch nicht hin... openbook von galileo hat gar nix über invoke und nun schaue ich mir tutorials durch.