实现编辑控件的增量搜索
LinZhenqun
2007-10-20
前言
增量搜索(又叫渐进搜索)是我比较喜欢的一种搜索方式,这种一边输入一边搜索的模式常常能更快的找到关键字,特别是在关键字记得不全的时候。大部分代码编辑器都提供了增量搜索的功能,比如Delphi,VS。在Delphi,我用得最多的快捷键几乎就是Ctrl+E了。
这几天突然心血来潮,研究了一下增量搜索的原理,成果就是这篇文章,这大概不是最好的实现,不过从搜索速度和结果来看,基本已经满足要求了,这一点从大文件(比如Windows.pas)的测试可以证实。
基本原理就是每输入一个字符就从前一个匹配的位置起搜索关键字,得到的匹配块压进一个栈中。在回退的时候从栈中弹出一个匹配块,然后定位到这个匹配块所指的位置。
更加详细的实现请看下面的代码。
类结构设计
在实现之前,我认为一定有更快的方法,因此必须设计一个更具扩展性的类结构,如下图所示:
IIncreSearch定义了增量搜索的规范,任何增量搜索的类都可以实现该接口。TIncreSearch是一个默认的实现,即上面所说的用栈结构来保存匹配块的方法。注意这里的搜索类并没有与任何控件界面关联,它是一个纯粹的类。
TIncreSearchHandler用于处理支持增量搜索的控件的一些消息,比如字符消息,搜索结束消息;同时它使用IncreSearch来实现控件的增量搜索。
TEdtIncreSearchHandler实现了编辑类控件的增量搜索,关联的控件必须是TCustomEdit类型的。
代码
下面是代码,代码是设计的最佳说明:
{**********************************************************}
{摘要:编辑控件增量搜索实现}
{}
{作者:LinZhenqun}
{日期:2007-10-11}
{邮件:linzhenqun@gmail.net}
{**********************************************************}
unitIncreSearch;
(*******************************************************************************
说明:
1、本单元实现了一个编辑控件的增量搜索。
2、IIncreSearch指定增量搜索的规范,任何增量搜索类都应该实现该接口;
3、TIncreSearch是IIncreSearch的一个默认实现,主要是用栈来保存搜索到的匹配块。
4、TInsreSearchHandler为搜索处理器的抽象类,它使用IIncreSearch来实现增量搜索,
同时处理增量搜索的操作逻辑。
5、TEditInsreSearchHandler为编辑控件的搜索处理器,与之关联的控件必须是TCustomEdit
类型的控件。
用法:
1、实例化一个处理器,比如TEditInsreSearchHandler,并在构造函数中传进将被搜索
的控件。
2、调用StarteSearch开始增量搜索。
3、调用Searching确定增量搜索是否已经结束。
扩展:
1、增量搜索类:TIncreSearch只是一个默认的搜索实现类,这不是一个最快速的类,
如果你知道如何更快速的实现增量搜索,请实现IIncreSearch接口,并在处理器
的构造函数中传进这个类,比如:
TSomeInsreSearchHandler.Create(TSomeControl,YourIncreSearch);
处理器面对的是搜索接口,因此要特别注意其生命周期的管理。
2、搜索处理器:TEditInsreSearchHandler只能处理TCustomEdit的编辑控件,对于一
些不是从TCustomEdit继承的控件,则必须写另外的处理器。
实现很简单,继承TInsreSearchHandler,并且必须覆盖GetSearchStr,GetSearchStart,
SetMatchBlock三个抽象方法,提供搜索必需的信息。
如想提供更多的扩展,可以覆盖TInsreSearchHandler其他的虚方法。
******************************************************************************)
interface
uses
Classes,Messages,Controls,Contnrs;
type
{匹配的块}
PMatchBlock=^TMatchBlock;
TMatchBlock=record
Start:Integer;
Len:Integer;
end;
{增量搜索接口}
IIncreSearch=interface
['{A8037752-ED93-49F6-915C-6D8E82ADD631}']
(*开始搜索*)
procedureStartSearch(constSearchStr:string;Start:Integer=0;MaxKey:Word=80);
(*结束搜索*)
procedureEndSearch;
(*增加一个字符*)
functionIncreaseChar(C:Char):PMatchBlock;
(*减少一个字符*)
functionDecreaseChar:PMatchBlock;
(*是否正在搜索*)
functionGetSearching:Boolean;
propertySearching:BooleanreadGetSearching;
end;
{增量搜索的默认实现:利用栈来保存匹配块}
TIncreSearch=class(TInterfacedObject,IIncreSearch)
private
FSearching:Boolean;
FKeyIndex:Integer;
FStart:Integer;
FSearchKey:string;
FSearchStr:string;
FMatchBlockList:TStack;
protected
procedureClearMatchBlockList;
public
procedureStartSearch(constSearchStr:string;Start:Integer=0;MaxKey:Word=80);
procedureEndSearch;
functionIncreaseChar(C:Char):PMatchBlock;
functionDecreaseChar:PMatchBlock;
functionGetSearching:Boolean;
propertySearching:BooleanreadGetSearching;
constructorCreate;
destructorDestroy;override;
end;
{增量搜索处理器,抽象类}
TIncreSearchHandler=class
private
FIncreSearch:IIncreSearch;
protected
FCtrl:TControl;
FOldCtrlWndProc:TWndMethod;
procedureHookWndProc;
procedureUnHookWndProc;
(*控件处理过程,处理增量搜索的字符*)
procedureCtrlWndProc(varMessage:TMessage);virtual;
(*导致增量搜索结束的消息*)
functionIsEndSearchMsg(Message:TMessage):Boolean;virtual;
(*取得等搜索的字符串,必须由子类给出*)
functionGetSearchStr:string;virtual;abstract;
(*取得搜索的起始位置,必须由子类给出*)
functionGetSearchStart:Integer;virtual;abstract;
(*返回搜索关键字的最大长度*)
functionGetMaxKey:Integer;virtual;
(*设置搜到的匹配块,必须由子类实现*)
procedureSetMatchBlock(MatchBlock:PMatchBlock);virtual;abstract;
(*开始搜索,子类作额外处理*)
procedureDoEndSearch;virtual;
(*结束搜索,子类作额外处理*)
procedureDoStartSearch;virtual;
public
procedureStarteSearch;
procedureEndSearch;
functionSearching:Boolean;
propertyCtrl:TControlreadFCtrl;
constructorCreate(ACtrl:TControl;IncreSearch:IIncreSearch=nil);virtual;
destructorDestroy;override;
end;
{编辑控件增量搜索处理器,编辑控件必须从TCustomEdit继承}
TEdtIncreSearchHandler=class(TIncreSearchHandler)
protected
functionGetSearchStr:string;override;
procedureSetMatchBlock(MatchBlock:PMatchBlock);override;
functionGetSearchStart:Integer;<span lang
分享到:
相关推荐
实现编辑控件的增量搜索涉及到监听用户输入、实时过滤数据和更新界面等多个环节。通过分析给定的文件,我们可以推断出这个项目利用了Delphi的组件化开发模式,通过自定义控件扩展了标准编辑控件的功能。理解增量...
利用RichText实现的编辑器,提供了修改字体,打印,查询等功能(4KB) 4,exptrocx.zip 实现explorer风格的树型目录的activex控件(1191KB) 5,txtsrch 在Text中实现快速增量查询(5KB) 6,exproplist.zip 建立一个如同vb...
`RichTextBox` 控件是一种高级文本编辑控件,它支持格式化文本和图像的插入。与`TextBox` 不同,`RichTextBox` 提供了更多的文本格式化选项。 **特点与功能** - **格式化文本**:支持文本颜色、字体样式等多种格式...
DBGridEh的数据功能包括查找字段下拉列表的自动填充、过滤功能的实现,支持模糊查询和增量搜索、改良过滤功能、显示TreeView效果、KeyList、PickList、主从表设置和显示表中表等。 输入输出处理 可以实现数据的导入...
利用RichText实现的编辑器,提供了修改字体,打印,查询等功能(4KB) 4,exptrocx.zip 实现explorer风格的树型目录的activex控件(1191KB) 5,txtsrch 在Text中实现快速增量查询(5KB) 6,exproplist.zip 建立一个如同vb...
- **定义**:`TextBox`控件是用于输入和显示单行或多行文本的基本文本编辑控件。 - **特性**: - 支持密码模式:可以设置为密码输入框。 - 多行文本支持:通过设置`Multiline`属性启用多行文本输入。 - 文本验证...
1. **AllowIncrementalSearch**:此属性启用增量搜索功能,允许用户在输入过程中实时定位目标行,提高数据查找效率。 2. **AllowPartialRedrawOnScrolling**:当垂直滚动时,允许视图进行局部刷新,减少重绘整个...
- **增量搜索**:通过监听用户的输入并在每次键入后更新过滤条件来实现。 - **ehlib总是按两次ctrl+f才出来查找框,怎么办**:可以通过修改`ehlib.ini`文件中的设置来解决。 - **如何改良dbgrideh的文字过滤**:...
实现数据功能包括查找字段、显示字段下拉列表、自动过滤(包括模糊查询和过滤)、增量搜索、改良的文字过滤、表头点击自动排序、排序功能加快速度、TreeView效果显示、主从表设置、显示表中表、OnGetCellParams事件...
- 增量搜索 - 文字过滤改良 - 表头点击自动排序 - 排序功能改良 - TreeView效果显示 - KeyList、PickList功能 - 主从表设置 - 表中表显示 6. 输入/输出 - 数据导入导出 - Excel报表生成 - 打印组件使用 ...
此外,为了提供更友好的用户体验,我们可能还需要实现增量搜索和全词匹配等高级选项。 打印功能通常通过`QPrinter`和`QPrintPreviewDialog`来实现。用户可以预览即将打印的内容,并选择纸张大小、方向等打印设置。`...
它还能实现增量搜索,改良文字过滤,以及表头点击自动排序功能。此外,还提供了在DbGridEh中显示TreeView效果,KeyList和PickList的实现,以及主从表的设置。 五、输入/输出 DBGridEh的输入/输出功能非常强大,包括...
"查找替换"功能是软件中常见的一个控件应用,特别是在文本编辑器、文档处理软件或编程环境中,用户经常需要快速定位和替换特定的文本内容。本文将详细讲解这个功能的工作原理以及在实际开发中的应用。 首先,查找...
4. **丰富的功能集**:支持编辑器集成、键盘快捷键、增量搜索等功能,提供良好的用户体验。 5. **强大的拖放与剪贴板支持**:可以方便地处理数据的复制、移动等操作。 #### 三、安装指南 - Virtual Treeview 的安装...
7. **ACSpin**: 数值输入控件,可以限制输入范围,并支持增量/减量操作。 除此之外,AlphaControls 还提供了丰富的界面元素,如滑块、进度条、仪表盘、选项卡、面板等,以及各种自定义的容器控件,帮助开发者构建...
6. **umemoedit.dcu**: 可能是一个增强型的文本编辑器组件,相比标准的memo控件,可能具有更多的特性,如格式化文本、搜索替换、拼写检查等。 7. **advtoolbar.pas**: 工具栏组件,用于创建自定义的工具栏,开发者...
在查找字段中进行增量搜索。 冻结的列。 DateTime选择器支持TDateField和TDateTimeField。 允许根据字段值显示TImageList中的位图。 允许隐藏和跟踪水平或垂直滚动条。 允许隐藏列。 允许显示冻结,页脚...
在实现时,通常采用EditText控件作为基本输入界面,支持文字的输入、选择、复制、粘贴等操作。同时,还需要处理字体、字号、颜色等格式化选项,以及列表、引用等特殊排版。 2. **云同步**:为了确保数据安全和多...