⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 这篇文档是讲如何利用IFELanguage接口实现对中文语句的分隔
💻 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 + -