1

TMemo里面有一个 with 文本,例如:

Text1
Hello World!
Sky
Text123

我使用一个简单的函数来选择第一次找到文本的时间

Memo1.SelStart := Pos(AnsiLowerCase('Text'), AnsiLowerCase(Memo1.Text)) - 1;
    Memo1.SelLength := Length('Text');
    Memo1.SetFocus;

我使用AnsiLowerCase了这样我就可以找到文本而无需适当的大写。

那么,如何才能选择备忘录中第二次出现的“文本”呢?

4

1 回答 1

1

您可以使用PosOffset函数的参数以避免从头开始搜索并跳过第一次出现。

定位给定字符串中的子字符串。

Pos 方法返回 Substr 在 Str 中第一次出现的索引,从 Offset 开始搜索。

如果未找到 Substr 或 Offset 无效(例如,如果 Offset 超过字符串长度或小于 1),则此方法返回零。

Offset 参数是可选的。默认情况下,偏移量设置为 1,如果未指定偏移量值,则使用默认值从头开始搜索。

笔记:

Pos 即使在字符串从零开始的平台中也使用从一开始的数组索引。

Pos 方法等价于 System.StrUtils.PosEx。

例如:

图片显示带有备忘录、文本编辑和 findnext 按钮的示例表单

procedure SearchNext(AMemo : TMemo; const ATextToSearch : string; ACycle : Boolean = True);
var
  Offset : Integer;
begin
  //adjusting offset
  Offset := AMemo.SelStart + AMemo.SelLength + 1;
  if(Offset >= Length(AMemo.Text)) then
    Offset := 1;

  //searching
  Offset := Pos(AnsiLowerCase(ATextToSearch), AnsiLowerCase(AMemo.Text), Offset);
  if(Offset > 0) then
  begin
    //selecting found text
    AMemo.SelStart := Offset - 1;
    AMemo.SelLength := Length(ATextToSearch);
    AMemo.SetFocus;
  end else
  begin
    //recursion from the beginning
    if(ACycle and (AMemo.SelStart + AMemo.SelLength <> 0)) then
    begin
      AMemo.SelStart := 0;
      SearchNext(AMemo, ATextToSearch, True);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SearchNext(Memo1, Edit1.Text);
end;
于 2021-11-03T12:59:54.487 回答