`
isiqi
  • 浏览: 16350064 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

实现编辑控件的增量搜索

阅读更多

实现编辑控件的增量搜索

LinZhenqun

2007-10-20

前言

增量搜索(又叫渐进搜索)是我比较喜欢的一种搜索方式,这种一边输入一边搜索的模式常常能更快的找到关键字,特别是在关键字记得不全的时候。大部分代码编辑器都提供了增量搜索的功能,比如DelphiVS。在Delphi,我用得最多的快捷键几乎就是Ctrl+E了。

这几天突然心血来潮,研究了一下增量搜索的原理,成果就是这篇文章,这大概不是最好的实现,不过从搜索速度和结果来看,基本已经满足要求了,这一点从大文件(比如Windows.pas)的测试可以证实。

基本原理就是每输入一个字符就从前一个匹配的位置起搜索关键字,得到的匹配块压进一个栈中。在回退的时候从栈中弹出一个匹配块,然后定位到这个匹配块所指的位置。

更加详细的实现请看下面的代码。

类结构设计

在实现之前,我认为一定有更快的方法,因此必须设计一个更具扩展性的类结构,如下图所示:

IIncreSearch定义了增量搜索的规范,任何增量搜索的类都可以实现该接口。TIncreSearch是一个默认的实现,即上面所说的用栈结构来保存匹配块的方法。注意这里的搜索类并没有与任何控件界面关联,它是一个纯粹的类。

TIncreSearchHandler用于处理支持增量搜索的控件的一些消息,比如字符消息,搜索结束消息;同时它使用IncreSearch来实现控件的增量搜索。

TEdtIncreSearchHandler实现了编辑类控件的增量搜索,关联的控件必须是TCustomEdit类型的。

代码

下面是代码,代码是设计的最佳说明:

{**********************************************************}
{摘要:编辑控件增量搜索实现}
{}
{作者:LinZhenqun}
{日期:2007-10-11}
{邮件:linzhenqun@gmail.net}
{**********************************************************}

unitIncreSearch;

(*******************************************************************************
说明:
1、本单元实现了一个编辑控件的增量搜索。
2IIncreSearch指定增量搜索的规范,任何增量搜索类都应该实现该接口;
3TIncreSearchIIncreSearch的一个默认实现,主要是用栈来保存搜索到的匹配块。
4TInsreSearchHandler为搜索处理器的抽象类,它使用IIncreSearch来实现增量搜索,
同时处理增量搜索的操作逻辑。
5TEditInsreSearchHandler为编辑控件的搜索处理器,与之关联的控件必须是TCustomEdit
类型的控件。

用法:
1、实例化一个处理器,比如TEditInsreSearchHandler,并在构造函数中传进将被搜索
的控件。
2、调用StarteSearch开始增量搜索。
3、调用Searching确定增量搜索是否已经结束。

扩展:
1、增量搜索类:TIncreSearch只是一个默认的搜索实现类,这不是一个最快速的类,
如果你知道如何更快速的实现增量搜索,请实现IIncreSearch接口,并在处理器
的构造函数中传进这个类,比如:
TSomeInsreSearchHandler.Create(TSomeControl,YourIncreSearch);
处理器面对的是搜索接口,因此要特别注意其生命周期的管理。
2、搜索处理器:TEditInsreSearchHandler只能处理TCustomEdit的编辑控件,对于一
些不是从TCustomEdit继承的控件,则必须写另外的处理器。
实现很简单,继承TInsreSearchHandler,并且必须覆盖GetSearchStrGetSearchStart
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的组件化开发模式,通过自定义控件扩展了标准编辑控件的功能。理解增量...

    VB 各种控件(个人收藏30多种,还有详细的使用介绍)

    利用RichText实现的编辑器,提供了修改字体,打印,查询等功能(4KB) 4,exptrocx.zip 实现explorer风格的树型目录的activex控件(1191KB) 5,txtsrch 在Text中实现快速增量查询(5KB) 6,exproplist.zip 建立一个如同vb...

    DELPHI+表格控件DBGridEh

    DBGridEh的数据功能包括查找字段下拉列表的自动填充、过滤功能的实现,支持模糊查询和增量搜索、改良过滤功能、显示TreeView效果、KeyList、PickList、主从表设置和显示表中表等。 输入输出处理 可以实现数据的导入...

    个人收集的vb写的35个控件

    利用RichText实现的编辑器,提供了修改字体,打印,查询等功能(4KB) 4,exptrocx.zip 实现explorer风格的树型目录的activex控件(1191KB) 5,txtsrch 在Text中实现快速增量查询(5KB) 6,exproplist.zip 建立一个如同vb...

    DevExpress控件属性说明

    1. **AllowIncrementalSearch**:此属性启用增量搜索功能,允许用户在输入过程中实时定位目标行,提高数据查找效率。 2. **AllowPartialRedrawOnScrolling**:当垂直滚动时,允许视图进行局部刷新,减少重绘整个...

    DELPHI 表格控件DBGridEh使用详解 .pdf

    实现数据功能包括查找字段、显示字段下拉列表、自动过滤(包括模糊查询和过滤)、增量搜索、改良的文字过滤、表头点击自动排序、排序功能加快速度、TreeView效果显示、主从表设置、显示表中表、OnGetCellParams事件...

    DELPHI 表格控件DBGridEh史上最全使用资料(101页)

    - 增量搜索 - 文字过滤改良 - 表头点击自动排序 - 排序功能改良 - TreeView效果显示 - KeyList、PickList功能 - 主从表设置 - 表中表显示 6. 输入/输出 - 数据导入导出 - Excel报表生成 - 打印组件使用 ...

    Qt5.9 简易多文档编辑器.zip

    此外,为了提供更友好的用户体验,我们可能还需要实现增量搜索和全词匹配等高级选项。 打印功能通常通过`QPrinter`和`QPrintPreviewDialog`来实现。用户可以预览即将打印的内容,并选择纸张大小、方向等打印设置。`...

    DELPHI_表格控件DBGridEh史上最全使用资料(101页)(清洁版)

    它还能实现增量搜索,改良文字过滤,以及表头点击自动排序功能。此外,还提供了在DbGridEh中显示TreeView效果,KeyList和PickList的实现,以及主从表的设置。 五、输入/输出 DBGridEh的输入/输出功能非常强大,包括...

    查找替换小程序 控件的应用

    "查找替换"功能是软件中常见的一个控件应用,特别是在文本编辑器、文档处理软件或编程环境中,用户经常需要快速定位和替换特定的文本内容。本文将详细讲解这个功能的工作原理以及在实际开发中的应用。 首先,查找...

    VirtualTreeView帮助文档

    4. **丰富的功能集**:支持编辑器集成、键盘快捷键、增量搜索等功能,提供良好的用户体验。 5. **强大的拖放与剪贴板支持**:可以方便地处理数据的复制、移动等操作。 #### 三、安装指南 - Virtual Treeview 的安装...

    AlphaControls14.16(2019-2-15).7z

    7. **ACSpin**: 数值输入控件,可以限制输入范围,并支持增量/减量操作。 除此之外,AlphaControls 还提供了丰富的界面元素,如滑块、进度条、仪表盘、选项卡、面板等,以及各种自定义的容器控件,帮助开发者构建...

    TMS+Component+Pack+v8.3.4.0+XE10.2.rar

    6. **umemoedit.dcu**: 可能是一个增强型的文本编辑器组件,相比标准的memo控件,可能具有更多的特性,如格式化文本、搜索替换、拼写检查等。 7. **advtoolbar.pas**: 工具栏组件,用于创建自定义的工具栏,开发者...

    delphi EhLib 9.5.012 Full Source 专业版 .rar

    在查找字段中进行增量搜索。 冻结的列。 DateTime选择器支持TDateField和TDateTimeField。 允许根据字段值显示TImageList中的位图。 允许隐藏和跟踪水平或垂直滚动​​条。 允许隐藏列。 允许显示冻结,页脚...

    小米便签例子

    在实现时,通常采用EditText控件作为基本输入界面,支持文字的输入、选择、复制、粘贴等操作。同时,还需要处理字体、字号、颜色等格式化选项,以及列表、引用等特殊排版。 2. **云同步**:为了确保数据安全和多...

Global site tag (gtag.js) - Google Analytics