如果我在单独的方法中将更多样式应用于文本,为什么样式会被覆盖?
Why are styles overwritten if I apply more styles to text in separate methods?
我正在为反汇编程序编写自定义样式。不幸的是,它似乎总是将样式覆盖为最新的字符,而其他样式都丢失了。这是我调用样式的代码:
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(Instr.@base) + ")");
}
是的,我的主要代码从另一个 class 调用了 scintilla Box。我使用另一个 class (_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;
}
}
这就是我得到的,总是:
如您所见,它只会为最新的字符设置样式,而其他已设置样式的字符会丢失其样式并被覆盖。
我已经尝试了一些(可怕的)方法,但它们也没有达到我想要的结果。有人知道这可能是什么原因吗?有关其他信息,我使用 Visual Studio 2012,.NET 4.5
所以,找到了我自己的解决方案。我没有将它放入单独的方法中,而是决定将它放入一个方法中,并将我所有的 while 循环放入其中。这是我的结果,它成功运行:
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);
}
}
这里是结果:
我正在为反汇编程序编写自定义样式。不幸的是,它似乎总是将样式覆盖为最新的字符,而其他样式都丢失了。这是我调用样式的代码:
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(Instr.@base) + ")");
}
是的,我的主要代码从另一个 class 调用了 scintilla Box。我使用另一个 class (_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;
}
}
这就是我得到的,总是:
如您所见,它只会为最新的字符设置样式,而其他已设置样式的字符会丢失其样式并被覆盖。
我已经尝试了一些(可怕的)方法,但它们也没有达到我想要的结果。有人知道这可能是什么原因吗?有关其他信息,我使用 Visual Studio 2012,.NET 4.5
所以,找到了我自己的解决方案。我没有将它放入单独的方法中,而是决定将它放入一个方法中,并将我所有的 while 循环放入其中。这是我的结果,它成功运行:
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);
}
}
这里是结果: