テキストボックスの漢字をひらがなに戻すには

解決


ひろ  2003-09-16 11:18:07  No: 108688

テキストボックスの漢字をひらがなに戻すと言う、マヌケなプログラムを考えています。
実際ワープロソフトでは、
1  文字列(漢字)をハイライト
2  右クリック
3  メニューから「再変換(V)」を選択して変換リストを呼び出し、
4  その変換リストのメニューから「ひらがな(F6)」を選択する
以上の操作を自動化するのではと思っていますが、
アドバイスよろしくお願いします。


魔界の仮面弁士  2003-09-16 14:38:07  No: 108689

とりあえず、VB6/VBAと仮定して回答します。
VB.NETの場合は、適宜読み替えてください。

> 3  メニューから「再変換(V)」を選択して変換リストを呼び出し、
変換リストを表示させるだけの方法と、
リストを表示させず、変換結果だけを得る方法とがあります。

まずは前者の、変換リストを表示させる方法から———。

案1) RichTextBoxに対して、EM_RECONVERSIONメッセージを送信する。
案2) 再変換メッセージを使う。

案1は、下記が参考になるでしょう。比較的容易に実装できると思います。
http://vbvbvb.com/jp/gtips/0451/gSendMessageEmReconversion.html

ただし、RichTextBoxでしか使えないという制限が付きます。

案2の方法は、OS共通の再変換メッセージを使う方法と、
IME固有の再変換メッセージを使う方法とがあります。

以前は、古市さんのサイト(Stadt Homepage)に解説があったのですが、現在はサイトが
閉鎖されているようなので、Internet Archiveの方を参照してみてください。
http://web.archive.org/web/20011005222104/www.netlaputa.ne.jp/~stadt/vb/p22_imereconv/imereconv.htm
http://web.archive.org/web/20011102034008/www.netlaputa.ne.jp/~stadt/vb/t12_ime/reconvert.htm

——つづいて後者の、再変換結果を直接得る方法です。

案3) IFELanguageインターフェイスのGetPhoneticメソッドを使う。
案4) Microsoft ExcelのGetPhoneticメソッドを使う。

案3は、MS-IME98以上に実装されている、読み仮名取得機能です。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnime/html/felang2fnc.asp

ただしこの方法を使う場合は、別途タイプライブラリを作成する必要があります。
# 下記は、大昔に作成した拙作のライブラリですが、未完のまま放置状態…。
http://www.ocv.ne.jp/~oratorio/windev/vb/BS_MSIME.LZH

案4は、Excel 2000以上に実装されている、読み仮名取得機能です。
具体的には、以下のようにして利用します。
  Set X = CreateObject("Excel.Application")
  MsgBox X.GetPhonetic("魔界の仮面弁士")
  Set X = Nothing
この機能を使うには、Excel 2000またはExcel 2002が必要です。(Excel 2003は未検証)

# ちなみにExcel 97の場合は、PhoneticオブジェクトやPHONETICワークシート関数にて、
# 読み仮名を得る事ができますが、これは既に入力された読み仮名を得るものであり、
# GetPhoneticとは意味が異なります。


ひろ  2003-09-16 21:51:03  No: 108690

魔界の仮面弁士さん、丁寧なレスありがとうございます。
私は(現在VB6です)
「案3) IFELanguageインターフェイスのGetPhoneticメソッドを使う」
で仮面弁士さんのライブラリを参考にさせて頂きたいと思います。

さて、 BS_MSIME.TLBは「MS-IME 98/2000用タイプライブラリ」とありますね。
今後もMS-IMEはどんどんバージョンアップしていく様ですが、
再変換機能があるMS-IME98以降ならOKでしょうか。
それともバージョンアップの度に、別途追加していく必要があるのでしょうか。


魔界の仮面弁士  2003-09-16 23:03:21  No: 108691

