以下RichTextBox
は、シンタックス ハイライターである派生クラス用に作成した 3 つのメソッドです。lcpy_strLine
すべて大文字のリッチテキストボックスの現在の行の共有コピー があります。これらのメソッドが行うことは次のとおりです。
ColorInsideTwoCharsは、指定された 2 つの文字の間の文字を指定された色で色付けします。元。
ColorInsideTwoChar("(", ")", Color.Green)
現在の行のすべての括弧のセットについて、2 つの括弧の間のすべての文字を緑色にします。ColorTilNoNumFromChar色、指定された文字から、数字であるすべての文字、Ex.
ColorTilNoNumFromChar("G", Color.Red)
G が検出された後、すべての数字を赤に色付けします (これには G が含まれます)。ColorCharIfNotFollowedByLetterは、指定された文字の後に文字が続いていない場合、その文字に色を付けます。元。
ColorCharIfNotFollowedByLetter("x", Color.Orange)
文字が続かないすべての X をオレンジ色にします。
私の質問は、これらの方法を実行するためのより高速な方法があるかどうかです。それらは醜く見えますが、これらの方法を実行するためのより単純で美的な方法は間違いなくあると思います. 助言がありますか?これらのメソッドは数千行のファイルの各行で実行され、非常に遅いためです。私はそれらをスピードアップする必要があります。それぞれを異なる方法で数回書き直してみるか、何人かの賢者に正しい方向に向かわせることができます。
private void ColorInsideTwoChars(String car1, String car2, Color clr)
{
int indx1 = 0;
int indx2 = 0;
while ((indx1 = lcpy_strLine.IndexOf(car1, indx1)) != -1
&& (indx2 = lcpy_strLine.IndexOf(car2, indx2)) != -1
&& indx1 < indx2)
{
SelectionStart = m_nLineStart + indx1;
SelectionLength = (indx2 - indx1) + 1;
SelectionColor = clr;
indx1 = ++indx2;
}
}
private void ColorTilNoNumFromChar(String car, Color clr)
{
int indx1 = 0;
while ((indx1 = lcpy_strLine.IndexOf(car, indx1)) != -1)
{
int j = 0;
for (j = indx1 + 1; j < m_nLineLength; j++)
{
if (!Char.IsDigit(lcpy_strLine[j]))
break;
}
SelectionStart = m_nLineStart + indx1;
SelectionLength = j - indx1;
SelectionColor = clr;
indx1 = j;
}
}
private void ColorCharIfNotFollowedByLetter(String car, Color clr)
{
int indx1 = 0;
while ((indx1 = lcpy_strLine.IndexOf(car, indx1)) != -1 &&
indx1 + 1 < m_nLineLength)
{
SelectionStart = m_nLineStart + indx1;
SelectionLength = 1;
if (!Char.IsLetter(lcpy_strLine[lcpy_strLine.IndexOf(car) + 1]))
SelectionColor = clr;
else
SelectionColor = Color.Black;
++indx1;
}
}