Delphi用拼音首字符序列实现检索功能

日常工作和生活中我们经常使用电子记事本查找个人通讯录信息,或在单位的应用程序中查询客户档案或业务资料,这个过程中往往需要输入大量的汉字信息,对于熟悉计算机的人这已经是一件头疼的事,那些不太熟悉计算机或根本不懂汉字输入的用户简直就望而生畏。作为对数据检索技术的一种新的尝试,作者探索使用汉字拼音的首字符序列作为检索关键字,这样,用户不必使用汉字,只须简单地键入要查询信息的每个汉字的拼音首字符即可。比如你想查找关键字“中国人民银行”,你只需要输入“zgrmyh”。作者希望通过下面的例子,为广大计算机同行起一个抛砖引玉的作用,让我们开发的程序更加便捷、好用。
原理很简单,找出汉字表中拼音首字符分别为“A”至“Z”的汉字内码范围,这样,对于要检索的汉字只需要检查它的内码位于哪一个首字符的范围内,就可以判断出它的拼音首字符。

程序更简单,包括3个控件:一个列表存放着所有待检索的信息;一个列表用于存放检索后的信息;一个编辑框用于输入检索关键字(即拼音首字符序列)。详细如下:

1.进入Delphi创建一个新工程:Project1

2.在Form1上创建以下控件并填写属性:

控件类型      属性名称  属性值
Edit           Name      Search
ListBox        Name      SourceList
Items      输入一些字符串,如姓名等,用于提供检索数据
ListBox        Name      ResultList


3.键入以下两个函数

// 获取指定汉字的拼音索引字母,如:“汉”的索引字母是“H”
function GetPYIndexChar( hzchar:string):char;
begin
case WORD(hzchar[1]) shl 8 + WORD(hzchar[2]) of
$B0A1..$B0C4 : result := 'A';
$B0C5..$B2C0 : result := 'B';
$B2C1..$B4ED : result := 'C';
$B4EE..$B6E9 : result := 'D';
$B6EA..$B7A1 : result := 'E';
$B7A2..$B8C0 : result := 'F';
$B8C1..$B9FD : result := 'G';
$B9FE..$BBF6 : result := 'H';
$BBF7..$BFA5 : result := 'J';
$BFA6..$C0AB : result := 'K';
$C0AC..$C2E7 : result := 'L';
$C2E8..$C4C2 : result := 'M';
$C4C3..$C5B5 : result := 'N';
$C5B6..$C5BD : result := 'O';
$C5BE..$C6D9 : result := 'P';
$C6DA..$C8BA : result := 'Q';
$C8BB..$C8F5 : result := 'R';
$C8F6..$CBF9 : result := 'S';
$CBFA..$CDD9 : result := 'T';
$CDDA..$CEF3 : result := 'W';
$CEF4..$D188 : result := 'X';
$D1B9..$D4D0 : result := 'Y';
$D4D1..$D7F9 : result := 'Z';
else
result := char(0);
end;
end;

// 在指定的字符串列表SourceStrs中检索符合拼音索引字符串
PYIndexStr的所有字符串,并返回。
function SearchByPYIndexStr
( SourceStrs:TStrings;
PYIndexStr:string):string;
label NotFound;
var
i, j   :integer;
hzchar :string;
begin
for i:=0 to SourceStrs.Count-1 do
begin
for j:=1 to Length(PYIndexStr) do
begin
hzchar:=SourceStrs[i][2*j-1]
+ SourceStrs[i][2*j];
if (PYIndexStr[j]<>'?') and
(UpperCase(PYIndexStr[j]) <>
GetPYIndexChar(hzchar)) then goto NotFound;
end;
if result='' then result := SourceStrs[i]
else result := result + Char
(13) + SourceStrs[i];
NotFound:
end;
end;


4.增加编辑框Search的OnChange事件:

procedure TForm1.SearchChange(Sender: TObject);
var ResultStr:string;
begin
ResultStr:='';
ResultList.Items.Text := SearchByPYIndexStr
(Sourcelist.Items, Search.Text);
end;