> さて、 BS_MSIME.TLBは「MS-IME 98/2000用タイプライブラリ」とありますね。
MS-IME98当時に(見よう見まねで)作ったので、そう書いてあります。(^^ゞ

その後の動作検証で、MS-IME2000でも動いたようなので、MS-IME 2000の名も列挙してあります。
が、MS-IME 2000当時の【 MSIME.H 】を参照して作ったわけではありませんので、この内容が
本当に正しいタイプライブラリになっているかどうかは、全くの未確認です。

> 再変換機能があるMS-IME98以降ならOKでしょうか。
Microsoftの仕様的には、MS-IMEがバージョンアップしても、おそらく、
IFELanguage.GetPhoneticメソッドを使うことができると思われます。

しかし私のライブラリは、MS-IMEのインターフェイスの一部しか定義してありませんので、
この BS_MSIME.TLB が、今後も利用できるかどうかまでは保証できません。
一応、ソース(*.ODL)も付けてありますので、使用するならば自己責任でお願いします。

なお、MS-IME 2003に対応した最新版の【 MSIME.H 】ファイルは、下記にあります。
http://msdn.microsoft.com/library/en-us/dnime/html/msime.asp


ひろ  2003-09-18 04:55:38  No: 108692

現在ネットで調べていますが、
どうも「タイプライブラリ」と「IFELanguage」が良く理解できません。
申し訳ありませんが、簡単に教えて頂けないでしょうかm(_ _)m


魔界の仮面弁士  2003-09-18 09:10:27  No: 108693

> 「タイプライブラリ」と
タイプライブラリというのは、拡張子TLBやOLBなどのファイルであり、
「参照設定」して使う代物です。

K.J.K.さんの言葉をお借りすれば、
  『関数・定数・構造体・COMインターフェースなどを 
    定義するファイル・リソースの総称』
という事になりますね。
http://www.koalanet.ne.jp/~akiya/vbtaste/tlb/

ただし残念ながら、その内容は、数行程度で簡単に教えられるほど
単純な代物ではなかったりします。
# というよりも、私自身、人に教えられるほど詳しくは無いので。。。

———という事で、タイプライブラリについては他の人の回答を期待。(^^;

> 「IFELanguage」が
手抜きな回答で申し訳ありませんが、IFELanguageについては、
先述の米MSDNサイトを参照してください。これが公式の資料なので…。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnime/html/felang2fnc.asp

> 良く理解できません。
単純に「良く理解できません」とだけ書かれても、範囲が広すぎて、
何とも答えようが無いです。。。

各資料を読んでみた結果、その中のどの部分がわからなかったのを
具体的に教えていただけないでしょうか? 具体的な質問が貰えれば、
それぞれに関して、何らかの具体的な回答が出来るかも知れません。


ひろ  2003-09-18 22:16:10  No: 108694

魔界の仮面弁士さんへ
お手数をおかけして申し訳ありません。
私の疑問は単純でして、タイプライブラリとDLLはどう違うのかなと。
VBの「プロジェクト」メニューから「参照設定」がありますよね。
あそこから仮面弁士さんのBS_MSIME.TLBを設定していますが、
あれはDLLを設定するものだと思っていましたので…

それからIFELanguageですが、他のサイトで以下のコードを見つけました。

Private Sub Command1_Click()
    Dim objIME98 As New MSIMEJPN
    Dim objIME As IFELanguage

    Set objIME = objIME98

    objIME.Open
    'Text1の文字列を読み仮名に変換しText2にセット
    Text2.Text = objIME.GetPhonetic(Text1.Text)
    objIME.Close
End Sub

IFELanguageとはMSIMEタイプライブラリの中にある関数と言う事でしょうか。
トンチンカンな質問でしたら、どうぞ笑って許してくださいm(_ _)m


魔界の仮面弁士  2003-09-19 01:02:47  No: 108695

> 私の疑問は単純でして、タイプライブラリとDLLはどう違うのかなと。

DLLには、幾つかの種類がありますよね。

moricon.dll のような、(アイコン等の)リソースライブラリの物もあれば、
System.Data.dll のように、.NET用のコンポーネントになっているものもあり、
gdi32.dll のように、(Declare等で使えるように)関数を外部公開しているものや、
scrrun.dll のように、参照設定して使える というものもありますし、
あるいは、それらを複合した物もあるわけです。

> あれはDLLを設定するものだと思っていましたので…

ActiveX DLLの多くは、その中にタイプライブラリ情報を含んでいるのです。

例えば、VB6で作成した Project1.DLL があり、それには Class1 という
クラスを含めていたとします。その場合、このDLLの中には、
Class1が行う、実際の処理内容(実装)が書かれているのと同時に、
それに関連する「タイプライブラリ情報」も、一緒に埋め込まれています。

この場合のタイプライブラリには、"Class1"というCOM クラスに対する、
インターフェイスの定義について記されています。
# VB6は、Class1クラスのインターフェイス名として、内部的に
# 先頭に _ を付けた "_Class1"という形式の名前を使います。

しかし中には、クラスの定義を記した「タイプライブラリ」情報しか持たず、
実装部分すなわち実際の処理内容については、別のファイルに定義されて
いる事もあります。 そして、そうした単独のタイプライブラリの一つが、
今回使っていた *.TLB というファイルだったりするわけです。

> IFELanguageとはMSIMEタイプライブラリの中にある関数と言う事でしょうか。
関数ではなく、『インターフェイス』です。
インターフェイス(Interface)という用語について、調べてみてください。

インターフェイスとは、プロパティ、メソッド、およびイベントの特性を
記述した物です。(そして、それらの実装を記載したものがクラスです)

VB.NETではインターフェイスを独自定義できますが、VB6には、インターフェイスを
定義する機能がありませんので、ODL(オブジェクト定義言語)などで、
タイプライブラリファイルを作り、それを参照設定する必要があるわけです。

# トンチンカンな回答でしたら、どなたかフォローしてください。m(_ _)m


ひろ  2003-09-19 11:13:37  No: 108696

魔界の仮面弁士さんへ
色々ご指導ありがとうございました。
私は先日「コピーした文字列の読み仮名を表示できる」ソフトをダウンロードし、
これは漢字の勉強に良い!と、自分で作れないものかと思案していました。
仮面弁士さんや他の方のお陰で完成しました。
(ただ、皆さんのコードを試行錯誤しながら組み合わせただけなので、良く理屈を理解していませんが)
Win32APIとかもっと勉強します。
今回はお世話になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加