カテゴリ:.Net Framework
月曜に最低アクセス数(7/9~)を記録し、火曜持ち直しました。
昨日(水曜)はさらに増えたのですが、コメントは付きませんでした。
#反応がつきにくいのは分かっていますが、ちょっと悲しいです。
それでもフォローアップはしていきます。
起点となったエントリでは「RichTextBoxを使ってテキスト修正(文字列置換)のプレビュー機能を作れます」
続きのエントリでは「RichTextBox中の部分文字列の位置指定の挙動が思った通りではありませんでした」
といった内容で書きました。
原因について、RichTextBoxでは改行は目に見える文字ではないので文字数をカウントしていない、と推理してみました。
とりあえず以下のコードに書き換えて動かしてみました。(上が前回のコード、下が新しいコード)
Match match = new Regex("t").Match(richTextBox_Preview.Text);
while (match.Success)
{
richTextBox_Preview.Select(match.Index, match.Length);
richTextBox_Preview.SelectionColor = Color.Red;
match = match.NextMatch();
}
Match match = new Regex("t").Match(richTextBox_Preview.Text.Replace("\n", ""));
while (match.Success)
{
richTextBox_Preview.Select(match.Index, match.Length);
richTextBox_Preview.SelectionColor = Color.Red;
match = match.NextMatch();
}
非検索文字列から改行を取り除いて文字列検索しています。
richTextBox_Preview.Text.Replace("\n", "") しても richTextBox_Preview.Text は上と変わっていないこと[改行入りのまま]に注意してください。
これはうまくいきます。実際の文字列と違うことになっていますが、行数を調べなくていいので、場合によってはかなり有用です。
開始位置を補正する方法も考えてみました。
Match match = new Regex("t").Match(richTextBox_Preview.Text);
while (match.Success)
{
richTextBox_Preview.Select(ToRTBIndex(richTextBox_Preview, match.Index), match.Length);
richTextBox_Preview.SelectionColor = Color.Red;
match = match.NextMatch();
}
ToRTBIndexメソッドは以下になります。
public int ToRTBIndex(RichTextBox rtb, int matchindex)
{
int rtbindex = matchindex - rtb.GetLineFromCharIndex(matchindex);
while (rtbindex + rtb.GetLineFromCharIndex(rtbindex) < matchindex)
rtbindex++;
return rtbindex;
}
注意が必要なのはRichTextBoxの設定です。
これを使う場合はWordWrap(右端で改行するかどうか)をFalseにしておく必要があります。
Trueで試していて「自動改行されていないのにな~。おかしいな~。」と思ったら、400ピクセル四方のウィンドウをデバッグごとに手動で最大化していたことに気づかなかった、なんてことがありました。
参考にどうぞ TextBox(またはRichTextBox)の現在のカレット位置(行と列)を取得する (DOBON.NET)
#【アンケート】 仕事中、プログラミング中、何を飲んでいますか。
#お茶(←ペットボトル飲料)が多いです。コーヒー(←インスタントコーヒー)も飲みますが、コーヒーばっかりはないですかね。
#利尿作用があるといわれていますが、トイレに行くと気分転換になるので支障はありません。