2016-04-01 54 views
-1

Ansi kod dizeleriyle uğraşırken güçlük çekiyorum. Ben [32m, [37m, [K vs chars alıyorum.Delphi XE3 - Ansi Kodunu/Rengi Kaldır dizgeden

ansi kodlarının başlangıç ​​ve bitiş noktalarını ararken chars aracılığıyla döngü yapmak yerine aldığım dizelerden ansi kodlarını ortadan kaldırmak/şeritlemenin daha hızlı bir yolu var mı?

Bildirimin böyle bir şey olduğunu biliyorum: #27'['#x';'#y';'#z'm'; Burada x, y, z ... ANSI kodlarıdır. Bu yüzden "m;" yi bulana kadar # 27 aramam gerektiğini düşünüyorum.

İstediğim şeyi elde etmek için önceden yapılmış işlevler var mı? Aramam, this makalesi dışında hiçbir şey döndürmedi. Teşekkür

Böyle kodu (en basit sonlu durum makinesi) ile çok hızlı bu protokolü tedavi edebilir
+0

Telnet renklerin kavramı yok . Aldığınız dizeleri el ile ayrıştırmanız gerekir. –

+0

Aslında başlıkta, soruda veya etiketlerde telnetten bahsetmedim. Ansi kod çözücüye ihtiyacım olan durumu açıkladım ...;) –

+0

"* Telnet ** bağlantılarını kabul eden belirli bir cihaza bağlanmak için çok basit bir ** telnet ** istemcisi kurdum *" –

cevap

2

: ESC-kodlarından

var 
    s: AnsiString; 
    i: integer; 
    InColorCode: Boolean; 
begin 
    s := 'test'#27'['#5';'#30';'#47'm colored text'; 

    InColorCode := False; 

    for i := 1 to Length(s) do 
    if InColorCode then 
     case s[i] of 
      #0: TextAttrib = Normal; 
      ... 
      #47: TextBG := White; 
      'm': InColorCode := false; 
     else; 
     // I do nothing here for `;`, '[' and other chars. 
     // treat them if necessary 

     end; 
    else 
     if s[i] = #27 then 
     InColorCode := True 
     else 
     output char with current attributes 

Takas dizesi:

procedure StripEscCode(var s: AnsiString); 
const 
    StartChar: AnsiChar = #27; 
    EndChar: AnsiChar = 'm'; 
var 
    i, cnt: integer; 
    InEsc: Boolean; 
begin 
    Cnt := 0; 
    InEsc := False; 
    for i := 1 to Length(s) do 
    if InEsc then begin 
     InEsc := s[i] <> EndChar; 
     Inc(cnt) 
    end 
    else begin 
     InEsc := s[i] = StartChar; 
     if InEsc then 
     Inc(cnt) 
     else 
     s[i - cnt] :=s[i]; 
    end; 
    setLength(s, Length(s) - cnt); 
end; 
+0

Ben aslında saf okunabilir dize almak için # 27'den m işareti, tüm ansi kodları, her şeyi tamamen kaldırmaya çalışıyorum. Tek dizgisi birden fazla kod içerebilir (içinde farklı kelimeler için yeşil, kırmızı ve mavi renkler). Bu yüzden ansi kodlarını kaldırarak bitene kadar döngü yapması gerekir. Bunu başarmak için cevabı düzenlemek için yeterince nazik misiniz? Çok teşekkürler! –

+1

Esc/m case için basit bir rutin eklendi – MBo

+0

Mükemmel !!! Bu kusursuz çalışıyor! Çok teşekkürler! :) –