5.编译运行后

在编辑框Search中输入要查询字符串的拼音首字符序列,检索结果列表ResultList就会列出检索到的信息,检索中还支持“?”通配符,对于难以确定的的文字使用“?”替代位置,可以实现更复杂的检索。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库数据关联输入拼音自动过滤控件,内含 Caption 属性编辑器。 只在 Delphi7 下测试通过,曾试图移植到 Delphi2009,但是 ChineseSpell.pas 单元出错,哪位高人修改后,请给我传一份,感激不尽。 (抱歉,关键部分没有源代码,但绝没有设置使用期限什么的) 本组件为方便最终用户输入数据而设计。在所有的数据库应用软件中,都必然有输入数据库表中关联字段数据的情况,而且是频繁的出现。比如:在企业ERP系统中,录入入库单时需要选择或输入已录入系统的某种货物,这时就需要解决如何使用户方便的录入这种货物。一般这种情况有两种解决办法,一种是用下拉列表框提供输入的选择,这种方法有很大的缺点:需要用户点击鼠标,弹出下拉框选择输入,比较麻烦;另外如果数据较多,用户选择数据的时间要超过了输入的时间,反而降低了输入速度;用户也不能通过多列数据信息来参照选择。还有一个更大的缺点是程序员编程非常烦琐,需要代码将数据库数据一一列入列表框,并且还需要附加关键字段数据,用代码处理选择的关键字段值。另一种是用一个按钮来调用另一个窗体,用另一个窗体来列出供选择输入的数据,用户选择了数据后返回。这种方法虽然可解决数据显示单一的问题,但是缺点也很明显,即程序员编程烦琐,用户输入也不方便,如果应用软件中多次需要输入关联数据,那么这些显示关联数据的窗体也会很多,大大增加了软件的复杂度,不利于维护和升级。这两种常规的解决办法如果处理不好,还会使用户频繁的在键盘和鼠标之间切换操作,非常麻烦,根本没有人性化可言。 而这个DataHint组件有众多优点: 1)即时显示:在需要时自动显示,在不需要时自动关闭,完全不用人工干预。 2)多列数据显示:支持多列数据显示,程序员甚至可以设置每一列的颜色和字体,以及整个数据显示框的外观,从而美化组件的外观。 3)即时拼音过滤:组件内部可以根据程序员的设置自动生成字段的拼音计算字段。普通用户都熟悉拼音,只要输入数据的汉语简拼或全拼,即时自动过滤出符合的记录,避免了不相干数据的干扰。用户还可以在过滤数据的基础上进一步通过键盘或鼠标选择余下的数据。它还不仅仅支持拼音过滤,程序员可以设置所有的字段都支持过滤,那么如果有序号类的字段,用户只需输入数字序号就可以直接过滤出选择数据,过滤出数据后只要按会车键就可以确认输入,大大简化了用户的操作。 4)统一键盘操作:整个输入过程完全不需要鼠标的辅助,用键盘就可以快速方便的完成操作。焦点进入、离开编辑框组件自动显示和关闭,不需要用户操作,输入关键字符自动过滤数据,敲会车键确认输入,按上下箭头键,进一步选择数据,完全不需要鼠标的参与。如果数据不多,用户也完全可以只用鼠标完成操作。 5)编辑控件与本组件分离:编辑控件与本组件是合作关系,这种关系的优点是两个对象的生存期互不相干。因此可以使用一个本组件对象,完成多个编辑框的输入。 6)编程方便:本组件设计功能强大,几乎将所有的编写代码的工作都转移到了对象监视器的操作中。程序员只要编辑SQL属性就可以自动将数据库中的数据提取到本组件。组件提供了一个设计字段的组件编辑器,设计列的属性编辑器,这两个编辑器是程序员非常熟悉的字段编辑器和DBGrid列编辑器。其中字段编辑器经过修改和加强,使得程序员可以设置过滤字段和拼音字段。程序员不需要写任何代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值