mjeheuer hat folgendes geschrieben: |
Erst einmal Danke für Deine Antwort. Ich war mir nicht sicher ob bei meiner schwammingen Beschreibung überhaupt jemand Antwortet  |
Offen gestanden weiß ich aber erst jetzt richtig, was du meinst ...
mjeheuer hat folgendes geschrieben: |
Meines Erachtens steht und fällt die Erkennung von nicht ASCII-Zeichen mit der folgenden Procedure im Beispielprogramm. Sie wird immer angesprochen wenn Daten vom Server/Switch gesendet werden: |
Korrekt.
Das Beispiel ist niedliches Anschauungsmaterial und macht mit den empfangenen Daten tatsächlich nichts anderes, als in ihnen nach Zeilenumbrüchen zu suchen und die gefundenen Zeilen ans Memo zu hängen. Dabei werden alle enthaltenen Bytes 1:1 übertragen und somit dann eben auch die Steuerzeichen angezeigt.
Das eigentliche Steuern, was diese Bytes normalerweise ausführen sollten, musst du selber implementieren. Das kann z.B. das Memo nicht von alleine.
Du musst also tatsächlich im Buffer nach #8 suchen und wenn du eines gefunden hast, dieses #8 und das Byte davor löschen. Wenn du alles abfangen willst, was von einem Telnet-Server kommen könnte, so musst du - abhängig von der verwendeten Terminalemulation (oft z.B. VT220) - auch ganze Steuersequenzen auswerten (eingeleitet meist durch #27 = Escape). Ein #7 (engl. Bell, zu deutsch Klingel) sollte z.B. dein Programm zu einem Beep veranlassen. Usw. usf. etc. pp.
Bleiben wir beim Backspace #8:
Wo und wie man das genau abfängt, können wir besprechen (meine Billig-Lösung siehe im Code unten). Aber bist du denn sicher, dass für das, was du im Endausbau erreichen möchtest, die Verwendung dieses Beispiels nebst Ausgabe in ein Memo ausreichend ist?

Kann ich mir eigentlich nicht unbedingt vorstellen ...
mjeheuer hat folgendes geschrieben: |
Hat vielleicht jemand schon einmal im Telnet-Beispielprogramm von Indy dieses Problem lösen können |
Nein. Ich habe mal als Teil eines Projektes ein VT220-Terminal stricken müssen unter Bedingungen, denen das Indy-Beispiel niemals hätte gerecht werden können. Ich habe alles selbst gebastelt (jaaa, das war tlw. basteln und nicht programmieren

) und war eigentlich nie wirklich zufrieden. Zwischendurch habe ich wie so ein Irrer eine fertige VT220-Terminal-Komponenten gesucht .... und nicht gefunden.
Langer Rede kurzer Sinn:
mjeheuer hat folgendes geschrieben: |
und kann mich auf die richtige Spur bringen? |
Wenn's denn das Beispiel sein soll ... ja.
Folgendes ist "heiße Nadel". Es könnte zu unschönen Ergebnissen führen, wenn das #8 am Anfang einer Zeile auftaucht, und es wird abstürzen, wenn das #8 am Anfang des Puffers steht. Da gilt es, einiges zu verfeinern, doch zum "auf die Spur bringen" dürfte es ein Anfang sein.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TfrmTelnetDemo.IdTelnetDemoDataAvailable(Sender: TIdTelnet; const Buffer: String);
const CR = #13; LF = #10; var Start, Stop, PosSteuer : Integer; begin
PosSteuer := pos(#8, Buffer); while PosSteuer >0 do begin delete(Buffer, PosSteuer-1, 2); PosSteuer := pos(#8, Buffer); end;
if Memo1.Lines.Count = 0 then Memo1.Lines.Add('');
... end; |