2

こんにちは。私はポスターとしてスタックオーバーフローを初めて使用しますが、何年も参照してきました。私はこの問題を約 2 週間調査してきましたが、近い解決策を見てきましたが、まだ問題が残っています。

アセンブリ コード ファイルを読み取り、別のプログラムを介してさらに処理するためにさまざまなテキスト項目を強調表示する C# GUI を作成しています。私のフォームには、テキストが表示される RichTextBox があります。以下のケースでは、「;」の場所でテキストを選択しようとしています。行の終わりまでテキストを赤に変更します。これが私が使用しているコードです。

注意: プログラムによって読み取られるファイルの長さには一貫性がありません。すべての行が同じようにフォーマットされているわけではないため、「;」を単純に検索することはできません。そしてそれを操作します。

別の投稿で、メンバーが AppendText の拡張メソッドを提供しましたが、元のテキストが再フォーマットされたテキストと共に存在することを除いて、完全に機能するようになりました。そのサイトへのリンクは 次のとおりです。リッチテキストボックスでマルチカラーを使用する方法

// Loop that it all runs in
Foreach (var line in inArray)
{   

  // getting the index of the ‘;’ assembly comments
  int cmntIndex = line.LastIndexOf(';');

  // getting the index of where I am in the rtb at this time.  
  int rtbIndex = rtb.GetFirstCharIndexOfCurrentLine();

  // just making sure I have a valid index
  if (cmntIndex != -1)
  {
    // using rtb.select to only select the desired 
    // text but for some reason I get it all    
    rtb.Select(cmntIndex + rtbIndex, rtb.SelectionLength);
    rtb.SelectionColor = Color.Red;
  }
}

以下は、元の形式のファイルからのサンプル アセンブリ コードです。テキストはすべて黒です。

;;TAG SOMETHING, SOMEONE START                          
    ASSEMBLY CODE       ; Assembly comments
    ASSEMBLY CODE       ; Assembly comments
    ASSEMBLY CODE       ; Assembly comments
;;TAG SOMETHING, SOMEONE FINISH

rtb.GetFirstCharIndexOfCurrentLine()呼び出されると、RTB の有効なインデックスが返されます。返された値を追加すると、上のテキストを選択して赤くすること line.LastIndexOf(';')ができると思います。; Assembly comments

何が起こるかというと、線全体が赤くなります。

上記の AppendText メソッドを使用すると、

ASSEMBLY CODE (this is black) ; Assembly comments (this is red) (the rest is black) ASSEMBLY CODE ; Assembly comments

黒のコードは、色を変更したテキストとまったく同じコードです。この場合、RTB の行をクリアする方法やテキストを上書きする方法を知る必要があります。私が試したすべてのオプションで、これらの行が削除されました。

とにかく、それは長かったと確信していますが、私はここで本当に困惑しており、アドバイスをいただければ幸いです.

4

2 に答える 2

2

私はあなたを正しく理解したことを願っています。

これは の各行をループし、richtextboxどの行がアセンブリ コメントであるかを判断し、";" の後のすべてを赤くします。

要求に応じて FOREACH ループを使用

foreach ループを使用するには、次のように手動でインデックスを追跡する必要があります。

// Index
int index = 0;

// Loop over each line
foreach (string line in richTextBox1.Lines)
{
    // Ignore the non-assembly lines
    if (line.Substring(0, 2) != ";;")
    {
        // Start position
        int start = (richTextBox1.GetFirstCharIndexFromLine(index) + line.LastIndexOf(";") + 1);

        // Length
        int length = line.Substring(line.LastIndexOf(";"), (line.Length - (line.LastIndexOf(";")))).Length;

        // Make the selection
        richTextBox1.SelectionStart = start;
        richTextBox1.SelectionLength = length;

        // Change the colour
        richTextBox1.SelectionColor = Color.Red;
    }

    // Increase index
    index++;
}

FORループあり

// Loop over each line
for(int i = 0; i < richTextBox1.Lines.Count(); i++)
{
    // Current line text
    string currentLine = richTextBox1.Lines[i];

    // Ignore the non-assembly lines
    if (currentLine.Substring(0, 2) != ";;")
    {
        // Start position
        int start = (richTextBox1.GetFirstCharIndexFromLine(i) + currentLine.LastIndexOf(";") + 1);

        // Length
        int length = currentLine.Substring(currentLine.LastIndexOf(";"), (currentLine.Length - (currentLine.LastIndexOf(";")))).Length;

        // Make the selection
        richTextBox1.SelectionStart = start;
        richTextBox1.SelectionLength = length;

        // Change the colour
        richTextBox1.SelectionColor = Color.Red;
    }
}

赤くハイライトされたリッチテキストの例

編集:

あなたの質問を読み直して、あなたが ; を作りたかったかどうか混乱しています。赤も。

この行から +1 を削除する場合:

int start = (richTextBox1.GetFirstCharIndexFromLine(i) + currentLine.LastIndexOf(";") + 1);
于 2015-06-30T23:53:56.580 に答える