Moin Leute,
ich habe eine RTB in die ich Daten von der seriellen Schnittstelle einlese.
Die Daten von der Schnittstelle sprudeln permanent ein,
das heißt mehrere Telegramme kommen pro Sekunde rein.
Es findet also ne Menge traffic statt.
Dabei scrolle ich immer an die aktuelle Position:
RTB.SelectionStart = RTB.Text.Length;
ScrollToCaret();
Das scrollen klappt auch soweit ...
Nur wird der neue Input beim scrollen immer wieder falsch ausgegeben,
dieses Problem tritt nicht immer auf, nur ab und zu beim Scrollen.
Ich nehme an das liegt an SelectionStart ...
Wenn ich das Scrollen weg lasse, dann bekomme ich die richtige Ausgabe.
Setzt er beim SelectionStart den Cursor an die Position XX oder wie siehts aus?
Den der neu ankommende Text wird halt ab und zu ohne Zeilenumbruch
eingefügt, und das darf nicht passieren.
Gruß
Budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!
Hallo
an sich ist es korrekt so. Prüf doch erstmal, ob es nur ein Darstellungsproblem ist oder ob der Text in der TextBox tatsächlich falsch gespeichert wird.
herbivore
Hm ... mach ich mal.
Ich habs jetzt einfach mal mit Scrollen und einmal
ohne Scrollen getestet.
Und die Ausgaben sind nur dann fehlerhaft, wenn ich scrolle ...
Gruß
Budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!
Hallo budili,
das hattest du ja schon oben geschrieben. Damit ist aber meine Frage nicht beantwortet, ob der Text nur fehlerhaft dargestellt oder fehlerhaft gespeichert ist/wird.
herbivore
Hallo budili,
wie übergibst du denn die Daten an die RTB?
Verwendest du RTB.AppendText()?
Ja ich füge den Text mit RTB.AppendText(input); ein ....
Debuggen kann ich das Problem auch nicht, da der Fehler willkürlich
auftaucht und ich nie weiß, wann es passiert.
Wenn ich debugge, dann funktionierts richtig.
Der Fehler taucht relativ selten auf (im Schnitt einmal bei ca 200-1000 Telegrammen).
Ich glaube das liegt daran:
Durch SelectionStart = XXX ....
Lege ich den Cursor unten an die aktuelle Position,
kurze Zeit später, kommt ein neues Telegramm,
er schreibt das neue Telegramm nicht in die neue Zeile,
sondern an die position vom Cursor ...
Wäre das möglich?
Code für die Ausgabe:
delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.RTB.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.AusgaberichTextBox.AppendText(text);
ScrollbarDown();
}
}
private void ScrollbarDown()
{
this.AusgaberichTextBox.SelectionStart = AusgaberichTextBox.Text.Length;
this.AusgaberichTextBox.ScrollToCaret();
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
InputData = port.ReadLine();
}
catch (Exception)
{
InputData = String.Empty;
}
if(!String.IsNullOrEmpty(InputData))
SetText(InputData);
}
Das ganze läuft noch nebenbei über ein Socket, also nachdem ich
es von der Schnittstelle empfangen habe, sende ich das über
ein Socket an ein anderes Prog, das Prog verarbeitet es und
schickt es mir wieder zurück.
Am Socket sollte es eigentlich nicht liegen, wie schon oben
erwähnt, taucht das Problem nur beim Scrollen auf ...
Weiß da jemand weiter ??
Gruß
Budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!
Hallo budili,
das letzte Zeichen im string text sollte ein '\n' (Zeilenumbruch) sein, damit die SelectionStart immer in der letzten leeren Zeile steht.
Hallo budili,
Wäre das möglich?
wo SeletionStart steht sollte für AppendText keine Rolle spielen.
herbivore
Hmm .. also dann weiß ich auch nicht weiter.
@punktdevil: Habe auch schon probiert vor
SetText(InputData) (bzw. vor der Ausgabe) die letzten beiden Zeichen
zu prüfen, ob es ein "\n" ist.
Hat aber nicht weiter geholfen ....
Gruß
Budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!
Hallo budili,
ich habe ja schon geschrieben, was du probieren sollst. Und das ist ja nun wirklich einfach. Warten bis ein Fehler auftritt und dann gucken, was eigentlich in der TextBox steht. Im Zweifel kriegt man das immer per Logging hin.
herbivore
Hallo budili,
zeig doch mal wie dein Text aussieht, wenn er "falsch" eingefügt wurde.
Hast du schon probiert statt AppendText(text), AppendText(text+"\n") zu verwenden?
@punkdevil: das funktioniert nicht, weil ich ja sonst nach jedem Telegram,
einen Umbruch hätte ...
Von 200 Telegrammen ist ja nur eins nicht korekt, anders wärs umgekehrt.
@herbivore: ich logge das mit in einer Datei, dort sind die selben
Ausgaben wie auch auf der Textbox.
Ich dachte die ganze Zeit, das es irgendwie an dem Socket liegen müsste,
ist aber wie es aussieht nicht der Fall.
Hier mal ein fehlerfreies Bsp:
T 18.07.07 15:46:53 HRx1A : K00##1001\A0 // <LC 1, Port 0> <P1K01>, key pressed,
T 18.07.07 15:46:53 HTx**+: W00011F // TW/PA connection from <LC 0, Port 0> to <LC 0, Port 1>, prio.: 5,
T 18.07.07 15:46:53 HTx**-: H##??D001 1Tisch // <LC 1, Port 0> unknown type, state unknown,
T 18.07.07 15:46:53 HTx**-: H##??d001 // <LC 1, Port 0> unknown type, state unknown,
T 18.07.07 15:46:53 HRx1A : k00##1001\A0 // <LC 1, Port 0> <P1K01>, key released,
T 18.07.07 15:46:53 HTx**+: w00011F // TW/PA disconnection from <LC 0, Port 0> to <LC 0, Port 1>, prio.: 5,
T 18.07.07 15:46:54 HRx1A : K00##1001\A0 // <LC 1, Port 0> <P1K01>, key pressed,
T 18.07.07 15:46:54 HTx**+: W00011F // TW/PA connection from <LC 0, Port 0> to <LC 0, Port 1>, prio.: 5,
T 18.07.07 15:46:54 HTx**-: H##??D001 1Tisch // <LC 1, Port 0> unknown type, state unknown,
Und nun mit Fehler:
T 18.07.07 15:48:52 HRx1A : K00##1008\A0 // <LC 1, Port 0> <P1K08>, key pressed,
A 18.07.07 15:48:52 DTx : q##00
T 18.07.07 15:48:52 HTx**-: q##00
T 18.07.07 15:48:52 HRx1A : k00##1008\A0 // <LC 1, Port 0> <P1K08>, key released,
A 18.07.07 15:48:53 DTx : q##00T 18.07.07 15:48:54 HTx**-: q##00
T 18.07.07 15:48:54 HRx1A : K00##1008\A0 // <LC 1, Port 0> <P1K08>, key pressed,
A 18.07.07 15:48:54 DTx : q##00T 18.07.07 15:48:55 HTx**-: q##00
T 18.07.07 15:48:55 HRx1A : k00##1008\A0 // <LC 1, Port 0> <P1K08>, key released,
Was das bedeutet ist ja nicht so wichtig.
So jetzt schaut euch mal die beiden Telegramme an:
Gruß
Budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!
Hallo budili,
prüf doch wirklich mal die Telegramme ob alle sie vor dem Einfügen korrekt einen Zeilenvorschub am Ende haben. Oder ob die Ausreißer eben keinen haben.
herbivore
Hallo budili,
nach jedem ein Zeilenvorschub einzufügen sollte eher ein Test sein.
Weiter oben sagte ich ja auch, dass du überprüfen sollst, ob ein Zeilenvorschub ('\n') als letztes Zeichen drin ist. Wenn nicht, fügts du eben einen ein.
Okay, Danke erstmal.
Werde das morgen früh tun und mich dann nochmal melden.
Gruß
Budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!
Mahlzeit,
ich habe mal mit geloogt und geschaut. Der Log ist derselbe wie auf
in der RTB...
Nur verstehe ich nicht, wieso es, wenn ich die Funktion "ScrollbarDown"
nicht verwende, einwandfrei funktioniert ....
Gruß
Budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!
Hallo budili,
hast du das schon gemacht?
prüf doch wirklich mal die Telegramme ob alle sie vor dem Einfügen korrekt einen Zeilenvorschub am Ende haben. Oder ob die Ausreißer eben keinen haben.
herbivore
Ja hab ich!
Das Log File und die Ausgabe in der RTB sind identisch.
Was heißen würde, dass die Telegramme falsch reinkommen.
Was aber wiederrum nicht verständlich ist, ist das mit der Scrollbar,
wieso macht er es richtig, bei nicht mitscrollender Scrollbar?
Da tauchen keine Ausreißer auf....
Gruß
Budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!
Hallo budili,
das muss dann noch ein Fehler in deinem Code sein. Kann mir nicht vorstellen, dass das ein Bug der TextBox ist und für die hat wie gesagt SelectionStart keinen Einfluss auf AppendText.
herbivore
Ja, ist natürlich möglich.
Ich werde nochmal schauen ... (kA wo ... aber ich versuchs 😄)
Gruß
budi
Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!