本帖最后由 comeheres 于 2013-12-22 13:20 编辑
var
i, j, PosReturn, SkipChars: Integer;
begin
For i := 0 to Memo1.Lines.Count do
// 循环遍历memo控件内的每一行文本,其实应该是 i:= 0 to Memo1.Lines.Count-1
begin
PosReturn := Pos(FindDialog1.FindText, Memo1.Lines【i】);//【】换成[],不然帖子格式有问题
// 查找第i行,返回搜索内容在该行的位置(第几位),用于判断该行是否存在搜索内容
If PosReturn <> 0 then // 如果PosReturn大于0,说明第i行存在我们需要搜索的内容
begin
SkipChars := 0; // Skipchars设置为0
{ 计算从0行到i-1行的所有文本长度,赋值给Skipchars }
For j := 0 to i - 1 do // 遍历第i行之前的所有行数
SkipChars := SkipChars + Length(Memo1.Lines[j]); // Skipchars加上第j行的文本长度
SkipChars := SkipChars + (i * 2); // 第i行之前有i个换行符,所以把所有的换行符长度也累加上
SkipChars := SkipChars + (PosReturn - 1); // (PosReturn - 1)是第i行的搜索内容前面的文本
Memo1.SetFocus; // memo1控件获得鼠标焦点
Memo1.SelStart := SkipChars;
// 上面的posreturn可以直接使用到这里啊,为什么要使用skipchars呢? 回复:因为posreturn只是搜索内容在第i行的所在位置,而memo1的鼠标焦点起始位置是从memo1的第一个字符算起的,所以得加上 前面几行文本+换行符 长度
Memo1.SelLength := Length(FindDialog1.FindText); // 设置鼠标选中的字符串长度
Break;
end;
end;
end;
举个例子:我是沙发
板凳也不错的
我是地板吗?
楼上的鱼友都好迅速
我下地域了!!
比如我们需要搜索“鱼友”这个内容,程序执行步骤是这样的:
1.执行PosReturn := Pos('鱼友', Memo1.Lines[0]),搜索第一行“我是沙发”,返回0
2.执行PosReturn := Pos('鱼友', Memo1.Lines[1]),搜索第二行“板凳也不错的”,返回0
3.执行PosReturn := Pos('鱼友', Memo1.Lines[2]),搜索第三行“我是地板吗?”,返回0
4.执行PosReturn := Pos('鱼友', Memo1.Lines[3]),搜索第四行“楼上的鱼友都好迅速?”,返回4,此时PosReturn不等于0,符合if条件,进入if执行
5.设置SkipChars为0,SkipChars加上第一行“我是沙发”的字符串长度,此时SkipChars为4;SkipChars加上第二行“板凳也不错的”的字符串长度,此时SkipChars为4+6=10;SkipChars加上第三行“我是地板吗?”的字符串长度,此时SkipChars为10+6=16;因为第四行前面含有3个换行符,每个换行符占2个长度,故SkipChars+3*2=22
6.“鱼友”前面的“楼上的”长度是PosReturn-1,即4-1=3,所以SkipChars为22+3=25
7.memo1获得焦点,鼠标位置在memo1的第25个字符长度处,即“鱼友”前,然后鼠标选中“鱼友”的字符串长度2,便是搜索结束的效果
|