📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, msime;
type
TForm1 = class(TForm)
Button1: TButton;
EditText: TEdit;
MemoOutput: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ActiveX, ComObj;
procedure TForm1.Button1Click(Sender: TObject);
var
vGuid: TGUID;
vFELanguage: IFELanguage;
vError: Integer;
vCaps: DWORD;
vOutput: PMORRSLT;
W: WideString;
vPinYin: WideString;
S: WideString;
I: Integer;
iMonoRubyPos: WORD;
iReadIdxWDD: WORD;
vMonoRubyPos: PWORD;
vReadIdxWDD: PWORD;
begin
MemoOutput.Clear;
if CLSIDFromString(PWideChar(WideString('MSIME.China')), vGuid) <> S_OK then
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
vError := CoCreateInstance(vGuid, nil, CLSCTX_SERVER,
IFELanguage, vFELanguage);
if vError <> S_OK then
begin
ShowMessage(SysErrorMessage(vError));
Exit;
end;
vError := vFELanguage.Open;
if vError <> S_OK then
begin
ShowMessage(SysErrorMessage(vError));
Exit;
end;
vCaps := 0;
vError := vFELanguage.GetConversionModeCaps(@vCaps);
if vError <> S_OK then
begin
ShowMessage(SysErrorMessage(vError));
Exit;
end;
vOutput := nil;
W := EditText.Text;
vError := vFELanguage.GetJMorphResult(FELANG_REQ_REV,
FELANG_CMODE_PINYIN or FELANG_CMODE_NOINVISIBLECHAR,
Length(W), PWideChar(W), nil, @vOutput);
if vError <> S_OK then
begin
ShowMessage(SysErrorMessage(vError));
Exit;
end;
if not Assigned(vOutput) then Exit;
vPinYin := Copy(vOutput^.pwchOutput, 1, vOutput^.cchOutput);
MemoOutput.Lines.Add('=' + vPinYin);
vMonoRubyPos := vOutput^.paMonoRubyPos;
vReadIdxWDD := vOutput^.pchReadIdxWDD;
iReadIdxWDD := 1;
iMonoRubyPos := vMonoRubyPos^ + 1;
Inc(vMonoRubyPos);
I := 1;
while I <= Length(W) do
begin
while I <= vReadIdxWDD^ do
begin
Inc(I);
if I > vReadIdxWDD^ then
begin
S := Copy(vPinYin, iMonoRubyPos, vMonoRubyPos^ - iMonoRubyPos + 1);
if S <> '' then
S := Copy(W, iReadIdxWDD, I - iReadIdxWDD) + '(' + S + ')'
else S := Copy(W, iReadIdxWDD, I - iReadIdxWDD);
MemoOutput.Lines.Add(S);
iReadIdxWDD := I;
iMonoRubyPos := vMonoRubyPos^ + 1;
Break;
end;
Inc(vReadIdxWDD);
Inc(vMonoRubyPos);
end;
Inc(vReadIdxWDD);
Inc(vMonoRubyPos);
end;
CoTaskMemFree(vOutput); // 释放资源
vFELanguage.Close;
vFELanguage := nil;
end;
initialization
CoInitialize(nil);
finalization
CoUninitialize;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -