テキストボックスの漢字をひらがなに戻すと言う、マヌケなプログラムを考えています。
実際ワープロソフトでは、
1 文字列(漢字)をハイライト
2 右クリック
3 メニューから「再変換(V)」を選択して変換リストを呼び出し、
4 その変換リストのメニューから「ひらがな(F6)」を選択する
以上の操作を自動化するのではと思っていますが、
アドバイスよろしくお願いします。
とりあえず、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とは意味が異なります。
魔界の仮面弁士さん、丁寧なレスありがとうございます。
私は(現在VB6です)
「案3) IFELanguageインターフェイスのGetPhoneticメソッドを使う」
で仮面弁士さんのライブラリを参考にさせて頂きたいと思います。
さて、 BS_MSIME.TLBは「MS-IME 98/2000用タイプライブラリ」とありますね。
今後もMS-IMEはどんどんバージョンアップしていく様ですが、
再変換機能があるMS-IME98以降ならOKでしょうか。
それともバージョンアップの度に、別途追加していく必要があるのでしょうか。
> さて、 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
現在ネットで調べていますが、
どうも「タイプライブラリ」と「IFELanguage」が良く理解できません。
申し訳ありませんが、簡単に教えて頂けないでしょうかm(_ _)m
> 「タイプライブラリ」と
タイプライブラリというのは、拡張子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
> 良く理解できません。
単純に「良く理解できません」とだけ書かれても、範囲が広すぎて、
何とも答えようが無いです。。。
各資料を読んでみた結果、その中のどの部分がわからなかったのを
具体的に教えていただけないでしょうか? 具体的な質問が貰えれば、
それぞれに関して、何らかの具体的な回答が出来るかも知れません。
魔界の仮面弁士さんへ
お手数をおかけして申し訳ありません。
私の疑問は単純でして、タイプライブラリと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
> 私の疑問は単純でして、タイプライブラリと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
魔界の仮面弁士さんへ
色々ご指導ありがとうございました。
私は先日「コピーした文字列の読み仮名を表示できる」ソフトをダウンロードし、
これは漢字の勉強に良い!と、自分で作れないものかと思案していました。
仮面弁士さんや他の方のお陰で完成しました。
(ただ、皆さんのコードを試行錯誤しながら組み合わせただけなので、良く理屈を理解していませんが)
Win32APIとかもっと勉強します。
今回はお世話になりました。
ツイート | ![]() |