2010-11-20 87 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的事实。 – 2010-11-23 10:49:18

+0

@ user205376 - 你为什么这么说? TStrings.Text是我认为pos()会快的单个字符串。正如您所建议的,搜索TStrings.Strings将涉及下标以访问每个字符串。国际海事组织的意见将会更慢,并且不会提供pos()没有的附加功能。 (而且,它需要一些棘手的代码来突出显示所发现的模式)为什么你认为不是? – RobertFrank 2010-11-25 18:27:04

+0

游戏有点迟,但对于上述情况,则取决于实施情况。所有TStrings都是抽象的。 Memo.Lines.Text(= TMemoStrings.Text)使用单个API调用获取备忘文本,而TStringList存储单独的字符串,TStringList.Text将它们组合为每个请求中的单个字符串(这通常比调用更快API,顺便说一句)。答案使用Memo1.Text,我想绕过任何TStrings后裔,并直接在备忘录的句柄上调用一些GetText API。 – GolezTrol 2017-08-21 07:40:32

11

此搜索允许文档换行,大小写(in)敏感搜索和从光标位置搜索。

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 2010-11-20 14:40:25

+0

那么,重音字母和非重音字母是两个不同的字母,不是吗?一个法语单词,当转换为UpperCase时,将显示为PRIVé,小写字母表示它是私密的。另一方面,大写字母é也不会被转换为é,所以我不明白这会如何影响搜索结果。尽管我必须承认我在Delphi 7中测试了这个功能。如果在使用LowerCase时unicode或者Delphi中区域设置的可能使用会产生更好的结果,请做。 – GolezTrol 2010-11-20 23:21:03

+2

GolezTrol:感谢HideSelection提示! – RobertFrank 2010-11-21 21:30:10