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
Regex? Eingabe auf Gültigkeit prüfen und entweder anhängen oder eben nicht.
Meinst du mit Regex das:
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?
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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;
}
}
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:
Dann reden wir auch nicht mehr aneinander vorbei.
Sorry.
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
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;
}
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.
Bitte benutze die Code-Tags