用Delphi 6编程实现自动标注汉语拼音
在使用电脑编辑文档的时候,输入汉语拼音再加上它的声调,是一件令人头痛的事情,特别对于那些经常接触拼音的教师、家长和孩子。虽然 Office XP中已经加入了自动标注汉语拼音的功能,对于没有用上Office XP的人来说,难道就没有办法享受到这种便利吗?
这篇文章不仅仅是说明如何实现自动标注汉语拼音编程的,我的主要目的是演示解决问题的一般步骤。
就本问题来说,你是不是有种不知如何下手的感觉?想一想我们在编写汉字GB-BIG5相互转化时的做法:把每一个汉字的GB码、BIG5码都列出来,并一一对应。我们可以仿照这种方法,把每一个汉字(至少6763 个!!!)对应的拼音都列出来,然后就可以查询了。
不过,我相信你和我一样是懒惰的,懒惰的人通常会花费几倍的时间去找个可以懒惰的办法来。最懒惰的办法是……捡个现成的!先到网上问问看,就选大富翁论坛吧。这里不是大富翁游戏爱好者交流经验的论坛,而是专门讨论Delphi编程的地方,人气也好。登录http://www.delphibbs. com,免费注个册,问问看有没有谁知道如何编,或者能提供个组件什么的。记住要选邮件通知,如果有人回答问题,论坛会自动发邮件通知你,然后你就等着吧。
闲着也是闲着,在等待的时候我们也该做点什么。首先,应该想到 MSDN,它可是程序员必备的编程参考书(软件)。在MSDN中输入spell 或phoneticize查一下,看看有没有我们想要的信息。你就沿着这条思路试试吧。
还可以想一想,我们以前使用电脑接触到有拼音的地方。输入法!对了,就是拼音输入法!输入拼音我们可以得到汉字。我们能不能通过一种逆运算,输入汉字得到这个汉字的拼音?回答当然是肯定的,这也是本文推荐的方法。
这种方法实际上就是得到汉字的字根。我们仍然可以上论坛去询问,到 MSDN中查找,不过问题要改为“如何得到汉字的字根”。不用说,你已经可以解决本问题了。实际上,此编程主要用到三个函数:
GetKeyboardLayoutList:得到当台计算机中存在的输入法列表;
ImmEscape :得到输入法的名称;
ImmGetConversionList: 看看这个输入法是否支持Reverse Conversion功能,如果支持则继续使用此函数,可取得组字字根信息。
现在简单了,打开Delphi 6,添加两个TEdit控件、三个TBitBtn控件、一个TOpenDialog控件以及若干 Label控件以示说明,窗体设计如图1所示。接着输入下面的源代码,编译通过就可以使用了。主要的地方我已经加了注释。在编译之前,请确定你安装了微软拼音输入法。程序代码如下:
unit Unit1;
inte易做图ce
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Buttons, IMM;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Edit2: TEdit;
Edit1: TEdit;
Label5: TLabel;
Label1: TLabel;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
public
iHandleCount: integer;
pList : array[1..20] of HKL;
szImeName : array[0..254] of char;
II : integer;
end;
const
pych: array[1..6,1..5] of string[2]=
((ā, á,ǎ,à,a),(ō, ó,ǒ,ò,o),
(ē, é,ě,è,e),(ī, í,ǐ,ì,i),
(ū, ú,ǔ,ù,u),(ǖ, ǘ,ǚ,ǜ,ü));
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
II := 0;
//retrieves the keyboard layout handles corresponding to the current set of input locales in the system.
iHandleCount := GetKeyboardLayoutList(20, pList);
for i := 1 to iHandleCount do
begin
if ImmEscape(pList[i], 0, IME_ESC_IME_NAME, @szImeName) > 0 then
if szImeName=微软拼音输入法 then
begin
StdCtrls, ExtCtrls, Buttons, IMM;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Edit2: TEdit;
Edit1: TEdit;
Label5: TLabel;
Label1: TLabel;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
public
iHandleCount: integer;
pList : array[1..20] of HKL;
szImeName : array[0..254] of char;
II : integer;
end;
const
pych: array[1..6,1..5] of string[2]=
((ā, á,ǎ,à,a),(ō, ó,ǒ,ò,o),
(ē, é,ě,è,e),(ī, í,ǐ,ì,i),
(ū, ú,ǔ,ù,u),(ǖ, ǘ,ǚ,ǜ,ü));
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
II := 0;
//retrieves the keyboard layout handles corresponding to the current set of input locales in the system.
iHandleCount := GetKeyboardLayoutList(20, pList);
for i := 1 to iHandleCount do
begin
if ImmEscape(pList[i], 0, IME_ESC_IME_NAME, @szImeName) > 0 then
if szImeName=微软拼音输入法 then
begin
ii := i;
exit;
end;
end;
ShowMessage(请你安装"微软拼音输入法"!);
end;// 选择需要标注拼音的文件:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
OpenDialog1.Title := 选择需要转换的文件;
if OpenDialog1.Execute then
Edit1.Text := OpenDialog1.FileName;
Edit2.Text := ChangeFileExt(OpenDialog1.FileName, .py);
end;
// 拼音文件保存到
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
OpenDialog1.Title := 转换到:;
if OpenDialog1.Execute then
Edit2.Text := OpenDialog1.FileName;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
var
f1 ,f2 :textfile;
ch1,ch2,ch11 :Char;
ch2Str :string;
j ,alr , tmp :integer;
py : array[1..6] of integer;
function QueryCompStr(hKB: HKL; const sChinese: AnsiString): string;
var
dwGCL: DWORD;
szBuffer: array[0..254] of char;
iMaxKey, iStart, i: integer;
begin
Result := ;
iMaxKey := ImmEscape(hKB, 0, IME_ESC_MAX_KEY, nil);
if iMaxKey <= 0 then exit;
// 看看这个输入法是否支持Reverse Conversion功能,同时, 侦测需要多大的空间容纳取得的信息
dwGCL := ImmGetConversionList(hKB, 0, pchar(sChinese),nil, 0, GCL_REVERSECONVERSION);
if dwGCL <= 0 then Exit; // 该输入法不支持Reverse Conversion功能
// 取得组字字根信息, dwGCL的值必须用上次呼叫ImmGetConversionList得到的返回值作为参数
dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),@szBuffer, dwGCL,GCL_REVERSECONVERSION);
if dwGCL > 0 then
begin
iStart := byte(szBuffer[24]);
for i := iStart to iStart + iMaxKey * 2 do
Appen补充:软件开发 , Delphi ,
上一个:任务栏中的托盘程序设计
下一个:用Delphi控制IE窗口
- 更多Delphi疑问解答:
- 用delphi做这个功能怎么做?
- 问delphi 中将Tquery控件查找到的记录数值写入某一edit中代码如何写?
- 有谁知道怎样在Delphi 7中显示代码的行数啊?或者有什么方法能够快速找到已知某一行数的代码啊!
- 关于delphi 操作EXcel的问题
- delphi ,sql,, 数据库 ,求助~~~~ 急~~~~~
- delphi变体记录问题
- delphi能实现反射吗?
- 谁会安装delphi 7 控件啊!会的话,请帮我在线安装一下? QQ785799795
- 在Delphi的Image控件上画移动的图片
- delphi 月份递增的循环查询
- 宝兰公司的开发工具delphi和c++builder现在的年代还流行吗?
- 我是沈阳做delphi开发的,想要集成短信功能到客户管理系统中,麻烦各位达人?
- 我是南昌做delphi开发的,想要集成短信功能到PMS中,分享下吧!
- delphi 取消窗体的最小化怎么弄
- 我是深圳做delphi开发的,想要集成短信功能到知识管理系统中,求达人指点!