none
Visual C#2019逆引き大全で、Findメソッドの扱いが、わかりません@@; RRS feed

  • 質問

  • 初心者なのですが、Findについて、教えてください。
    Visual C#2019逆引き大全の、P181の、Tips095で、
    richTextBox1.SelectionLengthを、削除すると、2個目の検索値が反転されません**;
    なぜでしょうか??


    private void Button1_Click(object sender, EventArgs e)
            {
                int pos;
                richTextBox1.SelectionStart = richTextBox1.SelectionStart+
    richTextBox1.SelectionLength;
                richTextBox1.SelectionLength = 0;
                richTextBox1.Focus();
                pos = richTextBox1.Find(textBox1.Text, richTextBox1.
                        SelectionStart,RichTextBoxFinds.None);

            }
    2021年3月11日 9:19

回答

  • RichTextBox.Findの動作としては、SelectionStartを開始位置として文末方向に検索を行います。(Findの第三引数でReverseを指定した場合は文頭方向)

    1回目の検索で文字列が見つかると、SelectionStartは見つかった文字列の先頭の位置になります。
    そのまま2回目の検索を行うと、SelectionStartの位置には既に検索対象の文字列があるので、現在の位置の1文字目で文字列が見つかったことになります。
    つまり1個目の位置がそのまま見つかった位置となるために、1個目から動かないことになります。

    ですから、2個目以降を探すためには、1個目の見つかった位置から1文字以上SelectionStartを進めてから実行することで、次の文字列を探すことができるようになります。

    この一文字以上進めるという動作を「richTextBox1.SelectionStart + richTextBox1.SelectionLength」で行わせていることになります。
    SelectionStartに文字長さを足しているは、見つかった文字列の末尾の位置から次の検索を開始させるというのを意図しているサンプルなのでしょう。
    (AAAAAという文章があったとしてAAという検索文字列で検索したら2個目は3文字目に見つかる)

    RichTextBox.Find (docsが壊れていて英語しか表示できないのでwebarchive)


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2021年3月11日 10:30
    • 回答としてマーク taket 2021年3月11日 11:05
    • 回答としてマークされていない taket 2021年3月11日 11:06
    • 回答としてマーク taket 2021年3月11日 11:07
    2021年3月11日 10:27

すべての返信

  • RichTextBox.Findの動作としては、SelectionStartを開始位置として文末方向に検索を行います。(Findの第三引数でReverseを指定した場合は文頭方向)

    1回目の検索で文字列が見つかると、SelectionStartは見つかった文字列の先頭の位置になります。
    そのまま2回目の検索を行うと、SelectionStartの位置には既に検索対象の文字列があるので、現在の位置の1文字目で文字列が見つかったことになります。
    つまり1個目の位置がそのまま見つかった位置となるために、1個目から動かないことになります。

    ですから、2個目以降を探すためには、1個目の見つかった位置から1文字以上SelectionStartを進めてから実行することで、次の文字列を探すことができるようになります。

    この一文字以上進めるという動作を「richTextBox1.SelectionStart + richTextBox1.SelectionLength」で行わせていることになります。
    SelectionStartに文字長さを足しているは、見つかった文字列の末尾の位置から次の検索を開始させるというのを意図しているサンプルなのでしょう。
    (AAAAAという文章があったとしてAAという検索文字列で検索したら2個目は3文字目に見つかる)

    RichTextBox.Find (docsが壊れていて英語しか表示できないのでwebarchive)


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2021年3月11日 10:30
    • 回答としてマーク taket 2021年3月11日 11:05
    • 回答としてマークされていない taket 2021年3月11日 11:06
    • 回答としてマーク taket 2021年3月11日 11:07
    2021年3月11日 10:27
  • 明解な回答、gekkaさん、ありがとうございました。

    よくわかりました。_(._.)_

    2021年3月11日 11:12