2010-11-20 6 views

答えて

3
function TForm1.FindText(const aPatternToFind: String):Boolean; 
    var 
    p: Integer; 
    begin 
    p := pos(aPatternToFind, Memo1.Text); 
    Result := (p > 0); 
    if Result then 
     begin 
     Memo1.SelStart := p; 
     Memo1.SelLength := Length(aPatternToFind); 
     Memo1.SetFocus; // necessary so highlight is visible 
     end; 
    end; 

WordWrapがtrueの場合、これは行を検索しません。

+0

'TStrings.Text'ではなく' TStrings.Strings'で検索するのは非常に高価です。実際には2×Nである。 –

+0

@ user205376 - なぜそれを言うのですか? TStrings.Textはpos()が高速になると思う単一の文字列です。 TStrings.Stringsには、それぞれの文字列にアクセスするための添字が含まれています。つまり、IMOの意見は、遅くなり、pos()が持たない追加の機能を提供しません。 (そして、発見されたパターンを強調するためにいくつかのトリッキーなコードが必要になるでしょう)なぜあなたはそうではないと思いますか? – RobertFrank

+0

ゲームに少し遅れますが、上記の場合、それは実装に依存します。結局のところ、TStringは抽象的です。 Memo.Lines.Text(= TMemoStrings.Text)は、単一のAPI呼び出しを使用してメモのテキストを取得しますが、TStringListは別々の文字列を格納し、TStringList.Textは各要求で単一の文字列にそれらを結合しますAPI、btw)。答えはMemo1.Textを使用しています。これはTStringsの子孫をバイパスし、メモのハンドル上のGetText APIを直接呼び出します。 – GolezTrol

11

この検索で​​は、ドキュメントの折り返し、大文字と小文字の区別による検索、カーソル位置からの検索が可能です。

type 
    TSearchOption = (soIgnoreCase, soFromStart, soWrap); 
    TSearchOptions = set of TSearchOption; 


function SearchText(
    Control: TCustomEdit; 
    Search: string; 
    SearchOptions: TSearchOptions): Boolean; 
var 
    Text: string; 
    Index: Integer; 
begin 
    if soIgnoreCase in SearchOptions then 
    begin 
    Search := UpperCase(Search); 
    Text := UpperCase(Control.Text); 
    end 
    else 
    Text := Control.Text; 

    Index := 0; 
    if not (soFromStart in SearchOptions) then 
    Index := PosEx(Search, Text, 
     Control.SelStart + Control.SelLength + 1); 

    if (Index = 0) and 
     ((soFromStart in SearchOptions) or 
     (soWrap in SearchOptions)) then 
    Index := PosEx(Search, Text, 1); 

    Result := Index > 0; 
    if Result then 
    begin 
    Control.SelStart := Index - 1; 
    Control.SelLength := Length(Search); 
    end; 
end; 

メモがフォーカスされていない場合でも、メモにHideSelection = Falseを設定して選択を表示することができます。このような

用途:

SearchText(Memo1, Edit1.Text, []); 

も同様に編集内容を検索することができます。

+0

UpperCaseを使用すると、目的の結果が得られない場合があります。フランス語では大文字にアクセントを付けることはできませんが、小文字には大文字を使用することができます(大文字のアクセント記号付きのカナダのフランス語とは異なります)。この場合、LowerCaseを使用するとより良い結果が得られます。 – dummzeuch

+0

アクセント付きの文字とアクセントのない文字は、2つの異なる文字ですね。フランス語の単語は、UpperCaseに変換するとPRIVéのように表示され、小文字ではprivéになります。一方、大文字のÉはéに変換されないので、検索結果にどのように影響するかわかりません。私がDelphi 7でこれをテストしていることは認めなければなりませんが、LowerCaseを使用しているときにユニコードまたはDelphiでロケール設定を使用するとより良い結果が得られることを確認してください。 – GolezTrol

+2

GolezTrol:HideSelectionのヒントをありがとう! – RobertFrank

関連する問題