Steuerelement in Groupbox aus Modul ansprechen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 59 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    sonne75 schrieb:

    Seiner läuft ja.
    Bei mir compiliert "mein" Code, läuft aber nicht.
    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!
    könnte mir vorstellen, er spricht die Default-Instanz an statt eines ordentlich instanzierten Forms.
    Und scheinbar hat er auch Option Strict Off.

    Also dieses Abholen, wo man grad steht ist mir nix. Ist mir nur Holzwege lang-latschen bis zum bitteren Ende.

    IMO musser Grundlagen lernen von Anfang an: Datenverarbeitungs-Vorraussetzungen
    Das Programm stürzt nicht ab, es arbeitet zumindest optisch einwandfrei und bringt auch keine Fehlermeldung. Nur der betreffende Progressbar wird nicht aktualisiert. "option strict on" ist auch aktiviert.
    Dass ich nun in einer Woche durch Lektüre nicht zum "optimalen Code" komme ist mir schon klar!!
    ==> seid .net zueinander :D <3 <==

    Axxxxxl schrieb:

    stürzt nicht ab
    Setz einen Haltepunkt auf die Zeile und überzeuge Dich, dass das Programm da ühaupt vorbeikommt.
    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!
    Der aktuelle Code ist:

    VB.NET-Quellcode

    1. CType(frm_main.Controls("grp_ma" & ma_nummer).Controls.Item("bar_" & ma_nummer), ProgressBar).Value = CInt(Speed)


    Einen Haltepunkt habe ich gesetzt und er hält auch brav dort an. Vielleicht liegt es daran, dass es "zu schnell" abläuft?
    Im Mainform ist ein Timer mit 1000er Interval. Dort wird jeweils die Sub "Druckmaschinen" im Modul1 aufgerufen, jeweils nur mit anderen Parameter (Maschinennummer):

    VB.NET-Quellcode

    1. 'Aktualisierung für Druckmaschinen aufrufen
    2. druckmaschinen(54, "54")
    3. druckmaschinen(55, "55")
    4. druckmaschinen(56, "56")
    ==> seid .net zueinander :D <3 <==
    Als ich für jede Maschine einzelnen Code geschrieben hatte, hat das auch mit dem Progressbar funktioniert. Er hat auch ein festes Maximum von 200 und der Speed der Maschinen steigt nie über 150!
    ICH HABE IHN ALSO SCHON EINMAL ANGESPROCHEN!!!
    Der zweite übergebene Stringwert "54" ist irrelevant, da habe ich anfangs nur getestet. Der Integer Wert 54 ist der, welcher in der Sub ausgewertet wird. Und hier nun, damit niemand heult ( :!: ) der komplette Code der Sub aus dem Modul 1:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub druckmaschinen(ByVal ma_nummer As Integer, ma_text As String)
    2. 'URLs für XML Daten der Maschinen festlegen
    3. 'Druckmaschinen
    4. If ma_nummer = 54 Then HTTPAdresse = "http://lblmeew131"
    5. If ma_nummer = 55 Then HTTPAdresse = "http://lblmeew132"
    6. If ma_nummer = 56 Then HTTPAdresse = "http://lblmeew120"
    7. XMLString = Client.DownloadString(HTTPAdresse)
    8. xml_Doc.LoadXml(XMLString) ' ... XML-Datei aus String laden
    9. '----------------------------------------------------------------------------------------------------------------
    10. 'Geschwindigkeit auslesen und anzeigen
    11. xml_Knoten = xml_Doc.SelectSingleNode("/bde/application/geschwindigkeit")
    12. Double.TryParse(xml_Knoten.InnerText.Replace(".", ","), Wert)
    13. Dim Speed As String = System.Math.Truncate(Wert).ToString
    14. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_speed" & ma_nummer).Text = Speed
    15. 'Progressbar anpassen
    16. 'MsgBox("Speed: " & Speed)
    17. CType(frm_main.Controls("grp_ma" & ma_nummer).Controls.Item("bar_" & ma_nummer), ProgressBar).Value = CInt(Speed)
    18. 'Hintergrund entsprechend Geschwindigkeit färben und LEDs laden
    19. If Speed <= 1 Then
    20. frm_main.Controls("grp_ma" & ma_nummer).BackColor = System.Drawing.Color.FromArgb(255, 192, 192)
    21. CType(frm_main.Controls("grp_ma" & ma_nummer).Controls("pic_led_" & ma_nummer), PictureBox).Image = CCL_Info_Monitor.My.Resources.Resources.Redlight
    22. Else
    23. frm_main.Controls("grp_ma" & ma_nummer).BackColor = Color.LightGreen
    24. CType(frm_main.Controls("grp_ma" & ma_nummer).Controls("pic_led_" & ma_nummer), PictureBox).Image = CCL_Info_Monitor.My.Resources.Resources.Greenlight
    25. End If
    26. '----------------------------------------------------------------------------------------------------------------
    27. 'Produktivstatus anzeigen
    28. Dim produktiv As String
    29. xml_Knoten = xml_Doc.SelectSingleNode("/bde/aktuell_produktiv") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    30. produktiv = xml_Knoten.InnerText
    31. If produktiv = "1" Then
    32. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_produktiv" & ma_nummer).Text = "produktiv"
    33. Else
    34. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_produktiv" & ma_nummer).Text = "Störung"
    35. End If
    36. '----------------------------------------------------------------------------------------------------------------
    37. 'FA auslesen und anzeigen
    38. Dim FA As String
    39. xml_Knoten = xml_Doc.SelectSingleNode("/bde/fertigungsauftrag") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    40. FA = Mid(xml_Knoten.InnerText, 6, 5)
    41. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_fa" & ma_nummer).Text = FA
    42. '----------------------------------------------------------------------------------------------------------------
    43. 'Auflage Stck. auslesen
    44. xml_Knoten = xml_Doc.SelectSingleNode("/bde/application/auflage") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    45. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_auflage" & ma_nummer).Text = (xml_Knoten.InnerText)
    46. '----------------------------------------------------------------------------------------------------------------
    47. 'Auflage brutto m auslesen
    48. xml_Knoten = xml_Doc.SelectSingleNode("/bde/application/brutto") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    49. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_brutto" & ma_nummer).Text = (xml_Knoten.InnerText)
    50. 'Maximum des Progressbar auf Bruttometer des FA setzen
    51. Auflage = CInt(xml_Knoten.InnerText)
    52. CType(frm_main.Controls("grp_ma" & ma_nummer).Controls.Item("bar_" & ma_nummer), ProgressBar).Maximum = Auflage
    53. '----------------------------------------------------------------------------------------------------------------
    54. 'Gutmeter auslesen und anzeigen
    55. xml_Knoten = xml_Doc.SelectSingleNode("/bde/laengegut") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    56. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_metergut" & ma_nummer).Text = (xml_Knoten.InnerText)
    57. 'produzierte Gutmeter als Fortschritt% im Progressbar anzeigen und Text als Prozent anzeigen
    58. Gutmeter = CInt(xml_Knoten.InnerText)
    59. 'CType(frm_main.Controls("grp_ma" & ma_nummer).Controls.Item("bar_prod" & ma_nummer), ProgressBar).Value = Gutmeter
    60. Fortschritt = (Gutmeter * 100) / Auflage
    61. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_prod" & ma_nummer).Text = Fortschritt & "%"
    62. '----------------------------------------------------------------------------------------------------------------
    63. 'Schlechtmeter auslesen und anzeigen
    64. xml_Knoten = xml_Doc.SelectSingleNode("/bde/laengeschlecht") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    65. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_meterschlecht" & ma_nummer).Text = (xml_Knoten.InnerText)
    66. '----------------------------------------------------------------------------------------------------------------
    67. 'produzierte Druckrollen auslesen
    68. xml_Knoten = xml_Doc.SelectSingleNode("/bde/mengegut") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    69. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_drollengut" & ma_nummer).Text = (xml_Knoten.InnerText)
    70. End Sub

    8| :P
    ==> seid .net zueinander :D <3 <==

    Axxxxxl schrieb:

    ICH HABE IHN ALSO SCHON EINMAL ANGESPROCHEN!!!

    Du brauchst nicht zu schreien, hier ist niemand taub :rolleyes:

    Axxxxxl schrieb:

    Und hier nun, damit niemand heult

    Sag mal, in welchen Ton redest du mit mir? Ich habe dir DREI Mal eine Frage gestellt, weil DU Hilfe brauchst. Du ignorierst mich mehrmals und jetzt moserst du auch noch rum, oder was?

    Axxxxxl schrieb:

    VB.NET-Quellcode

    1. If ma_nummer = 54 Then HTTPAdresse = "http://lblmeew131"
    2. If ma_nummer = 55 Then HTTPAdresse = "http://lblmeew132"
    3. If ma_nummer = 56 Then HTTPAdresse = "http://lblmeew120"

    Dafür wurde Select Case erfunden:

    VB.NET-Quellcode

    1. Select Case ma_nummer
    2. Case 54
    3. HTTPAdresse = "http://lblmeew131"
    4. Case 55
    5. HTTPAdresse = "http://lblmeew132"
    6. Case 56
    7. HTTPAdresse = "http://lblmeew120"
    8. End Select


    Axxxxxl schrieb:

    VB.NET-Quellcode

    1. Dim Speed As String = System.Math.Truncate(Wert).ToString
    2. frm_main.Controls("grp_ma" & ma_nummer).Controls("lbl_speed" & ma_nummer).Text = Speed


    Geschwindigkeit misst sich in Zahlen und nicht in Buchstaben oder Zeichen. Also mach sie auch als Integer (wenn sie eine Ganzzahl ist), lass das erste .ToString weg und füg lieber in der zweiten Zeile eins hinzu.

    Axxxxxl schrieb:

    VB.NET-Quellcode

    1. CType(frm_main.Controls("grp_ma" & ma_nummer).Controls.Item("bar_" & ma_nummer), ProgressBar).Value = CInt(Speed)


    Und um erneut auf meine Frage zu kommen (du schaffst es immer noch nicht, sie zu beantworten, trotz der Großkotzigkeit):
    Hast du an DIESER Stelle die Progressbar angesprochen? Anstatt dem Codeungestüm einfach:

    VB.NET-Quellcode

    1. bar_54.Value=Speed 'ist ja dann schon Integer


    Dann siehst du erst, woran es liegt.
    @sonne75 (und nur an dich):
    jetzt sind wir wieder an dem Punkt, an dem scheinbar jedes 2. Forum im Internet "leidet". Es gibt immer jemand, der sich "mehrmals ignoriert" fühlt. (deswegen hab ich eben mal geschrien!), der mir "Großkotzigkeit" vorwirft und offensichtlich nervös wird, wenn mal jemand nicht gleich korrekt auf "seine" Fragen antwortet.
    Hey, ich bin dankbar für jeden Tipp und Hinweis hier, vor allem geht es hier sehr schnell mit Antworten (inklusive deiner!!!) und es ist für nen VB.net Laien auch nicht leicht, von der Lawine der Antworten nicht erschlagen zu werden. Deswegen bitte keine Streiterei und zurück zur eigentlichen Sache (per PN kannste mich gerne weiter maßregeln :* 8o :thumbup: )

    Mit folgenden Code:

    VB.NET-Quellcode

    1. frm_main.bar_54.Value = Speed
    2. frm_main.lbltest.Text = Speed
    3. frm_main.bar_test.Value = Speed


    passiert, dass das Label den korrekten Speedwert anzeigt und auch mein Testprogressbar (bar_test) korrekt aktualisiert wird.
    Der Bar "bar_54" hingegen in der Goupbox "grp_ma54" nicht.
    Versuche ich es mit

    VB.NET-Quellcode

    1. frm_main.grp_ma54.bar_54.Value = Speed
    meint er, dass es dieses Steuerelement nicht geben würde?!
    ==> seid .net zueinander :D <3 <==
    Was soll das dauernde frm_main eigentlich überhaupt? Sind die Controls nicht in derselben Form? Wie greifst du überhaupt dann auf sie zu?

    Axxxxxl schrieb:

    frm_main.bar_54.Value = Speed


    Axxxxxl schrieb:

    frm_main.grp_ma54.bar_54.Value = Speed


    Hast du zwei "bar_54" oder wie? Kann eigentlich nicht sein. Wenn sie direkt auf deiner Form liegt, dann ist es klar, warum sie in der Groupbox nicht gefunden wird. Anscheinend liegt sie zwar räumlich AUF der Groupbox, aber nicht IN der Groupbox.

    Axxxxxl schrieb:

    an dem scheinbar jedes 2. Forum im Internet "leidet". Es gibt immer jemand, der sich "mehrmals ignoriert" fühlt. (deswegen hab ich eben mal geschrien!), der mir "Großkotzigkeit" vorwirft und offensichtlich nervös wird


    Wie du siehst, bin ich bei weitem nicht die Einzige, die dein Verhalten nicht in Ordnung findet. Aber anstatt dass du dir überlegst, ob es an dir liegen könnte, schiebst du es natürlich an "immer jemand".
    Wie in dem Witz:
    "Achtung, ein Falschfahrer auf A6". "Einer? Hier sind Hunderte..."
    das "frm_main" daher, weil der Code in einem Modul läuft (was ich vielleicht ändern sollte?!) und nicht direkt im Code des Fensters "frm_main". Ich bin das halt so gewöhnt aus Excel VBA, dass man Code den man von verschiedenen Stellen verwendet, in ein Modul packt. Wenn das bei VB.net nicht der Fall ist, änder ich das auch. Brauch ihn ja nur zurück zu kopieren.

    Und es gibt nur für jede Maschine alles einmal, also für die 54 bswp. 1x grp_ma54 1x bar_54 1xlbl_speed54 usw.
    ==> seid .net zueinander :D <3 <==
    Du solltest das hier durchlesen:

    Instanziierung von Forms und Aufruf von Dialogen

    frm_Main ist eine Klasse und kein Objekt. Es ist zwar syntaktisch möglich, aber es passieren immer wieder Fehler, weil es nicht eindeutig definiert ist.

    Wenn du eine bar_54 hast, die direkt in der Form gefunden wurde, dann ist sie NICHT in einer Groupbox. Wie es hier schon gesagt wurde:

    sonne75 schrieb:

    Wenn sie direkt auf deiner Form liegt, dann ist es klar, warum sie in der Groupbox nicht gefunden wird. Anscheinend liegt sie zwar räumlich AUF der Groupbox, aber nicht IN der Groupbox.


    Und ja, ich fühle mich schon wieder ignoriert :rolleyes:

    Liest du eigentlich überhaupt, was ich schreibe, oder wozu mache ich das?
    So Freunde,

    ich habe heute allen Code aus dem Modul zurück in den Code meiner Form geholt und... uuunnnndddd.... es läuft, auch die Progressbars werden aktualisiert :thumbsup:
    Ich habe das Modul sicherheitshalber auch gleich gelöscht da dies lt. meiner kleinen Recherche nur noch ein "Relikt" in Anlehnung an die alte VB6 Zeit sein soll?!

    Nun ist mein Code sicher noch verbesserungswürdig. Ihr sagtet mal, dass ich "das ganze Maschinenzeugs in eine Klasse packen" soll. Deswegen (aber nur wenn ihr Lust habt!) hier nochmal der Code ausgeführt wird. Frage: Geht das überhaupt, diese Funktionen in eine Klasse für die Maschinen zu "transferieren"?!:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub druckmaschinen(ByVal ma_nummer As Integer)
    2. Select Case ma_nummer
    3. Case 54
    4. HTTPAdresse = "http://lblmeew131"
    5. Case 55
    6. HTTPAdresse = "http://lblmeew132"
    7. Case 56
    8. HTTPAdresse = "http://lblmeew120"
    9. End Select
    10. XMLString = Client.DownloadString(HTTPAdresse)
    11. xml_Doc.LoadXml(XMLString) ' ... XML-Datei aus String laden
    12. '----------------------------------------------------------------------------------------------------------------
    13. 'Geschwindigkeit auslesen und anzeigen
    14. xml_Knoten = xml_Doc.SelectSingleNode("/bde/application/geschwindigkeit")
    15. 'Double.TryParse(xml_Knoten.InnerText.Replace(".", ","), Wert)
    16. Dim Speed As Integer = CInt(xml_Knoten.InnerText)
    17. Controls("grp_ma" & ma_nummer).Controls("lbl_speed" & ma_nummer).Text = CStr(Speed)
    18. 'Progressbar anpassen
    19. CType(Controls("grp_ma" & ma_nummer).Controls.Item("bar_" & ma_nummer), ProgressBar).Value = Speed
    20. 'Hintergrund entsprechend Geschwindigkeit färben und LEDs laden
    21. If Speed <= 1 Then
    22. Controls("grp_ma" & ma_nummer).BackColor = System.Drawing.Color.FromArgb(255, 192, 192)
    23. CType(Controls("grp_ma" & ma_nummer).Controls("pic_led_" & ma_nummer), PictureBox).Image = CCL_Info_Monitor.My.Resources.Resources.Redlight
    24. Else
    25. Controls("grp_ma" & ma_nummer).BackColor = Color.LightGreen
    26. CType(Controls("grp_ma" & ma_nummer).Controls("pic_led_" & ma_nummer), PictureBox).Image = CCL_Info_Monitor.My.Resources.Resources.Greenlight
    27. End If
    28. '----------------------------------------------------------------------------------------------------------------
    29. 'Produktivstatus anzeigen
    30. Dim produktiv As String
    31. xml_Knoten = xml_Doc.SelectSingleNode("/bde/aktuell_produktiv")
    32. produktiv = xml_Knoten.InnerText
    33. If produktiv = "1" Then
    34. Controls("grp_ma" & ma_nummer).Controls("lbl_produktiv" & ma_nummer).Text = "produktiv"
    35. Else
    36. Controls("grp_ma" & ma_nummer).Controls("lbl_produktiv" & ma_nummer).Text = "Störung"
    37. End If
    38. '----------------------------------------------------------------------------------------------------------------
    39. 'FA auslesen und anzeigen
    40. Dim FA As String
    41. xml_Knoten = xml_Doc.SelectSingleNode("/bde/fertigungsauftrag")
    42. FA = Mid(xml_Knoten.InnerText, 6, 5)
    43. Controls("grp_ma" & ma_nummer).Controls("lbl_fa" & ma_nummer).Text = FA
    44. '----------------------------------------------------------------------------------------------------------------
    45. 'Auflage Stck. auslesen
    46. xml_Knoten = xml_Doc.SelectSingleNode("/bde/application/auflage")
    47. Controls("grp_ma" & ma_nummer).Controls("lbl_auflage" & ma_nummer).Text = (xml_Knoten.InnerText)
    48. '----------------------------------------------------------------------------------------------------------------
    49. 'Auflage brutto m auslesen
    50. xml_Knoten = xml_Doc.SelectSingleNode("/bde/application/brutto")
    51. Controls("grp_ma" & ma_nummer).Controls("lbl_brutto" & ma_nummer).Text = (xml_Knoten.InnerText)
    52. 'Maximum des Progressbar auf Bruttometer des FA setzen
    53. Auflage = CInt(xml_Knoten.InnerText)
    54. CType(Controls("grp_ma" & ma_nummer).Controls.Item("bar_prod" & ma_nummer), ProgressBar).Maximum = Auflage
    55. '----------------------------------------------------------------------------------------------------------------
    56. 'Gutmeter auslesen und anzeigen
    57. xml_Knoten = xml_Doc.SelectSingleNode("/bde/laengegut")
    58. Controls("grp_ma" & ma_nummer).Controls("lbl_metergut" & ma_nummer).Text = (xml_Knoten.InnerText)
    59. 'produzierte Gutmeter als Fortschritt% im Progressbar anzeigen und Text als Prozent anzeigen
    60. Gutmeter = CInt(xml_Knoten.InnerText)
    61. CType(Controls("grp_ma" & ma_nummer).Controls.Item("bar_prod" & ma_nummer), ProgressBar).Value = Gutmeter
    62. 'Fortschritt = CInt((Gutmeter * 100) / Auflage)
    63. Controls("grp_ma" & ma_nummer).Controls("lbl_prod" & ma_nummer).Text = Fortschritt & "%"
    64. '----------------------------------------------------------------------------------------------------------------
    65. 'Schlechtmeter auslesen und anzeigen
    66. xml_Knoten = xml_Doc.SelectSingleNode("/bde/laengeschlecht") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    67. Controls("grp_ma" & ma_nummer).Controls("lbl_meterschlecht" & ma_nummer).Text = (xml_Knoten.InnerText)
    68. '----------------------------------------------------------------------------------------------------------------
    69. 'produzierte Druckrollen auslesen
    70. xml_Knoten = xml_Doc.SelectSingleNode("/bde/mengegut") ' Mit XPath ab Anfang zum gesuchten Konten gehen
    71. Controls("grp_ma" & ma_nummer).Controls("lbl_drollengut" & ma_nummer).Text = (xml_Knoten.InnerText)
    72. End Sub
    ==> seid .net zueinander :D <3 <==

    Axxxxxl schrieb:

    in eine Klasse für die Maschinen zu "transferieren"?
    Völlig problemlos. Falls Du Shared Variablen oder Variablen in einem Modul hast, solltest Du die ggf. auch in eine Klasse packen und je nach Verwendung nicht Shared machen.
    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!