基于Delphi的通用查询模块的设计与实现
- 格式:pdf
- 大小:69.93 KB
- 文档页数:2
Delphi数据库的拼音检索(查询)方案Delphi数据库的拼音检索(查询)方案-汉字转换成拼音昨夜看到一篇文章,可以用Delphi将汉字->拼音,可是将拼音转换成汉字又该如何操作哪?我的数据库:通讯录软件缺少用拼音查找功能.结果,搞到12点还是无果!唉!中午找到输入拼音可以检索汉字,可是在数据库中怎样实现哪?2个小时,无果!今天实现:1.首先建立字库;2.检索:先从数据库读出所要查询字段所有记录,将其放入控件ListBox,再按照拼音检索需要的数据.实现是靠的迂回策略(读取数据库汉字->转换成拼音->依据拼音检索结果->实现数据库的拼音检索),没找到直接在数据库查询,然后显示结果的方法,希望高人指点一二。
下面附上Code:1.字库Code:{//汉字拼音码检索对应的拼音字母}function GetCharInd(zzchar:string):char;begincase WORD(zzchar[1]) shl 8+WORD(zzchar[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';elseresult:=#0;end;end;2.查询实现部分:{汉字拼音码的检索}function DisByStrInd(ListBoxStr:TListBox;StrInd:string):string; label NotFound;varzzchar :string;i,j:integer;beginfor i:=0 to ListBoxStr.Items.Count-1 dobeginfor j:=1 to Length(StrInd) dobeginzzchar:=ListBoxStr.Items[i][2*j-1]+ListBoxStr.Items[i][2*j];if (StrInd[j]<>'?') and (UpperCase(StrInd[j])<>GetCharInd(zzchar))then goto NotFound;end;if result='' then result:=ListBoxStr.Items[i]else result:=result+#13+ListBoxStr.Items[i];NotFound:end;end;以下是Delphi7中 Unit单元的完整代码:{************************************************************** ******}{ *1.名称: SelectByPinYin 单元.*2.功能:本单元为此数据库程序的通过汉字拼音查询单元.*3.软件环境:Win98+Delphi7+AccessXp2002.*4.作者:Domain.*5.E-mail:******************6.制作日期:2008.04.15 }{********************************************************************}unit SelectByPinYin;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, NEOFORM, ComCtrls, MenuBar, T oolWin, ExtCtrls, StdCtrls, DBCtrls,Buttons;typeTSelectPY = class(TEDairyForm)Panel1: TPanel;Panel2: TPanel;Panel3: TPanel;Panel4: TPanel;ListBox2: TListBox;Edit1: TEdit;Label1: TLabel;Label2: TLabel;BitBtn1: TBitBtn;BitBtn2: TBitBtn;ListBox1: TListBox;Label3: TLabel;procedure FormCreate(Sender: TObject);procedure Edit1Change(Sender: TObject);procedure ListBox2Click(Sender: TObject);procedure ListBox1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varSelectPY: TSelectPY;getName:String;{函数在这里定义}function GetCharInd(zzchar:string):char;//汉字拼音码function DisByStrInd(ListBoxStr:TListBox;StrInd:string):string; implementationuses DataMain;{$R *.dfm}{//汉字拼音码检索对应的拼音字母}function GetCharInd(zzchar:string):char;begincase WORD(zzchar[1]) shl 8+WORD(zzchar[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';elseresult:=#0;end;end;{汉字拼音码的检索}function DisByStrInd(ListBoxStr:TListBox;StrInd:string):string;label NotFound;varzzchar :string;i,j:integer;beginfor i:=0 to ListBoxStr.Items.Count-1 dobeginfor j:=1 to Length(StrInd) dobeginzzchar:=ListBoxStr.Items[i][2*j-1]+ListBoxStr.Items[i][2*j];if (StrInd[j]<>'?') and (UpperCase(StrInd[j])<>GetCharInd(zzchar))then goto NotFound;end;if result='' then result:=ListBoxStr.Items[i]else result:=result+#13+ListBoxStr.Items[i];NotFound:end;end;{在 FormCreate 中,将联系人姓名加入 ListBox1}procedure TSelectPY.FormCreate(Sender: TObject);vari:integer;begininherited;with adodm.PersonName dobeginlistBox1.Clear;//用循环的方法加入for i:=0 to adodm.PersonName.RecordCount-1 dobeginself.ListBox1.Items.Add(adodm.PersonName.FieldByName('姓名').AsString);adodm.PersonName.Next;end;listBox1.Sorted:=true;adodm.PersonName.First;//DateSet指针指向第一条记录end;// edit1.SetFocus;end;//实现单击选择性名procedure TSelectPY.ListBox2Click(Sender: TObject);var xIndex:integer;begininherited;xIndex:=self.ListBox2.ItemIndex;//得到Item选项的Indexlabel3.Caption:=self.ListBox2.Items.Strings[xIndex];//从Index 得到 Text;getName:=self.ListBox2.Items.Strings[xIndex];end;{输入拼音查找汉字}procedure TSelectPY.Edit1Change(Sender: TObject);varSelStr:string;begininherited;SelStr:='';ListBox2.Items.Text:=DisByStrInd(listBox1,Edit1.Text);end;{单击选择}procedure TSelectPY.ListBox1Click(Sender: TObject);var nIndex:integer;begininherited;nIndex:=ListBox1.ItemIndex;ListBox2.Items.Text:=ListBox1.Items.Strings[nIndex];getName:=self.ListBox2.Items.Text;end;end.。
一步步教你优化Delphi字串查找一步步教你优化Delphi字串查找本人在编写离线浏览器WebSeizer的过程中,用到大量字符串处理函数,这是很耗CPU的一个处理过程,为了编写出高效率的网页解析引擎,对优化代码作了一番研究。
1 、高精度的计时函数代码优化时需要用到精确的计时器。
常用的有GetTickCount函数,可以达到毫秒级的精度。
但还是很不够的,这时可以采用提高循环次数的办法。
另外,还有一个精度更高的定时——“高分辨率性能计数器”(high-resolution performance counter),它提供了两个API 函数,取得计数器频率的QueryPerformanceFrequency和取得计数器数值的QueryPerformanceCounter。
实现原理是利用计算机中的8253,8254可编程时间间隔定时器芯片实现的。
在计算机内部有三个独立的16位计数器。
计数器可以以二进制或二—十进制(BDC)计数。
计数器每秒产生1193180次脉冲,每次脉冲使计数器的数字减一,产生频率是可变的,用QueryPerformanceFrequency可以得到,一般情况下都是1193180。
QueryPerformance Counter可以得到当前的计数器值。
所以只要你的计算机够快,理论上精度可以达到1/1193180秒。
2 、代码优化实例下面以一个自定义的字符串函数的为例,说明代码优化过程。
Delphi提供的字符串函数里有一个Pos函数,它的定义是:function Pos(Substr: string; S: string): Integer;它的作用是在字符串S中查找字符串Substr,返回值是Substr在S中第一次出现的位置,如果没有找到,返回值为0。
在本人编写WebSeizer软件(天空软件站有下载)过程中,Pos 已经不能满足要求。
一方面:在处理网页中的字符串时,要求对大小写不敏感,即< h t m l > 和<HTML>代表的含义完全一样。
Delphi程序设计实用教程第2版•Delphi程序设计概述•Delphi语言基础•面向对象编程基础•窗体和控件应用•文件操作与数据库访问技术•网络编程技术•调试、优化和发布部署•实战项目:XXX系统设计与实现Delphi程序设计概述Delphi是一种高级编程语言,由Borland公司开发,以Object Pascal为基础。
Delphi支持面向对象的程序设计,具有丰富的组件库和强大的开发环境。
Delphi广泛应用于Windows桌面应用程序、Web应用程序、数据库应用程序等开发领域。
Delphi语言简介下载并安装Delphi开发环境,选择合适的版本和组件库。
配置开发环境,包括设置编译器选项、调试器选项、代码编辑器风格等。
安装和配置数据库连接驱动,以便在Delphi中访问数据库。
Delphi开发环境安装与配置第一个Delphi程序创建一个新的Delphi项目,选择适当编译和运行程序,查看程序执行结果。
的项目类型和模板。
在代码编辑器中编写程序代码,实现简单的功能,如输出“HelloWorld”。
010204 Delphi程序结构Delphi程序由项目文件、单元文件和窗体文件等组成。
项目文件包含程序的整体设置和引用单元的信息。
单元文件包含程序中的代码和数据,是实现程序功能的基本单元。
窗体文件包含程序中的界面元素和事件处理代码,是实现用户交互的重要部分。
03Delphi语言基础包括Integer 、Boolean 、Char 、String 、Float 等常用类型。
标准数据类型如数组、记录、集合、文件等复合数据类型。
构造类型用于访问内存地址的特殊数据类型。
指针类型可存储不同类型数据的灵活数据类型。
变体类型Delphi 数据类型介绍如何在Delphi 中声明变量并为其赋值。
变量声明与赋值讲解常量的概念、定义方法及在程序中的应用。
常量定义与使用阐述局部变量、全局变量的概念及其作用范围。
变量作用域变量与常量运算符与表达式算术运算符介绍加、减、乘、除等基本算术运算。
基于Delphi的通用查询模块的设计与实现周飞1,胡众义2(1.温州大学现代教育中心浙江温州3250002.温州大学计算机科学与工程学院浙江温州325000)【摘要】:本文提供了基于Delphi下的通用查询模块,给出了其设计原理及实现的主要技术。
该模块操作简单,用户可自定义查询,调用方便,并在多个MIS中得到有效的应用。
【关键词】:通用;查询;面向对象开发环境0.前言目前管理信息系统中一个很重要的功能是查询。
查询模块的设计是整个系统设计的关键。
在以往的开发中,大多采用将查询静态地封装在系统内部,当查询需求发生变动时,对系统进行修改维护,然而用户对查询的需求往往是不断变化的,频繁的需求变动势必造成频繁地修改系统,使得维护的工作量及成本大大增加,因此设计开发支持用户自定义查询功能的通用查询模块,不仅能缩短系统的开发周期,而且易于维护。
本文使用Del-phi设计,针对用户的需求,设计一个操作方便、查询高效的通用查询模块。
1.通用查询模块设计本模块的设计思想是根据用户自定义的各种查询条件,产生相应的SQL语句供其它模块调用。
1.1需求描述①用户可自定义查询,选择数据库表中的任一字段作为查询字段。
②用户可任意的组合查询字段进行多条件查询。
③可按任一选定的字段进行排序。
④查询方案能保存,供下次查询使用,并且能进行修改、删除等操作。
查询方案包括:查询方案名、查询字段,关系运算符、多条件之间的逻辑关系等。
⑤查询操作方便易用,查询模块与其它模块间的调用简单。
⑥根据被查询字段,能自动设置数据输入类型,并检查数据输入合法性。
1.2通用查询模块界面设计根据需求描述,界面设计尽量使用户操作方便、查询灵活。
在实际运用中,多条件查询的查询条件超过6种的比较少,所以我们在设计界面时保留6种查询条件的空间。
如果超过6种,就要添加查询,查询条件的范围可以包括到整个数据库表中的所有字段。
界面如图1。
图1查询模块界面界面说明如下:①【方案】:此次查询方案以XML(可以扩展的标记语言)存储。
②【另存为】:保存此次查询方案,供下次查询使用。
③【删除】:删除被选择的查询方案。
④【添加查询】:当查询条件超过6种时,增加查询条件。
⑤【关系】:多种查询条件之间的逻辑关系,包括"且"、"或"等逻辑运算符。
⑥【字段】:查询字段,数据表中的所有字段都可以作为查询字段。
⑦【比较】:查询字段与用户输入的数值之间的关系。
⑧【数值】:用户根据查询字段而输入的查询内容。
⑨【确定】:根据用户自定义的查询方案产生并返回SQL语句,供其它模块调用。
⑩【排序字段】:选择查询中的某一字段进行排序。
⑾【清除所有】:清空被选中的查询方案。
2.通用查询模块实现把查询字段名转换为数据库中对应的字段名,比较运算符、逻辑运算符转换为SQL中的相应符号,设置数据输入类型,数据输入合法性的检查等是实现本模块的主要技术。
2.1主要控件及说明本模块中使用的主要控件及说明见表1表1主要控件及说明2.2程序实现通用查询模块的主程序为函数PublicQuery(ParentForm:TForm;DataSet:TDataSet;varFilterStr:string)。
其中参数Parent-Form是调用通用查询模块的父窗口,参数DataSet是查询数据集,为通用查询模块提供数据源,FilterStr是根据用户查询方案而产生的SQL查询语句,作为返回值。
2.2.1主程序SetCaseName(ParentForm.Name);//设置查询方案名。
InitForm;//窗体初始化。
CreateFieldDateSet(DataSet);//创建字段数据集。
GetFilterStr;//产生SQL语句。
2.2.2窗体初始化AddRelationList();//添加逻辑运算符。
AddCompareList();//添加关系运算符。
RelationComboBox1.KeyValue:='and';ReadQueryCase;////读取方案。
……//将关系、字段、比较的下拉框存到数组中。
2.2.3设置输入类型当用户选择不同的查询字段,根据查询字段的数据类型自动设置数据输入类型。
输入的数据类型有数字、字母、时间等等。
比如当查询字段为数字型,则要禁止字母等其他数据类型的输入。
通过过程SetInputType(FieldComboBox:TDBLookupCom-boBox;varKey:Char;Text:string)来实现。
关键代码如下:FieldCDS.Locate('FieldName',FieldComboBox.KeyValue,[]);//取查询字段名caseTFieldType(FieldCDS.FieldByName('FieldType').Value)offtDate,ftTime,ftDateTime://时间ifnot(Keyin['0'..'9','.','-',':','',#13,#10,#8])thenKey:=#0;ftSmallint,ftInteger,ftWord://整数ifnot(Keyin['0'..'9',#13,#10,#8])thenKey:=#0;ftFloat,ftCurrency,ftBCD://实数if(Pos('.',Text)<=0)thenifnot(Keyin['0'..'9','.',#13,#10,#8])thenKey:=#0(下转第157页)(上接第151页)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!elseifnot(Keyin['0'..'9',#13,#10,#8])thenKey:=#0;end;2.2.4检查输入合法性用户输入查询内容时,程序要自动检测输入的合法性,使用函数CheckInputData(FieldComboBox:TDBLookupComboBox;Text:string)来实现。
关键代码如下:FieldCDS.Locate('FieldName',FieldComboBox.KeyValue,[]);caseTFieldType(FieldCDS.FieldByName('FieldType').Value)offtDate,ftTime,ftDateTime://时间tryDateTimeResult:=StrToDateTime(Text);exceptResult:=False;MessageDlg('日期或时间格式不对',mtWarning,[mbOk],0);end;end;2.2.5根据用户自定义的查询方案产生SQL语句首先把查询方案进行分解,如果是多条件查询,先把第一项查询转换为SQL语句,然后用同样的方法把其他几项查询逐个的转换成SQL语句,最后把所有的SQL语句加起来。
本模块使用函数AFilter(RelationComboBox,CompareComboBox,FieldCom-boBox:TDBLookupComboBox)获取一项查询。
参数说明见表1。
主要代码如下:ifFieldCDS.Locate('FieldName',FieldComboBox.KeyValue,[])thencaseTFieldType(FieldCDS.FieldByName('FieldType').Value)offtString,ftWideString,ftMemo://字符串或备注型ifCompareComboBox.KeyValue='like'thenValue:=QuotedStr('%'+ValueEdit.Text+'%')elseValue:=QuotedStr(Val-ueEdit.Text);ftSmallint..ftBCD,ftBytes..ftAutoInc:Value:=ValueEdit.Text;ftDate,ftTime,ftDateTime:Value:=QuotedStr(ValueEdit.Text);end;Result:=RelationComboBox.KeyValue+''+FieldComboBox.KeyValue+''+CompareComboBox.KeyValue+''+Value+'';代码说明:取查询字段,判断其数据类型。
如果是字符串或备注型并且比较运算符等于"相似"则在输入数值前后加上符号"%",否则直接取值。
如果是数字型,直接取值。
如果是日期时间型则在输入数值前后加上引号。
最后把逻辑运算符、查询字段、比较运算符和数值相加作为返回值,即得SQL语句。
2.3模块的调用此通用查询模块调用简单。
父窗口ParentForm可以通过函数PublicQuery(ParentForm,QueryDataSet,FilterStr)来调用查询模块。
参数说明见主程序。
3.结束语本文通过MIS中用户动态查询需求进行分析,设计并实现了支持用户自定义查询功能的通用查询模快。
该模块在温州多家药品流通企业的MIS中得到使用,能很好地满足系统运行期间用户提出的新查询需求的要求,避免了因需求变动对原系统频繁修改而造成的系列问题,提高了系统的开放性和健壮性。
参考文献:1.胡和平,等通用数据库查询系统研究与实现[J],计算机工程与应用,1998.5:3-42.王瑞霞,等基于复用的动态查询构件系统的设计与实现[J],计算机应用研究,2006.1:144-1463.周新会,等Delphi数据库通用模块及典型系统开发实例导航[M],北京:人民邮电出版社,2006式,通过HTTP或HTTPS协议直接访问。
HTTP协议采用了请求/响应模型。
一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
(2)封装协议本系统所提供的接口都是使用WebService、XML技术组织及实现的。
DataExchange客户端与DataExchange服务端、各应用系统与DataExchange客户端都是通过WebService实现消息交换和功能调用接口。
以WebService为基础的接口设计是基于SOAP的接口设计。
SOAP(SimpleObjectAccessProtocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encodingrules),用于表示应用程序需要使用的数据类型的实例;SOAPRPC表示(RPCrepresentation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。