3

わかりました、これはしつこい問題であり、決定的な答えを見つけることができません。単語のすべてのインスタンスをどのように見つけてマークしますか?

つまり、単語を検索します (例: Person)。単語が存在する場合、リッチエディット内のその単語のすべてのインスタンスに (赤またはその他の色を使用して) I マークを付けます。Esc を押すと、選択が解除されます。

何か案は?

コードは大歓迎です。

4

2 に答える 2

3

不思議に思う、私はこのコードを書きました、それが役に立つことを願っています:

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

さよなら。

于 2009-09-03T20:42:03.847 に答える
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ます。ただし、マッチに異なるフォント スタイルや色などが含まれている可能性があると想定すると、これを正しく行うのは非常に難しくなる可能性があります。したがって、フォーマットを保存するためのコードは提供していません。要件によって異なります。

テキストを再度変更する前に、強調表示された一致を必ず削除してください。そうしないと、元のテキストの書式設定が正しく復元されません。

于 2009-09-03T21:04:41.937 に答える