Laden...

RTB scrollen bei permanentem Input

Erstellt von budili vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.877 Views
B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren
RTB scrollen bei permanentem Input

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!

49.485 Beiträge seit 2005
vor 16 Jahren

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

B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren

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!

49.485 Beiträge seit 2005
vor 16 Jahren

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

P
992 Beiträge seit 2007
vor 16 Jahren

Hallo budili,

wie übergibst du denn die Daten an die RTB?

Verwendest du RTB.AppendText()?

B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren

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!

P
992 Beiträge seit 2007
vor 16 Jahren

Hallo budili,

das letzte Zeichen im string text sollte ein '\n' (Zeilenumbruch) sein, damit die SelectionStart immer in der letzten leeren Zeile steht.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo budili,

Wäre das möglich?

wo SeletionStart steht sollte für AppendText keine Rolle spielen.

herbivore

B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren

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!

49.485 Beiträge seit 2005
vor 16 Jahren

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

P
992 Beiträge seit 2007
vor 16 Jahren

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?

B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren

@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:

  • 15:48:53
  • 15:48:54
    eigentlich ist nach : q##00 Ende, d.h. das T 18.07.07 ...
    müsste in die nächste Zeile, was nicht der Fall ist.

Gruß
Budi

Nimm das Leben nicht zu ernst - denn du kommst nicht lebend raus!

49.485 Beiträge seit 2005
vor 16 Jahren

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

P
992 Beiträge seit 2007
vor 16 Jahren

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.

B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren

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!

B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren

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!

49.485 Beiträge seit 2005
vor 16 Jahren

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

B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren

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!

49.485 Beiträge seit 2005
vor 16 Jahren

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

B
budili Themenstarter:in
171 Beiträge seit 2007
vor 16 Jahren

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!