2015-04-11 3 views
0

Я программирую свои пользовательские стили для своего дизассемблера. К сожалению, кажется, что он всегда переписывает стиль последним персонажам, а другие стили теряются. Вот мой код, который называет мой стиль:Почему стили перезаписываются, если я применяю больше стилей к тексту в отдельных методах?

 if (Base) 
     { 
      ITypeBase Instr = new ITypeBase(); 
      Instr = BaseTypeSplit(bits, Instr); 

      Disassemble._dis.updateOP(CheckOpcode(Instr.opcode) + " "); 
      Disassemble._dis.updateREG(CheckReg(Instr.rt)); 
      Disassemble._dis.updateCOMMA(", "); 
      Disassemble._dis.updateIMM(CheckImm(Instr.imm)); 
      Disassemble._dis.updateREGB("(" + CheckReg([email protected]) + ")"); 
     } 

Да, мой основной код вызывает SCINTILLA Box из другого класса. Я использую свой конструктор из другого класса (_dis = this;) для его доступа.

А вот мои функции, которые делают стайлинг:

public Disassemble() 
    { 
     InitializeComponent(); 
     _dis = this; 
    } 

    public static Disassemble _dis; 


    public void updateOP(string message) 
    { 
     int length = scintilla1.TextLength; 
     int length2 = message.Length; 
     int sum = length + length2; 

     scintilla1.Styles[1].Font = new Font("Arial", 25, FontStyle.Bold); 
     scintilla1.Styles[1].ForeColor = Color.FromArgb(255, 128, 0); 
     scintilla1.Text += message; 

     int n = length; 

     while (length < sum) 
     { 
      scintilla1.GetRange(n).SetStyle(1); 
      n = length + 1; 
      length += 1; 
     } 
    } 

    public void updateREG(string message) 
    { 
     int length = scintilla1.TextLength; 
     int length2 = message.Length; 
     int sum = length + length2; 

     scintilla1.Styles[2].Font = new Font("Arial", 25, FontStyle.Bold); 
     scintilla1.Styles[2].ForeColor = Color.FromArgb(128, 0, 0); 
     scintilla1.Text += message; 

     int n = length; 

     while (length < sum) 
     { 
      scintilla1.GetRange(n).SetStyle(2); 
      n = length + 1; 
      length += 1; 
     } 
    } 

    public void updateREGB(string message) 
    { 
     int length = scintilla1.TextLength; 
     int length2 = message.Length; 
     int sum = length + length2; 

     scintilla1.Styles[5].Font = new Font("Arial", 25, FontStyle.Bold); 
     scintilla1.Styles[5].ForeColor = Color.FromArgb(172, 172, 172); 
     scintilla1.Text += message; 

     int n = length; 

     while (length < sum) 
     { 
      scintilla1.GetRange(n).SetStyle(5); 
      n = length + 1; 
      length += 1; 
     } 
    } 

    public void updateCOMMA(string message) 
    { 
     int length = scintilla1.TextLength; 
     int length2 = message.Length; 
     int sum = length + length2; 

     scintilla1.Styles[3].Font = new Font("Arial", 25, FontStyle.Bold); 
     scintilla1.Styles[3].ForeColor = Color.FromArgb(0, 0, 0); 
     scintilla1.Text += message; 

     int n = length; 

     while (length < sum) 
     { 
      scintilla1.GetRange(n).SetStyle(3); 
      n = length + 1; 
      length += 1; 
     } 
    } 

    public void updateIMM(string message) 
    { 
     int length = scintilla1.TextLength; 
     int length2 = message.Length; 
     int sum = length + length2; 

     scintilla1.Styles[4].Font = new Font("Arial", 25, FontStyle.Bold); 
     scintilla1.Styles[4].ForeColor = Color.FromArgb(0, 0, 255); 
     scintilla1.Text += message; 

     int n = length; 

     while (length < sum) 
     { 
      scintilla1.GetRange(n).SetStyle(4); 
      n = length + 1; 
      length += 1; 
     } 
    } 

И это то, что я получаю, всегда:

Image

Как вы видите, это только стили последних символов и другие стилизованные персонажи теряют свой стиль и перезаписываются.

Я пробовал некоторые (ужасные) способы, но они также не привели к тому, что я хотел. Есть ли у кого-то идеи, что может быть причиной этого? Для получения дополнительной информации я использую Visual Studio 2012, .NET 4.5

ответ

0

Итак, я нашел свое решение. Вместо того, чтобы вставлять его в отдельные методы, я решил поместить его в один и поставить все свои петли туда. Это мой результат, и он успешно работал:

public void updateBase(string opcode, string rt, string comma, string imm, string @base) 
    { 
     int tlen = scintilla1.TextLength; // 12 
     int olen = opcode.Length; 
     int rlen = rt.Length; 
     int clen = comma.Length; 
     int ilen = imm.Length; 
     int blen = @base.Length; 
     int n = 0; 

     scintilla1.Text += opcode; 
     scintilla1.Text += rt; 
     scintilla1.Text += comma; 
     scintilla1.Text += imm; 
     scintilla1.Text += @base; 

     int sumt = tlen + olen; 

     while (tlen < sumt) 
     { 
      n = tlen - 1; 
      tlen += 1; 
      scintilla1.GetRange(n).SetStyle(1); 
     } 

     sumt = tlen + rlen; 

     while (tlen < sumt) 
     { 
      n = tlen /*+ 1*/; 
      tlen += 1; 
      scintilla1.GetRange(n).SetStyle(2); 
     } 

     sumt = tlen + clen; 

     while (tlen < sumt) 
     { 
      n = tlen /*+ 1*/; 
      tlen += 1; 
      scintilla1.GetRange(n).SetStyle(3); 
     } 

     sumt = tlen + ilen; 

     while (tlen < sumt) 
     { 
      n = tlen /*+ 1*/; 
      tlen += 1; 
      scintilla1.GetRange(n).SetStyle(4); 
     } 

     sumt = tlen + blen; 

     while (tlen < sumt) 
     { 
      n = tlen /*+ 1*/; 
      tlen += 1; 
      scintilla1.GetRange(n).SetStyle(5); 
     } 

    } 

И вот результат:

result

 Смежные вопросы

  • Нет связанных вопросов^_^