标记单词的所有实例(Delphi,RichText)

时间:2009-09-03 20:01:01

标签: delphi search richedit

好的,这是一个唠叨的问题,我无法找到明确的答案。 如何找到并标记单词的所有实例?

我的意思是,我搜索一个词(比如说:Person)。如果单词存在,则我在richedit中标记(使用红色或任何颜色)该单词的所有实例。如果我按Esc然后取消选择。

有什么想法吗?

代码表示赞赏。

2 个答案:

答案 0 :(得分:3)

以下代码将在富编辑控件中搜索所有出现的给定单词(区分大小写),将字体颜色更改为红色,最后恢复控件的原始选择(所有这些都尽可能少闪烁我希望):

procedure TForm1.FindWord(const AWord: string; AOptions: TSearchTypes);
var
  OrigSelStart, OrigSelLen: integer;
  Start, Found: integer;
begin
  if AWord = '' then
    exit;

  OrigSelStart := RichEdit1.SelStart;
  OrigSelLen := RichEdit1.SelLength;

  RichEdit1.Perform(WM_SETREDRAW, 0, 0);
  try
    Start := 0;
    Found := RichEdit1.FindText(AWord, Start, MaxInt, AOptions);
    while Found <> -1 do begin
      RichEdit1.SelStart := Found;
      RichEdit1.SelLength := Length(AWord);
      // TODO: save start of search match and original font colour
      RichEdit1.SelAttributes.Color := clRed;
      Start := Found + Length(AWord);
      Found := RichEdit1.FindText(AWord, Start, MaxInt, AOptions);
    end;
  finally
    RichEdit1.SelStart := OrigSelStart;
    RichEdit1.SelLength := OrigSelLen;
    RichEdit1.Perform(WM_SETREDRAW, 1, 0);
    RichEdit1.Repaint;
  end;
end;

现在,您只需将匹配项与原始文本属性一起保存到列表中,然后使用此列表中的信息还原Esc上的所有更改。但是,如果你认为匹配可能包含不同的字体样式,颜色等,那么这可能会非常棘手。因此,我没有提供任何代码来保存格式,这取决于您的要求。

哦,确保在重新更改文本之前删除突出显示的匹配项,否则您将无法正确恢复原始文本格式。

答案 1 :(得分:2)

wonderer,我写了这段代码,希望它有用:

Procedure MarkString(RichEdit:TRichEdit;strtomark : string);
Var
FoundAt : integer;
begin
    FoundAt:=RichEdit.FindText(strtomark,0,maxInt,[stWholeWord]);
    while FoundAt <> -1 do
    begin
             RichEdit.SelStart := FoundAt;
             RichEdit.SelLength := Length(strtomark);
             RichEdit.SelAttributes.Style := [fsBold];
             RichEdit.SelAttributes.Color := clRed;
             RichEdit.SelText :=strtomark;
             FoundAt:=RichEdit.FindText(strtomark,FoundAt + length(strtomark),maxInt,[stWholeWord]);
    end;
end;


Procedure UnMarkString(RichEdit:TRichEdit;strtomark : string);
Var
FoundAt : integer;
begin
    FoundAt:=RichEdit.FindText(strtomark,0,maxInt,[stWholeWord]);
    while FoundAt <> -1 do
    begin
             RichEdit.SelStart := FoundAt;
             RichEdit.SelLength := Length(strtomark);
             RichEdit.SelAttributes.Style := [];
             RichEdit.SelAttributes.Color := clBlack;
             RichEdit.SelText :=strtomark;
             FoundAt:=RichEdit.FindText(strtomark,FoundAt + length(strtomark),maxInt,[stWholeWord]);
    end;
end;


MarkString(RichEdit1,'delphi'); //To Mark a string

UnMarkString(RichEdit1,'delphi'); //To UnMark a string

再见。