interface
uses
SysUtils,Classes;
type
TSearchByPy=class
public
constructor Create(mystrs:TStrings);
destructor Destroy;override;
function SearchByPYIndexStr(SourceStrs:TStrings; PYIndexStr:string):string;
procedure SearchItemsBySpell(SpellStr:string;Destinstrs:tstrings);
function isalpha(source:string):boolean;
private
ChineseItems:TStringlist;
function GetPYIndexChar( hzchar:string):char;
end;
TStack=class
private
StackValue: TStringlist;
Function IsEmpty:boolean;
Function fcount:integer;
public
constructor Create;
Destructor Destory;
procedure Push(x:string);
Function Pop:string;
Function Gettop:string;
property ItemsCount:integer read fcount;
end;
implementation
constructor TSearchByPy.Create(mystrs:TStrings);
var index:integer;
begin
ChineseItems:=Tstringlist.create;
for index:=0 to Mystrs.count -1 do
begin
ChineseItems.add(mystrs.strings[index]);
end;
end;
destructor TSearchByPy.Destroy;
begin
ChineseItems.Free;
end;
function TSearchByPy.GetPYIndexChar( hzchar:string):char;
begin
if length(hzchar)<2 then
begin
result:=char(0);
exit;
end;
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 TSearchByPy.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;
function TSearchByPy.isalpha(source:string):boolean;
var index:integer;
begin
result:=true;
for index:=1 to length(source) do
if not(UpCase(source[index]) in ['A'..'Z']) then
begin
result:=false;
end;
end;
procedure TSearchByPy.SearchItemsBySpell(SpellStr:string;Destinstrs:tstrings);
label NotFound;
var
i, j :integer;
hzchar :string;
begin
if not isalpha(SpellStr) then exit;
destinstrs.clear;
for i:=0 to ChineseItems.Count-1 do
begin
for j:=1 to Length(SpellStr) do
begin
hzchar:=Copy(ChineseItems.Strings[i],2*j-1,2);
if (Spellstr[j]<>'?') and
(UpperCase(Spellstr[j]) <> GetPYIndexChar(hzchar)) then
goto NotFound;
end;
Destinstrs.Add(ChineseItems.Strings[i]);
NotFound:
end;
end;
constructor TStack.create;
begin
StackValue:=Tstringlist.Create;
StackValue.Sorted:=false;
end;
Destructor TStack.Destory;
begin
StackValue.Free;
end;
Function TStack.IsEmpty:boolean;
begin
if StackValue.count=0 then
result:=true
else
result:=false;
end;
procedure TStack.Push(x:string);
var index:integer;
begin
if StackValue.Find(x,index) then
StackValue.Delete(index);
StackValue.Add(x);
end;
Function TStack.Pop:string;
begin
if IsEmpty then
result:=''
else
begin
result:=StackValue.Strings[(StackValue.Count) -1];
StackValue.Delete((StackValue.Count) -1);
end;
end;
Function TStack.Gettop:string;
begin
if IsEmpty then
result:=''
else
begin
result:=StackValue.Strings[(StackValue.Count) -1];
end;
end;
Function TStack.fcount:integer;
begin
result:=StackValue.count;
end;
end.