在TEXTBOX里输入CWK,就能在一个LISTBOX里把财务科显示出来?(200分)

  • 主题发起人 主题发起人 cold-fish
  • 开始时间 开始时间
C

cold-fish

Unregistered / Unconfirmed
GUEST, unregistred user!
一个代码对应一个科室名称,
当输入C时就把首字母为C的科室全部列出来,如财务科,仓库处,等等,在LISTBOX里显示
再输W,仅列出首字母为C和W的科室,如财务科,常委办公室,等等
 
你可以写一个大小比较的表再对照一下就可以了,用VB做过!
 
我们做过类似的基本类,在多个项目中用过,就是代码太多,不方便贴,最方便的是对数据集Filter
 
实际上是一个取汉字拼音首字母的问题。给你一段代码:
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;
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[2*j-1]+ SourceStrs[2*j];
if (PYIndexStr[j]<>'?') and (UpperCase(PYIndexStr[j])<>GetPYIndexChar(hzchar)) then
goto NotFound;
end;
if result='' then result := SourceStrs
else result := result + Char(13) + SourceStrs;
NotFound:
end;
end;
 
我先扔块砖有玉的砸过来哦~
我来说说我的思路(我也是这么做的)
1.首先你字典表里要有个字段来来拼写你的科室名:如财务科为CWK
2。建立个结构替
DictList= record
Name :string;
DM :string;
end;
ArrayDictList : Array of DictList;
3.把字典都读出来放到ArrayDictList 中
Query.Open
SetLength(ArrayDictList,Query.RecordCount)
While Not Query.eof
Begin
ArrayDictList.Name = Query.fieldbyname('name').asstring
arraydictlist.dm = query.fieldbyname('dm').asstring;
query.next
End;
4.定义一个StringList
在onChange事件里过滤ArrayDictList
我是这么写的:
i:=0
While i<arraydictlistcount do
Begin
if pos(edit.text,arrardictname.dm)<>0 then
stringlist.add(inttostr(i));
i:=i+1
End;
i:=0
listbox.clear
listbox.beginupdate
while i<stringlist.count do
Begin
Listbox.add(arraydict[StrToInt(stringlist.string)].Name
i:=i+1;
End;
listbox.endupdate;
我的字典大约有1000条,速度上没有问提,大体上就这样,当然中间还有写修饰的地方
应该有比这个好的算法,大家都说说吧
 
注意,那个字典有问题,我试过,他实际是按区位码前面常用汉字的排列顺序来取首字母,但区位码表的后面有一段不常用的汉字是按部首排序的,就查不到读音了,不妨试验一下。我们当时也是百般无奈,后来从拼音输入法里导了个表出来才解决的
 
用assign方法可以互相交换List
 
后退
顶部