Entwickler-Ecke
Internet / Netzwerk - Telnet mit Indy - Wie Sonderzeichen verhindern?
mjeheuer - So 14.01.07 12:42
Titel: Telnet mit Indy - Wie Sonderzeichen verhindern?
Hallo zusammen
Zur Vorgeschichte:
Ich versuche zunächst einen einfachen Telnet-Client auf Grundlage der Indy-Komponente und dem Beispielprogramm zu erstellen.
Später soll noch eine Verbindung zu einem MySQL-Server dazukommen in dem dann u.a. die IP-Adressen stehen sollen (es geht um mehrere tausend Switche die angesprochen werden sollen)
Das Problem:
Dabei bin ich hier auf ein Problem gestoßen das ich seit einigen Tagen versuche zu lösen, jedoch ohne nennenswerte Erfolge.
Im großen und ganzen macht bereits das Beispielprogramm was ich erwarte, jedoch dürfen es bei bestimmten Tastendrücken keine Sonderzeichen im Memofeld erscheinen!
Es geht hier besonders die Reaktion des Programms auf die Taste Backspace.
Hier werden immer Sonderzeichen (ein Quadrat, oder ein Balken je nach Schrifttyp) gezeigt, statt das der Cursor einfach ein Zeichen zurück geht.
Hat vielleicht jemand schon einmal im Telnet-Beispielprogramm von Indy dieses Problem lösen können und kann mich auf die richtige Spur bringen?
Ich habe auch schon mal die Komponente TnEmulIVT von Overbyte getestet. Dort kann man dieses "Echo" ausschalten.
Leider kommt die Komponente TnEmulIVT nicht in Betracht, da man dort markierten Inhalt scheinbar nicht in das Clipboard kopieren kann, was eine andere Voraussetzung für mich ist.
Gruß
Michael
IngoD7 - So 14.01.07 19:27
Es kommt ja immer so'n bisschen drauf an, welche Emulation hüben und drüben gefahren wird. Davon abhängig gehen manchmal durchaus Bytes über die Leitung, die man so nicht unbedingt erwartet und die dann händisch im Programm erst noch umgesetzt werden müssen.
Nenne doch erstmal die Version von den Indys, die du benutzt und poste das von dir schon geänderte Beispiel, damit man das vielleicht mal live und in Farbe nachvollziehen kann. Ohne Zugriff auf den von dir benutzten Server wird's schon schwierig genug, aber so gaaaanz ohne Code erst recht.
mjeheuer - Mo 15.01.07 10:21
IngoD7 hat folgendes geschrieben: |
Nenne doch erstmal die Version von den Indys, die du benutzt und poste das von dir schon geänderte Beispiel, damit man das vielleicht mal live und in Farbe nachvollziehen kann. Ohne Zugriff auf den von dir benutzten Server wird's schon schwierig genug, aber so gaaaanz ohne Code erst recht. |
Hallo Ingo
Erst einmal Danke für Deine Antwort. Ich war mir nicht sicher ob bei meiner schwammingen Beschreibung überhaupt jemand Antwortet :)
Ich arbeite hier mit D7 und den Indy-Komponenten Version 9 vom 26Okt04 (laut Dateiname)
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:
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: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| procedure TfrmTelnetDemo.IdTelnetDemoDataAvailable(Sender: TIdTelnet; const Buffer: String);
const CR = #13; LF = #10; var Start, Stop : Integer; begin if Memo1.Lines.Count = 0 then Memo1.Lines.Add('');
Start := 1; Stop := Pos(CR, Buffer); if Stop = 0 then Stop := Length(Buffer) + 1; while Start <= Length(Buffer) do begin Memo1.Lines.Strings[Memo1.Lines.Count - 1] := Memo1.Lines.Strings[Memo1.Lines.Count - 1] + Copy(Buffer, Start, Stop - Start); if Buffer[Stop] = CR then begin Memo1.Lines.Add(''); {$IFNDEF Linux} SendMessage(Memo1.Handle, WM_KEYDOWN, VK_UP, 1); {$ENDIF} end; Start := Stop + 1; if Start > Length(Buffer) then Break; if Buffer[Start] = LF then Start := Start + 1; Stop := Start; while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do Stop := Stop + 1; end; PostMessage(Memo1.Handle,WM_VSCROLL,SB_BOTTOM,0);
end; |
Ich habe hier mal das Original angegeben, da meine Versuche bisher dahin gingen das ASCII-Zeichen #08 (Backspace) irgendwie herauszufiltern.
Es handelt sich um ein Ereignis der Telnetkomponente die aufgerufen wird wenn Daten eingehen. Die Daten selbst sind in der Variablen "Buffer"
Der Server/Switch reagiert korrekt, d.h. ein Zeichen das ich zuvor mit Backspace wieder gelöscht habe wird nicht verarbeitet. Es wird aber durch diese Funktion als Sonderzeichen im Memofeld dargestellt.
Gruß
Michael
Moderiert von
matze: Delphi-Tags hinzugefügt
IngoD7 - Mo 15.01.07 12:11
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? :gruebel: 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 :roll: ) und war eigentlich nie wirklich zufrieden. Zwischendurch habe ich wie so ein Irrer eine fertige VT220-Terminal-Komponenten gesucht .... und nicht gefunden. :crying:
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; |
mjeheuer - Mo 15.01.07 16:35
Zitat: |
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:
| procedure TfrmTelnetDemo.IdTelnetDemoDataAvailable(Sender: TIdTelnet; const Buffer: String); [...] | |
Danke für den Anstoß. Jetzt weiß ich wo ich anfassen muß. :-)
Gruß
Michael
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!