有没有办法通过IMM。PAS,得到某一个汉字的五笔编码??

lxl 2003-03-04 04:59:12
以前使用码表对应的方法,
通过程序附带一个码表文件,
可以查到一个汉字的五笔编码
但也想找到更好的方法,
如使用IMM。PAS来查找
1、使用类于下面的程序可以查得到一个汉字的拼音编码,
但为什么不可以用“五笔86版”来得到一个汉字的五笔编码呢?
unit Unit1;

interface

uses
imm,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
function getfirstpy(hz: string): string;
function QueryCompstr(hKB: HKL; const sChinese: AnsiString): string;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


function tform1.getfirstpy(hz : string ) : string;
var k : hkl;
j,ihandlecount : integer;
pList: array[1..10] of HKL;
szImeName: array[0..254] of char;
cchinese,py : string;
begin
iHandleCount := GetKeyboardLayoutList(10, pList);
for k := 1 to 10 do
if ImmEscape(pList[k], 0, IME_ESC_IME_NAME, @szImeName)>0 then
if szImeName= '微软拼音输入法' then
break;
cchinese:=hz;
j:=1;
py:='';
while j<= strlen(pchar(cchinese)) do
begin
if ord(cchinese[j])>128 then
begin
hz:=cchinese[j]+cchinese[j+1];
py:=py+QueryCompStr(plist[k],pchar(hz));
inc(j,2);
end
else
begin
if ord(cchinese[j])<>39 then
py:=py+cchinese[j];
inc(j,1);
end;
end;
result:=py;
end;

function tform1.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;
dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),nil,0,GCL_REVERSECONVERSION);
if dwGCL <= 0 then Exit;
dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),@szBuffer,dwGCL,GCL_REVERSECONVERSION);
if dwGCL > 0 then
begin
iStart := byte(szBuffer[24]);
for i := iStart to iStart do //iMaxKey * 2 do
begin
AppendStr(Result, szBuffer[i]);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(getfirstpy(edit1.text));
end;

end.
...全文
151 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxl 2003-03-11
  • 打赏
  • 举报
回复
再次感谢各位
请多讨论
fuyer 2003-03-10
  • 打赏
  • 举报
回复
这是我修改的代码:


unit Unit1;

interface

uses
imm,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
function getfirstpy(hz: string): string;
function QueryCompstr(hKB: HKL; const sChinese: AnsiString): string;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


function tform1.getfirstpy(hz : string ) : string;
var k : hkl;
j,ihandlecount : Cardinal;
pList: array[0..9] of HKL;
szImeName, szDescription: array[0..254] of char;
cchinese,py : string;
begin
Memo1.Lines.Clear;

iHandleCount := GetKeyboardLayoutList(10, pList);
for k := 1 to iHandleCount do
begin
if ImmEscape(pList[k], 0, IME_ESC_IME_NAME, @szImeName)>0 then
begin
Memo1.Lines.Add(szImeName);
ImmGetDescription(pList[k], szDescription, 254);
Memo1.Lines.Add(szDescription);

j:=1;
py:='';
while j<= strlen(pchar(hz)) do
begin
if ord(hz[j])>128 then
begin
cchinese:=hz[j]+hz[j+1];
py:=py+QueryCompStr(plist[k],pchar(cchinese));
inc(j,2);
end
else
inc(j,1);
end;

Memo1.Lines.Add(py);
end;
end;
end;

function tform1.QueryCompstr(hKB: HKL; const sChinese: AnsiString): string;
var
dwGCL: DWORD;
szBuffer: array[0..254] of char;
iMaxKey : integer;
pCL: PCandidateList ;
begin
Result := '';

// iMaxKey := ImmEscape(hKB, 0, IME_ESC_MAX_KEY, nil);
// if iMaxKey <= 0 then Exit;

// dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),nil,0,GCL_REVERSECONVERSION);
// if ( (dwGCL <= 0) or (dwGCL > 254) ) then Exit;

dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),@szBuffer,254,GCL_REVERSECONVERSION);
if dwGCL > 0 then
begin
pCL := PCandidateList(@szBuffer);
Result := Result + PChar( @(szBuffer[pCl.dwOffset[1]]) );
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
getfirstpy(edit1.text);
end;

end.



对“美丽”的测试结果:

五笔型
王码五笔型输入法 86 版
ugdugmy
五笔型
王码五笔型输入法 98 版
ugdugmy
智能 ABC
智能ABC输入法 5.0 版

微软拼音输入法
微软拼音输入法 3.0
mei3 li4
区位
增强区位输入法 5.1 版

区位
区位输入法 5.0 版

全拼
全拼输入法 5.0 版
meili



我的结论:
1、不是所有的输入法都能用API查出结果。
2、即使能够查出的,必须已经在当前线程Active过该输入法后才能查出。
3、楼主的coding style 还须改进:)




BigBen 2003-03-07
  • 打赏
  • 举报
回复
所谓的王码五笔版的,是他们自己编写的规范,不是标准的windows输入法。
当然是有可能从imm函数族得到编码的,输入法技术讨论组的,有一个巨牛的网站,
wwsys.51.net
duxbin 2003-03-07
  • 打赏
  • 举报
