Laden...

Zeichen entgegennehmen und speichern

Erstellt von Tomatengewächs vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.982 Views
T
Tomatengewächs Themenstarter:in
8 Beiträge seit 2015
vor 9 Jahren
Zeichen entgegennehmen und speichern

Hallo Forum

Ich bekomme aus einer (gegebenen, nicht zu hinterfragenden) Quelle Zeichen. Diese Zeichen möchte ich speichern.

string Quelle

this.Speicher.Text += Quelle;

Alles funktioniert solage gut, wie die Quell - Zeichen druckbare ASCII Zeichen (ABCabc123,.-...) sind.
Da ich nun auch "löschen" Befehle (carriage return) auf meinen Text anwenden will, funktioniert das logischerweise nicht, da += nur etwas dazufügen kann. Wie löse ich mein Problem?

Besten Dank und danke für eure Geduld.

Tomatengewächs

B
357 Beiträge seit 2010
vor 9 Jahren

Regex? Eingabe auf Gültigkeit prüfen und entweder anhängen oder eben nicht.

T
Tomatengewächs Themenstarter:in
8 Beiträge seit 2015
vor 9 Jahren

Meinst du mit Regex das:

Regex

Eingabe auf Gültigkeit prüfen und entweder anhängen oder eben nicht.

Wenn ich von der Quelle einen Text empfange, der Folgendermassen lautet:

"Ich bin ein Blindtext und mache keinen Sinm[carriage return]n."

dann brint mir das anhängen mittels += des [carriage return] gar nichts.

Kannst du mir ev. ein Beispiel schicken?

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Tomatengewächs

falls du als Zeichen ein Carriage Return bekommst und eben das auf deinen string anwenden willst musst du das wohl oder übel behandeln. Also: Das Zeichen entgegennehmen, prüfen, ob es ein CR ist (wie auch immer du das bekommst, das sehen wir hier nicht) und dann eben statt anhängen ein zeichen wegnehmen. "Substring" wäre da ein Stichwort.

Aber ob das genau das ist, was du suchst, weiss ich nicht genau 😉

Gruss

Coffeebean

B
357 Beiträge seit 2010
vor 9 Jahren

Kannst du mir ev. ein Beispiel schicken?

Nun, wenn du schreibst, du empfängst Zeichen, gehe ich von einzelnen Characters aus. Aber auch wenn du solche Texte bekommst, ist das doch erst mal relativ einfach, da mal schnell durch alle Chars zu iterieren und zu prüfen, ob es ein erlaubtes Zeichen ist?

Pseudocode:

foreach (char c in Quelle)
{
   if (ZeichenErlaubt(c))
   {
        this.Speicher.Text += c;
   }
}
T
Tomatengewächs Themenstarter:in
8 Beiträge seit 2015
vor 9 Jahren

Oh, Fensterscheibe! 😦

Ich habe den falschen Begriff verwendet.

ich meine nicht den "Enter", "carriage return" sondern die "löschen Taste", also die "Backspace" Taste. Ich hielt das "return" von "carriage return" fälschlicherweise für die "löschen Taste".

Diese Taste funktioniert also nicht:

Backspace

Dann reden wir auch nicht mehr aneinander vorbei.

Sorry.

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Tomatengewächs,

ich würde erst alles zusammenhängen und dann alle Backspaces mit dem jeweils vorangegangenen Zeichen raushauen:

output = Regex.Replace (input, ".[carriage return]", "");

Das müsstest du allerdings sooft aufrufen, wie [carriage return]-Zeichen direkt aufeinanderfolgend vorkommen können, z.B. in einer Schleife bis sich das Ergebnis nicht mehr ändert.

Hallo bredator,

+= für alle Zeichen eines lagen Textes kann schwer in die Hose gehen. Wenn man einzelne Zeichen zu einem langen String zusammenfügen will, sollte man besser StringBuilder verwenden. Siehe dazu auch [Artikel] Strings verketten: Performance-Betrachtung.

Davon abgesehen weiß Tomatengewächs erst an den folgenden Backspaces, ob die vorangegangenen Zeichen "erlaubt" sind oder nicht. Nicht an dem aktuellen Zeichen.

herbivore

T
Tomatengewächs Themenstarter:in
8 Beiträge seit 2015
vor 9 Jahren

Deiner Quelle nach ist für mich folgendes das beste:

\x hhhh

Unicode character in hexadecimal notation if this escape sequence is used in a wide-character constant or a Unicode string literal.

For example, WCHAR f = L'\x4e00' or WCHAR b[] = L"The Chinese character for one is \x4e00".

das würde für Backspace = 0x0008 heissen.


Um das ganze für euch etwas einfacher zu machen, die Quelle ist die serielle Schnittstelle. Von der kommen die Zeichen. Bisher konnte ich einfach die druckbaren Zeichen in der Textbox anzeigen, bei einem backslash erscheint ein komisches Zeichen.

Der Empfangscode dazu:

private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
        {
            InputData = ComPort.ReadExisting();                         //neue emfangenen Daten zwischenspeichern
            if (InputData != String.Empty)
            {
                this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
            }
        }
        private void SetText(string text)                               //Ankommende Zeichen speichern und in der Textbox anzeigen
        {
            
           this.rtbIncoming.Text += text;
        }
T
Tomatengewächs Themenstarter:in
8 Beiträge seit 2015
vor 9 Jahren

Juhui!!! Ich konnte mein Problem lösen. Ich enthalte euch aber nicht meine Vorgehensweise:

private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
        {
            InputData = ComPort.ReadExisting();                         //neue emfangenen Daten zwischenspeichern
            if (InputData != String.Empty)
            {
                this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
            }
        }
        private void SetText(string text)                               //Ankommende Zeichen speichern und in der Textbox anzeigen
        {
            if (text == "\u0008")
            {
                string speicher = rtbIncoming.Text;

                rtbIncoming.Text = speicher.Substring(0, speicher.Length - 1);


            }
            else
            {
                this.rtbIncoming.Text += text;
            }
            
        }

Trotzdem danke für eure Zeit!

Tomatengewächs.

Hinweis von Coffeebean vor 9 Jahren

Bitte benutze die Code-Tags