任何人都可以给我一些简单的代码,使我能够在备忘录中搜索简单的字符串,并在找到后在备忘录中突出显示它吗?在Delphi中搜索一个备忘录?
回答
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,则不会跨行搜索。
此搜索允许文档换行,大小写(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, []);
允许搜索编辑为好。
使用UpperCase可能不会给你想要的结果,例如在法语中,大写字母不能有重音,而小写字符可以有一个(这与加拿大法语不同,我认为,大写字母也可以重音)。所以,在这种情况下使用LowerCase会给出更好的结果。 – dummzeuch 2010-11-20 14:40:25
那么,重音字母和非重音字母是两个不同的字母,不是吗?一个法语单词,当转换为UpperCase时,将显示为PRIVé,小写字母表示它是私密的。另一方面,大写字母é也不会被转换为é,所以我不明白这会如何影响搜索结果。尽管我必须承认我在Delphi 7中测试了这个功能。如果在使用LowerCase时unicode或者Delphi中区域设置的可能使用会产生更好的结果,请做。 – GolezTrol 2010-11-20 23:21:03
GolezTrol:感谢HideSelection提示! – RobertFrank 2010-11-21 21:30:10
- 1. delphi中的自动滚动备忘录
- 2. Microsoft Access 2007:在备忘录字段中搜索字符串
- 3. 如何在使用delphi的类中制作动态备忘录
- 4. 1个弹出菜单和2个备忘录,其中备忘录是从
- 5. 搜索文本文件的写作结果备忘录,lazarus
- 6. 将行添加到Delphi中的备忘录顶部
- 7. 编辑和备忘录中的Delphi文本偏移
- 8. 流星 - 从备忘录列表中显示单个备忘录页
- 9. 不能在备忘录
- 10. Pimping scalaz备忘录
- 11. 长度备忘录
- 12. 在不同的备忘录中搜索数字并将它们分隔成一个
- 13. Delphi Firemonkey for mobile的自定义备忘录或文本选择?
- 14. 如何在magento中创建备忘录?
- 15. 在VFP中显示备忘录字段
- 16. 如何在eclipse中部署备忘录
- 17. 在Java中的另一个目录中搜索一个目录
- 18. 在pascal中搜索未记录的文件记录(Delphi 7)
- 19. 在delphi/lazarus中搜索已放入记录数组的记录
- 20. 在一个目录中搜索shapefile
- 21. 备忘录字段中的最后一个字符
- 22. Postgres - Sql - PgSql的备忘录
- 23. 来自备忘录的TDirectionsResult
- 24. Python自动备忘录
- 25. Java函数的备忘录
- 26. vb.net accdb备忘录到RichTextBox
- 27. 设计模式备忘录
- 28. 转换备忘录文本
- 29. 备忘录递归函数
- 30. 备忘录线分割
在'TStrings.Text'而不是'TStrings.Strings'中搜索非常昂贵。 2×N的事实。 – 2010-11-23 10:49:18
@ user205376 - 你为什么这么说? TStrings.Text是我认为pos()会快的单个字符串。正如您所建议的,搜索TStrings.Strings将涉及下标以访问每个字符串。国际海事组织的意见将会更慢,并且不会提供pos()没有的附加功能。 (而且,它需要一些棘手的代码来突出显示所发现的模式)为什么你认为不是? – RobertFrank 2010-11-25 18:27:04
游戏有点迟,但对于上述情况,则取决于实施情况。所有TStrings都是抽象的。 Memo.Lines.Text(= TMemoStrings.Text)使用单个API调用获取备忘文本,而TStringList存储单独的字符串,TStringList.Text将它们组合为每个请求中的单个字符串(这通常比调用更快API,顺便说一句)。答案使用Memo1.Text,我想绕过任何TStrings后裔,并直接在备忘录的句柄上调用一些GetText API。 – GolezTrol 2017-08-21 07:40:32