回复
我有个AutoWBPY.dll的文件,能够得到汉字的五笔和拼音编码
要的话,给我发个邮件:

duxbin@sohu.com
(有例程的)
lxl 2003-03-07
  • 打赏
  • 举报
回复
多谢各位!!

不过我试过全拼,它该是标准的windows输入法了吧?
以上的方法也不行
lxl 2003-03-06
  • 打赏
  • 举报
回复
那是当然!
我请客
:)
王集鹄 2003-03-06
  • 打赏
  • 举报
回复
过年回家~~也是匆匆而过~~
肠旺面、牛肉粉、豆腐果都没来得急吃~~
现在,流口水ing~~
今年,回去找你一起吃~~!
lxl 2003-03-06
  • 打赏
  • 举报
回复
呵呵
这个代码是很好的


但我还是想利用输入法来自动生成(现在还是用码表文件来查找的啊),
我想既然使用程序利用输入法查得到一个汉字的拼音编码,
但为什么不可以用“五笔86版”来得到一个汉字的五笔编码呢?

王集鹄 2003-03-06
  • 打赏
  • 举报
回复
这里有一个很牛的代码,看看~~
http://www.e-ren.com/bbs/showtopic.asp?TOPIC_ID=606&Forum_ID=7
王集鹄 2003-03-06
  • 打赏
  • 举报
回复
要不就来招狠的,自己做一个数据库~~这里可以得到~~
http://wangtie.533.net/pc-jiqiao/wbzd/1.htm
http://wangtie.533.net/pc-jiqiao/wbzd/2.htm
http://wangtie.533.net/pc-jiqiao/wbzd/3.htm
http://wangtie.533.net/pc-jiqiao/wbzd/4.htm
http://wangtie.533.net/pc-jiqiao/wbzd/5.htm
rh 2003-03-06
  • 打赏
  • 举报
回复
说实话真是不知道
帮大姐UP一下好拉
lxl 2003-03-06
  • 打赏
  • 举报
回复
奇怪,
这个问题没人知道?????
lxl 2003-03-05
  • 打赏
  • 举报
回复
请大家帮忙
lxl 2003-03-05
  • 打赏
  • 举报
回复
up
内容概要:本文研究油浸式变压器在不同气候条件下的能量极限问题,通过Matlab代码实现建模与仿真,深入分析环境温度、湿度等气候因素对变压器热稳定性、负载能力及运行安全性的影响,进而确定其在多种工况下的最大能量承载极限。研究采用多智能体方法提升模型的适应性与仿真精度,综合考虑热平衡方程与环境参数输入,旨在为变压器的设计优化、容量规划、动态负载管理及智能电网中的可靠性分析提供科学依据和技术支撑。; 适合人群:具备电力系统基础知识和Matlab编程能力,从事电气工程、能源系统仿真、电力设备设计等相关领域的科研人员与工程师,特别适合研究生及工作1-5年的专业技术人才; 使用场景及目标:①评估油浸式变压器在极端气候环境下的安全运行边界;②优化变压器的负载调度与能效管理策略;③支持智能电网背景下设备级动态容量规划与韧性电网建设;④为高可靠性供电系统的设计与运维提供理论参考; 阅读建议:学习者应结合提供的Matlab代码深入理解建模流程,重点掌握热传导模型构建、环境变量设定、多智能体协同机制及仿真参数调优方法,并通过调整气候条件进行多场景仿真实验,以深化对变压器能量极限形成机理的认知。
内容概要:本文系统研究了基于开关电容器的级联多电平逆变器在布尔PWM控制技术下的工作特性与仿真实现,深入分析该拓扑结构的工作原理、电容电压自平衡能力及其对输出波形质量的优化作用。通过Simulink平台构建完整的系统仿真模型,验证布尔PWM控制策略在抑制谐波畸变、提升直流电压利用率和改善输出电压精度方面的有效性,进一步探讨其在高效率、高电能质量要求的电力电子变换系统中的应用潜力,为新型多电平逆变器的设计与控制提供理论依据与技术支撑。; 适合人群:电气工程、自动化、电力电子与电力传动等相关专业的高校本科生、研究生,从事新能源发电、电机驱动及电力系统仿真的科研人员,以及具备MATLAB/Simulink基础并希望深入理解先进PWM控制技术的工程技术人员。; 使用场景及目标:①掌握开关电容器型级联多电平逆变器的结构优势与运行机理;②理解布尔PWM控制的基本原理及其在多电平调制中的独特优势;③通过Simulink仿真实践,掌握控制模型搭建、参数整定与仿真结果分析方法;④为开展高性能逆变器相关课题研究或实际工程项目提供可复现的技术参考与设计思路。; 阅读建议:建议读者结合Simulink模型进行同步操作,重点关注布尔逻辑调制信号的生成方式、开关器件的驱动时序设计及电容电压动态响应特性,对比传统载波PWM等调制方法的性能差异,深入理解控制策略对系统稳态与动态性能的影响。同时可进一步拓展学习空间矢量PWM(SVPWM)、最近电平逼近(NLC)等其他先进调制技术,以全面掌握多电平逆变器的控制体系。

5,941

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