从网上搜索到一个快速搜索字符串的方法,使用RichTextBox的Find方法,发现速度真的很快。
使用它做了个多文件搜索的小工具,才发现就没见过这么奇葩的控件。
语法:object.Find(string, start, end, options)
部分 | 描述 |
object | 必需的。对象表达式,其值是“应用于”列表中的一个对象。 |
string | 必需的。要在控件中查找的字符串表达式。 |
start | 可选的。决定从哪儿开始搜索的整数字符索引。控件中的每一个字符都有一个可唯一标识的整数索引。控件中文本的第一个字符的索引是 0。 |
end | 可选的。决定在哪儿结束搜索的整数字符索引。 |
options | 可选的。用来指定一个或多个可选功能常数的和。所指定的功能如“设置值”中所述。 |
设置值
对 options 的设置值包括:
常数 | 值 | 描述 |
rtfWholeWord | 2 | 确定匹配是基于整个单词还是单词的片段。 |
rtfMatchCase | 4 | 确定匹配是否基于指定字符串与字符串文本的大小写字体一致。 |
rtfNoHighlight | 8 | 确定匹配是否在 RichTextBox 控件中突出显示。 |
感觉有rtfNoHighlight这个参数很好啊,找到后可以直接高亮显示,可是试了半天没有效果。这不是默认高亮吗?后来才发现,高亮居然需要焦点。
好吧,设置焦点果然可以高亮了,但是画面总闪一下。而且搜索到一个就锁住不动了。再看:
当 HideSelection 属性是 True、且 RichTextBox 控件没有焦点时,如果所使用的 Find 方法没有 rtfNoHighlight 选项,则控件仍然突出显示所找到的文本。此后使用 Find 方法,若插入点不移动,将只搜索突出显示的文本。
好吧,设置 HideSelection 属性是False,取消设置焦点,就不闪也能高亮了。
可是,当.SelStart在关键词前、关键词中、关键词尾时,都会搜索回当前键词位置。
即:关键词位置150,词长5, .SelStart = 150,则搜索结果 = 150。.SelStart = 152,搜索结果 = 150,……
.SelStart = .SelStart + 1 → 不好用
.SelStart = .SelStart + 2 → 好用了,继续,遇到回车符,不好用了
跟踪调试发现,.SelStart = 228, .SelStart + 2 = 229 ?!
好吧,我 + 3。.SelStart + 3 = 231 …… 无语。+ 3 好用了,再往下 …… 又不好用了。这里关键词后面跟的是空格。但是前面一模一样的段落是好用的啊。
+ 6 才好用。这比我关键词都长了,还怎么自动判断?
就这样吧。自己手动在后面点一下,再搜吧。