Probleme mit RichTextBox

  • VB.NET

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

    Probleme mit RichTextBox

    Hallo mein Name ist Hubert.

    Ich komme von VB6 und arbeite mich jetzt VB 2019 ein. Ich habe ein Problem mit der RichTextBox.

    Ich habe ein Windows-Frame mit dem Namen "Terminal" In diesem Frame gibt es eine RichTextBox mit den Name "RB_TermIn"
    In einem anderen Frame FrmCOM_1" habe ich ein SerialPort eingebunden. Ich kann aus allen Frames über die FrmCOM_1 ohne Probleme Daten senden, es kommen auch Rückmeldedaten zurück (als String und im Debug.Print angezeigt)
    Ich kann mir ebenfalls im Frame Terminal die Rückmeldedaten mit Debug.Print anzeigen lassen.
    Mein Problem: Ich kann die Daten vom Frame FrmCOM_1 weder über den Befehl Terminal.RB_TermIn.Text &= Rückdaten, noch mit dem Befehl Terminal.RB_TermIn.appendtext(Rückdaten) direkt in die Rich-Box schreiben.
    Ich habe wirklich lange Google nach diesem Problem befragt, leider ohne Erfolg.

    Kann mir hier jemand weiter helfen?

    Danke und Gruß
    Hubert

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

    @HubisVB Willkommen im Forum. :thumbup:
    Falls da eine Exception "Threadübergreifender Vorgang" oder so kommmt, wäre es hilfreich, wenn Du das dazu schreiben würdest.
    Falls das so ist, porbier mal dies:

    VB.NET-Quellcode

    1. Private Sub Port_ReceiveData(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim txt = SerialPort1.ReadExisting
    3. Me.Invoke(New Action(Of String)(AddressOf Append), txt)
    4. End Sub
    5. Private Sub Append(txt As String)
    6. RichTextBox1.AppendText(txt)
    7. 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!
    Was ist denn ein Frame?
    Das kenn ich nur als vb6-Control - in vb.net ists mir unbekannt.

    Ansonsten vermute ich, dass du auf Form-Instanzen via Klassen-Namen zugreifst.
    In Threading-Szenarien geht das daneben. Und SerialPort antwortet glaub in einem Neben-Thread.

    Mehr kann man zu deim Code nicht sagen, man sieht ihn ja nicht. (Eiglich habich bereits viel mehr gesagt, als ühaupt möglich - ich sag ja: "vermutung")
    Hallo RodFromGermany

    vielen Dank für deine schnelle Antwort. Leider funktioniert dein Beispiel nicht. Deshalb habe ich dir mein DataReceived beigefügt.
    Sorry auch an ErfinderDesRades. Wie ich bereits geschrieben habe, bin ich noch am einarbeiten und kenne deshalb noch nicht alle Fachbegriffe.
    In Zukunft wird dies natürlich besser.


    VB.NET-Quellcode

    1. Sub CPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CPort1.DataReceived
    2. Try
    3. Dim ComInp As String
    4. ComInp = CPort1.ReadLine '* Rückmeldedaten einlesen
    5. DataEin = "C1" & ComInp
    6. Debug.Print("C1-Ein = " & DataEin)
    7. Terminal.RT_Com1Term.Text = DataEin '* Daten in Terminal.RT_Com1Term schreiben
    8. ' FrmDatFilter.FilterWahl(DataEin, "C1")
    9. Catch ex As Exception
    10. FrmMeldungen.TryError("FrmCOM_1.DataReceived", ex.Message, 0)
    11. MsgBox("COM_1 Fehler bei Daten-Empfang")
    12. End Try
    13. End Sub


    Danke und Gruß
    Hubert

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „HubisVB“ ()

    @HubisVB Kennzeichne mal den Quellcode als solchen: Alles markieren und den VB.NET-Button über dem Post-Editor drücken.
    Was genau passiert, wenn Text empfangen wird?
    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!
    Und was passiert, wenn Du Post#2 mit Post#4 kombinierst zu

    VB.NET-Quellcode

    1. Terminal.Invoke(Sub() Terminal.RT_Com1Term.Text = DataEin)
    was dann innerhalb Deiner CPort1_DataReceived-Sub aufgerufen werden muss.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    HubisVB schrieb:

    kenne deshalb noch nicht alle Fachbegriffe
    Das kommt mit der Zeit. (Muss!).
    Kernfrage ist meist: Welchen Datentyp hat das Objekt?
    Das frage ich dich jetzt: Welchen Datentyp hat das Objekt Terminal?
    Folge dem gegebenen Link, wenn du Schwierigkeit hast, die Frage zu beantworten.
    Meine Vermutung aus post#3 erhärtet sich - ich vermute nämlich, dass Terminal ein Form ist (Form gibts in vb.net, Frame nicht).
    Und du verwendest es glaub genau falsch - wie vermutet.
    Aber das ist noch immer Vermutung, solange du nicht sagst, welchen Datentyp Terminal hat.

    @VaporiZed: Das bringt glaub nix, weil dieses Terminal läuft ja selbst im NebenThread.
    Aber das bringt mich auf folgenden Experiment-Vorschlag:

    VB.NET-Quellcode

    1. Me.Invoke(Sub() Terminal.RT_Com1Term.Text = DataEin)

    Oder wenn garnix geht:

    VB.NET-Quellcode

    1. Application.OpenForms(0).Invoke(Sub() Terminal.RT_Com1Term.Text = DataEin)

    Hallo VaporiZed,

    danke für die Antwort. Leider bekomme ich folgende Fehlermeldung : Ausnahme ausgelöst: "System.InvalidOperationException" in System.Windows.Forms.dll

    Gruß Hubert

    Hallo,

    in meinem Thema >> Probleme mit RichTextBox << konnte ich plötzlich nicht mehr antworten, der Button war nicht mehr da. Ich hatte nur noch die Möglichkeit, ein neues Thema zu öffnen.

    Ich wollte ErfinderDesRades für seine Lösungsvorschläge danken. Der Vorschlag >> Application.OpenForms(0).Invoke(Sub() Terminal.RT_Com1Term.Text = DataEin) <<
    ist die Lösung.

    Also nochmals Danke

    Gruß
    Hubert

    Beiträge zusammengeführt ~VaporiZed

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

    Du kannst innerhalb von 30 Minuten nur 1 Antwort geben, wenn Du der letzte bist, der geantwortet hat. In diesen 30 Minuten kannst Du Deinen letzten Post nur editieren, aber keine weitere Antwort erstellen. Spamschutz.

    HubisVB schrieb:

    Der Vorschlag >> Application.OpenForms(0).Invoke(Sub() Terminal.RT_Com1Term.Text = DataEin) <<ist die Lösung.
    Nein. Es ist ein Workaround, der zwar zum Ziel führt. Aber das Problem ist Dein Codedesign. Aber solange das auf absehbare Zeit das einzige Problem dieser Art ist, kümmer Dich erstmal nicht weiter drum.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ...ist die Lösung....
    Gut, da haste nun schön eine Lösung, aber keine Ahnung warum.
    Und kannst nachwievor keine Klasse von einem Objekt unterscheiden, oder von einem Objekt den Datentyp angeben.
    Das wäre in meinen Augen der wirkliche Gewinn gewesen - nicht, dass da nun iwas inne Richtextbox erscheint.
    Hurra es geht wieder.

    Also, ErfinderdesRades hab vielen Dank. dein zweiter Lösungsvorschlag hat mein Problem behoben. Ich frage mich nur,
    warum man dies so kompliziert machen muss. Bei früheren Versionen konnte man mit dem Befehl Terminal.RT_Com1Term.Text = DataEin
    aus jeder Class in die >> RT_Com1Term << schreiben.
    Muss mich noch sehr sehr umstellen.

    Nochmals Danke
    Gruß
    Hubert

    HubisVB schrieb:

    Muss mich noch sehr sehr umstellen.
    Ja, das müssen alle, die von vb6 kommen.
    Tatsächlich lernt man vb.net schneller (und vor allem richtig), wenn man keine Vorerfahrung hat, oder zumindest nicht mit vb6.

    HubisVB schrieb:

    ...Bei früheren Versionen...
    Das schlag dir aus Kopf: vb6 ist keine frühere Version von vb.net.
    Vielleicht 20 Schlüsselworte sehen noch gleich aus, aber die Sprache tickt ganz anders, und alles, was zu tun ist (ausser die 4 Grundrechenarten) macht man in .Net komplett anders als in vb6.

    Nachwievor sehe ich als dein Problem, dass du nicht weisst, was ein Datentyp ist, und dass du eine Klasse nicht von einem Objekt unterscheiden kannst.
    Diese Konzepte sind aber fundamental: Ein Objekt vom Typ String kann was anderes als ein Objekt vom Typ DateTime.
    Und ein Objekt vom Typ SerialPort kann wieder etwas vollkommen anderes, und ist ausserdem höchst komplex aus anderen Objekten zusammengesetzt.
    Und der Datentyp Terminal erbt von Form - jetzt hab ich dir vorgesagt, was du mir nicht beantworten konntest.

    Wenn wolle, guckma hier rein: Grundlagen: Fachbegriffe

    Das ist aber nur ein Überflieger. Von Datentyp, Objekt, Vererbung braucht man ein tiefes Verständnis - vielleicht suchst du dir ein Gratis-Buch im Internet: Löffelmann 2005 oder Kühnel/Leibhard. Von Löffelmann gibts auch neuere Auflagen, deren Grundlagen-Behandlung ist aber nicht so gründlich.
    Ein wenig OT

    ErfinderDesRades schrieb:

    Ja, das müssen alle, die von vb6 kommen.
    Tatsächlich lernt man vb.net schneller (und vor allem richtig), wenn man keine Vorerfahrung hat, oder zumindest nicht mit vb6.

    Ach komm schon. Dieser Programmiersprachenvergleich was nun besser, schneller, richtiger ist als andere Sprachen ist so alt und vor allem nicht hilfreich. Wahrscheinlich lachen die C++ler über die VB.NETler, die PowerBasic User über die Delphi User oder auch umgekehrt usw usw. Ich bin in VB6 sowie in VB.NET zu Hause und ehrlich, ich bin froh mit VBC angefangen zu haben. Klar war der Einstig in VB.NET anders als in VBC. Ich kenne auch die Vor- und Nachteile beider Sprachen. Was ich in VBC mit ein paar wenigen Zeile Code erreiche ist in VB.NET teilweise ein Krampf, schlicht nicht vorhanden oder verwendet intern veraltete APIs usw. Auf der anderen Seite, VB.NET bietet Multithreading, man spart sich das ganze APIs, Const, Types (Structure) getipple usw für die Standard Sachen. Vererbung, Constructor für Klassen und Structure, Überladen von Funktionen uvm. Alles ganz easy (ein Träumchen wenn es sowas auch in VBC standardmäßig geben würde). Wie Du siehst, hat jede Sprache ihre Vor- und Nachteile und keine ist besser oder richtiger als die andere (nur anders). Wenn Du die Vorteile aller Sprachen vereinen kannst, dann hast Du ein perfektes Programmierwerkzeug. In dem Sinne: Fohe Ostern @all. ;)
    Mfg -Franky-

    Von VB6 auf VB.net

    Hallo,

    sicherlich ist dieses Thema nicht neu. Unter VB.Net werden Fachbegriffe wie >> Welchen Datentyp hat das Objekt? << usw. als absolut notwendig betrachtet. ErfinderdesRades hat hier sicherlich recht, wenn er ganz speziell auf diese Fachbegriffe hinweist.
    Schaut man sich aber beide (VB6 und VB.Net) an, so sind sie in vielen Bereichen ähnlich, ich sage nicht gleich.
    In meinem Thema >> Probleme mit RichTextBox << ist genau hier ein wesentlicher Unterschied aufgetaucht. Ich konnte unter VB6 aus jeder Klasse jedes Objekt in anderen Klassen direkt "ansprechen", dies ist in VB.Net so einfach nicht möglich.

    Erlaubt mir noch ein Beispiel:

    Es gibt zwei Klassen: Klasse 1 mit dem Namen "Klas1", in der ein Objekt CheckBox mit dem Name "Frage" eingebunden ist. Die zweite Klasse heißt "Klas2".
    Unter VB6 konnte man aus Klas2 mit dem Befehl klas1.Frage.Checked abfragen, ob das Objekt den Wert True oder False zurück gibt. Dies ist unter VB.Net leider so nicht möglich, dies macht es mir deshalb sehr schwer.

    Thema: Klassenübergreifende Zugriff auf Objekte

    VaporiZed spricht hier von Problemen in meinem Codedesign....Er hat sicherlich Recht, aber wie soll man nun so ein Codedesign aufbauen?

    Ihr seht, es ist für mich als Umsteiger alles andere als leicht.

    Sorry wenn ich hier vielleicht ein bisschen nerve, aber bei diesen Begriffen fühle ich mich ;( ?( :?:

    Trotzdem Danke für eure Unterstützung

    Gruß und ein frohes Ostern
    Hubert

    HubisVB schrieb:

    aber wie soll man nun so ein Codedesign aufbauen?
    Zunächst solltest Du versuchen, zu beschfreiben, was Du erreichen willst.
    Und das alles ohne irgend eine Zeile Quelltext dazu zu verwenden.
    Und:
    Wenn Du einen User persönlich ansprechen willst, gibt es zwei Möglichkeiten:
    die Anrede-Funktion mit Mitteilung an den User: @ NAME_DES_USERS => @HubisVB
    und ohne Mitteilung [ user ]NAME_DES_USERS[ /user ] => HubisVB
    ohne die Leerzeichen nach dem @ bzw. um user und /user.
    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!