一个由中文字符串转拼音字头引出的问题(100分)

  • 主题发起人 主题发起人 bluenats
  • 开始时间 开始时间
B

bluenats

Unregistered / Unconfirmed
GUEST, unregistred user!
我在LabeledEdit的OnChange中写了如下代码来生成该LabeledEdit.txt的拼音字头
procedure TDict1Frm.LabeledEdit2Change(Sender: TObject);
var
i: integer;
flag: Boolean;
begin
flag:=false;
//判断被提取拼音字头的字符串是否为纯汉字字符串
if (length(LabeledEdit2.Text) mod 2) <> 0 then
flag:=false
else
for i:=1 to length(LabeledEdit2.Text) do
if (i mod 2)=1 then
if (WORD(LabeledEdit2.Text) shl 8 + WORD(LabeledEdit2.Text[i+1]) >= $B0A1)
and (WORD(LabeledEdit2.Text) shl 8 + WORD(LabeledEdit2.Text[i+1]) <= $D7F9) then
flag:=true
else
flag:=false;
if flag = true then
LabeledEdit3.Text:=GetPYIndexString(LabeledEdit2.Text);
end;
GetPYIndexString(ChString:string);为拼音字头生成函数,如下
function GetPYIndexString( ChString:string):string;
var
i:integer;
begin //根据一个汉字字符串取得拼音字头,不对汉字字符串做校验
if ChString = '' then
result:='';
for i:=1 to length(ChString) do
if (i mod 2) = 1 then
case WORD(ChString) shl 8 + WORD(ChString[i+1]) of
$B0A1..$B0C4 : result := result+'A';
$B0C5..$B2C0 : result := result+'B';
$B2C1..$B4ED : result := result+'C';
$B4EE..$B6E9 : result := result+'D';
$B6EA..$B7A1 : result := result+'E';
$B7A2..$B8C0 : result := result+'F';
$B8C1..$B9FD : result := result+'G';
$B9FE..$BBF6 : result := result+'H';
$BBF7..$BFA5 : result := result+'J';
$BFA6..$C0AB : result := result+'K';
$C0AC..$C2E7 : result := result+'L';
$C2E8..$C4C2 : result := result+'M';
$C4C3..$C5B5 : result := result+'N';
$C5B6..$C5BD : result := result+'O';
$C5BE..$C6D9 : result := result+'P';
$C6DA..$C8BA : result := result+'Q';
$C8BB..$C8F5 : result := result+'R';
$C8F6..$CBF9 : result := result+'S';
$CBFA..$CDD9 : result := result+'T';
$CDDA..$CEF3 : result := result+'W';
$CEF4..$D188 : result := result+'X';
$D1B9..$D4D0 : result := result+'Y';
$D4D1..$D7F9 : result := result+'Z';
end;
end;

问题来了,当我输入几个中文字符串后,按回退键删除全部字符串时,在接受拼音字头的
LabeledEdit中总是剩下原先第一个汉字的拼音字头,百思不得其解,希望高人指教!
 
因为当LabeledEdit2.Text=‘’
你没有做任何动作,所LabeledEdit3.Text 内容保持不变;
在最后加一句:
if LabeledEdit2.Text='' then
LabeledEdit3.Text=''
就可以了
 
每回退一个汉字都会删掉一个拼音缩写,只有最后一个汉字被删掉的时候,最后一个拼音
字头却不消失,怎么回事?
 
因为你删除最后一个汉字时,flag的属性变为了false,没变为true!
flag:=false;
//判断被提取拼音字头的字符串是否为纯汉字字符串
if (length(LabeledEdit2.Text) mod 2) <> 0 then
flag:=false
else
{ for i:=1 to length(LabeledEdit2.Text) do
if (i mod 2)=1 then
if (WORD(LabeledEdit2.Text) shl 8 + WORD(LabeledEdit2.Text[i+1]) >= $B0A1)
and (WORD(LabeledEdit2.Text) shl 8 + WORD(LabeledEdit2.Text[i+1]) <= $D7F9) then
flag:=true
else
flag:=false;}
上面一段没有被执行,因为length(LabeledEdit2.Text)=0
所以flag为false:所以LabeledEdit3.Text就没有被赋值
if flag = true then
LabeledEdit3.Text:=GetPYIndexString(LabeledEdit2.Text);
end;
 
我说的应该非常清楚了!不是代码不正确,是代码的逻辑不正确!
 
我写了一个汉字拼音dll,支持2万多个汉字,只是现在还不能区分多音字,要的话留下mail
 
bluenats@hotmail.com
thanks
 
谢谢冷叶风,逻辑我确实没有考虑到,太疏忽了
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
576
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部