编写数据库应用系统有时会用到根据汉字拼音来快速检索数据,网络上有汉字生成拼音的方法:

代码


function GetPYIndexChar(hzchar: Ansistring): 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';
    $00C800BB..$00C800F5 : 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;

定义一个检索函数:

代码

function SearchByPYIndexStr(SourceStrs: TStrings;PYIndexStr: Ansistring): Ansistring;
label NotFound;
var
  i, j   :integer;
  hzchar :Ansistring;
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];
        hzchar:=SourceStrs[i][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;

然后就可以像这样来使用了:

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

下面的函数可以将汉字的字符串生成拼音简写(注:适用于D2009/D2010,D7以前版本及D2007需要修改为AnsiString方式,汉字取两个字符):

代码

function GetPY(const hzchar:string):string;
var
  i: integer;
  c:Char;
begin
  i:=1;
  result:='';
  for i:=1 to length(hzchar)  do
  begin
    c:=GetPYIndexChar(hzchar[i]);
    if c='' then
      result:=result+hzchar[i]
    else
      result:=result+c;
  end;
end;

然后我们定义一个可以取部分拼音匹配的函数:

代码

function SearchByPYIndexStrPart(SourceStrs: TStrings;PYIndexStr: Ansistring): Ansistring;
var
  i, j   :integer;
  hzchar :Ansistring;
  s:String;
begin
  for i:=0 to SourceStrs.Count-1 do
  begin
    s:=GetPY(SourceStrs[i]);
    if Pos(UpperCase(PYIndexStr),UpperCase(s))>0 then
      result := result + Char(13) + SourceStrs[i];
  end;
end;

一个自动生成过滤参数的函数:

代码

function GetDataSetFilter(SourceStrs: TStrings;PYIndexStr: Ansistring;FieldName:String): Ansistring;
var
  ResultStr,ss:string;
  s:TStrings;
begin
  ResultStr:='';
  try
    s:=TStringList.Create;
    s.Text:= SearchByPYIndexStrPart(SourceStrs, PYIndexStr);
    Result:='';
    for ss in s do
    begin
      if ss<>'' then
        Result:=Result+FieldName+' like ''%'+ss+'%'' or ';
    end;
    Result:=Copy(Result,1,Length(Result)-3);
    Exit(Result);
  finally
    s.Free;
  end;
end;

然后我们就可以像这样来使我们的数据支持动态的汉字拼音快速检索了:

代码

//比如说TEdit的OnChange事件中:
//FieldValueListStrings:TStrings类型的数据值列表
//PYIndex:拼音索引字符串
//FieldName:筛选用的字段名称
/注意要设置aDataSet.Filtered:=True;

aDataSet.Filter:=GetDataSetFilter(FieldValueListStrings,PYIndex,FieldName);

这样我们定义好通用函数,就可以在程序的任何地方方便地使用汉字检索了.

注意:如果待查询数据比较到的话,这种方式效率很低,建议最好在数据表中建立一个拼音字段,在保存数据时自动生成,然后就可以根据拼音字段进行快速筛选了.

根据拼音检索数据的方法相关推荐

  1. 向线程传递数据与线程用回调方法检索数据

    用回调方法检索数据 /**//*用回调方法检索数据 下面的示例演示了一个从线程中检索数据的回调方法.包含数据和线程方法的类的构造函数也接受代表回调方法的委托: 在线程方法结束前,它调用该回调委托. * ...

  2. 拼音检索VS五笔检索---Javascript实现

    前段时间在研究用js 实现拼音首字母以及五笔首字符的检索,呵呵,终于实现了.找了好多资料.方法也是多样的.就是检索的内容多了.循环的次数多,导致检索有点慢,也有可能我写的js也不是特别的精炼,但是不管 ...

  3. 调用实现天气预报功能android,Android编程实现获取新浪天气预报数据的方法

    本文实例讲述了Android编程实现获取新浪天气预报数据的方法.分享给大家供大家参考,具体如下: 新浪天气预报地址: http://php.weather.sina.com.cn/xml.php?ci ...

  4. html webservice数据交互_一种基于WebService的数据交换方法

    一种基于WebService的数据交换方法 [专利摘要]本发明涉及数据交换[技术领域],特别涉及一种基于WebService的数据交换方法.本发明是以Web服务为依托,通过定义参数的方式进行传入内容和 ...

  5. 最新综述:用于文本分类的数据增强方法

    ©PaperWeekly 原创 · 作者 | 王馨月 学校 | 四川大学本科生 研究方向 | 自然语言处理 概要 数据增强,即通过转换为机器学习人工创建训练数据,是跨机器学习学科广泛研究的研究领域.它 ...

  6. SQL 100+个最佳入门案例实践(覆盖Oralce、SQL Server、Mysql)之基础操作_1_检索数据

    SQL基础操作_1_检索数据 目录 7.1.1 数据集 7.1.2 学生选课关系表 7.1.3 供应商关系表 7.2.1 从表中查询所有行和列 7.2.2 从表中查询部分行 7.2.3 查询满足某个条 ...

  7. OLEDB Excel 与C# 的数据流通方法

    一.             名词解释: OleDbCommand 是对数据源执行各种操作的SQL语句或者存储过程,连接access.excel等数据文件进行数据操作时候用到的,其实和sqlcomma ...

  8. nlp5-n-gram/语言模型(数据平滑方法

    文章目录 1.句子的先验概率 1.1 n-gram 2. 参数估计 3. 数据平滑 3.1 数据平滑度方法 3.1.1加1法 3.1.2减 1.句子的先验概率 这个联合概率太小了 窗口越大,共现的可能 ...

  9. 4-2 ADO.NET-查询和检索数据13

    //==========动态程序设计部分================ using System; using System.Collections.Generic; using System.Co ...

最新文章

  1. struts2 理解
  2. spring boot配置文件详解
  3. 启动Kafka失败Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 107
  4. 一次网站性能排查的经历
  5. TCP/IP、Http的区别
  6. 移除项目中的CocoaPods
  7. 《LeetBook》leetcode题解(5):Longest Palindromic [M]——回文串判断
  8. 测绘工程所用软件评析
  9. Android 4 开发环境配置中的诸多陷阱
  10. Android XML中引用自定义内部类view的四个why
  11. virtualbox安装增强功能时【未能加载虚拟光盘】
  12. win10字体模糊发虚怎么回事?win10字体模糊发虚电脑问题还是系统问题?
  13. 《刺杀骑士团长》读后感
  14. 判断输入的字符与已知字符相等_你会输入带圈字符吗?
  15. java8.0安装教程_图解JDK8下载安装以及环境配置全过程,超级详细
  16. 华为手机序列号前三位_华为所有型号交换机查看序列号方法
  17. win10java编辑器_5个最好的Windows 10的字幕编辑软件
  18. 城通网盘仿蓝奏网盘源码
  19. word有空白段删不掉 解决办法
  20. 如何调整网站竞价关键词

热门文章

  1. Flutter选择多张图片上传
  2. 在线进行去除图片水印
  3. CAJ与PDF与WORD转化方法
  4. 打造黑苹果(四)安装MACOS系统
  5. 记录python开发第一个app,实现word转html的桌面应用
  6. 高中数学必修2试题:直线平面平行的判定及其性质
  7. 【Web前端初学笔记】②HTML基本结构标签,VSCode工具创建页面,网页开发工具
  8. k-means 的原理,优缺点以及改进
  9. 百度地图 路书动态加载规划
  10. MQTT之十一 阿里云物联网平台网址