IMEコンポーネントを使用してふりがなの表示モードをIntelligenceに指定したとき、コードから特定の文字列を設定すると、ふりがなが取得されない場合がある

文書番号 : 36456     文書種別 : 制限事項     登録日 : 2013/09/10     最終更新日 : 2014/10/17
文書を印刷する
対象製品
InputMan for Windows Forms 7.0J
発生環境
Microsoft Office IME 2007 SP2以降
詳細
IMEコンポーネントを使用して、ふりがなの取得元のコントロールのOutputModeプロパティをIntelligenceに指定したとき、ふりがなの取得元のコントロールのTextプロパティやAppendTextメソッドで特定の文字列を含む文字列をコードから設定すると、以下のような現象が発生する場合があります。
  • 「値を Null にすることはできません。 パラメーター名: collection」という例外が発生する場合があります。
  • TargetControlプロパティに指定したふりがなを表示するコントロールに、ふりがなが表示されません。
上記の現象が発生する文字列は、IMEのバージョンによって異なります。以下は、現象が発生する文字列の例です。

[Microsoft Office IME 2007 SP2]
"ほそだ"、"むたク"、"むたイ"など

[Microsoft Office IME 2010]
"ほそ"など

本現象はIMEコンポーネントが内部で使用しているMicrosoft IME APIの下記の動作に起因しているため、製品の制限事項となります。

GetJMorphResult メソッドを呼び出す際に、空の結果が返される場合がある
回避方法
この問題はService Pack 2(v7.0.2013.1127)で、ふりがなとして空の文字列が取得されたときに、例外が発生しないように改善されました。
これにより、Service Packの適用状況により、回避方法が異なります。

【Service Pack 1以前をご利用の場合】

ふりがなの取得元のコントロールにAppendTextメソッドを使用して文字列を設定し、ふりがなを表示するコントロールにコードからふりがなを設定します。
例外が発生する場合は、Try...Catchステートメントを使用して例外をキャッチし、Catchブロックでふりがなを表示するコントロールにふりがなを設定します。
以下のサンプルコードは、Try...Catchステートメントを使用して、"ほそだ"からふりがなを取得する例です。

[Visual Basic]
Try
    TextBox1.AppendText("ほそだ")
Catch ex As Exception
    TextBox2.AppendText("ホソダ")
End Try

[C#]
try {
    textBox1.AppendText("ほそだ");
} catch {
    textBox2.AppendText("ホソダ");
}

【Service Pack 2以降をご利用の場合】

IMEコンポーネントのResultStringイベントを使用して、空のふりがなが取得されたときに、ふりがなを表示するコントロールにコードからふりがなを設定します。
以下のサンプルコードは、ResultStringイベントで、"ほそだ"や"むた"が入力された場合にふりがな文字列を設定する例です。

[Visual Basic]
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' ResultStringイベントが発生するように設定します。
    GcIme1.SetCausesImeEvent(TextBox1, True)
End Sub

Private Sub GcIme1_ResultString(sender As Object, e As GrapeCity.Win.Editors.ResultStringEventArgs) Handles GcIme1.ResultString
    If e.ReadString = String.Empty Then
        Select Case TextBox1.Text
            Case "ほそだ"
                TextBox2.Text = "ホソダ"
            Case "むた"
                TextBox2.Text = "ムタ"
        End Select
    End If
End Sub

[C#]
private void Form1_Load(object sender, EventArgs e)
{
    // ResultStringイベントが発生するように設定します。
    gcIme1.SetCausesImeEvent(TextBox1, true);
}

private void gcIme1_ResultString(object sender, GrapeCity.Win.Editors.ResultStringEventArgs e)
{
    if (e.ReadString == string.Empty)
    {
        switch (textBox1.Text)
        {
            case "ほそだ":
                textBox2.Text = "ホソダ";
                break;
            case "むた":
                textBox2.Text = "ムタ";
                break;
            default:
                break;
        }
    }
}