- PR -

ひらがなをカタカナに自動的に変換する。

投稿者投稿内容
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-11-26 20:04
初めて投稿させていただきます。
私が今やりたいことは、まず一つのテキストボックスに東京都とかくともう一つのテキストボックスに自動的にトウキョウトとカタカナで表示されるというものです。
どう変換していいのかわからなかったので質問させていただきました。
勿論、東京都という文字を"とうきょうと"と打って変換させるのではなく、"ひがしきょうと"と打って変換したら漢字のほうは東京都でもカタカナのほうはヒガシキョウトとなって一向に構いません。
教えていただきたいです。よろしくお願いいたします。
TEA-BREAK
会議室デビュー日: 2003/11/16
投稿数: 10
投稿日時: 2003-11-27 01:46
こんにちは、TEA-BREAKと申します。

思いつきですが、KeyPressを組み合わせて出来るのかな?
押された文字を記憶しておき、Enterが押されたときに、コード変換かけて
カタカナで表示してあげるなど出来ませんかね?
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-11-27 06:47
TEA-BREAKさん早々の返信ありがとうございます!
keypressで保存しておいてっていうのはわかったんですけど、
どうやってカナにコード変換するのかが調べてみたのですがわかりません・・・。
もしヒントなどありましたら教えていただけますでしょうか?
よろしくお願いいたします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-27 07:37
こんにちわ。諸農です。

引用:

hirokoさんの書き込み (2003-11-26 20:04) より:
私が今やりたいことは、まず一つのテキストボックスに東京都とかくともう一つのテキストボックスに自動的にトウキョウトとカタカナで表示されるというものです。



「ひらがなをカタカナに」ではないですね(^^;
IMEをトラップする必要があるのではないでしょうか。
WM_IME_COMPOSITIONメッセージでGCS_RESULTREADSTRのパラメータの時に
ImmGetCompositionStringで文字列を取得する、見たいな方法かしら。
詳しくはMSDNなどで調べてみてはいかがでしょうか。

ではでは(^^)/

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2003-11-27 07:38 ]
TEA-BREAK
会議室デビュー日: 2003/11/16
投稿数: 10
投稿日時: 2003-11-28 22:46
返事が遅くなり申し訳ありません。

諸農さんが言われているようにIMEをトラップして、変換をかける方法が
できるのであれば、そちらの方が良いと思われます。

かなり格好は悪いとは思いますが、私が思ったのは、押されたキーを
保持しておきます。
それをCASE文で、変換をかけるというものです。

例えば、"明日"と入力されたとします。
入力されたキーは『ASITA』になりますよね。
まず一文字目がAなので母音の場合は変換。(CASE文でAの場合は"ア"に変換)
次を見てSなので、そのまま保持。
その次をみてIなので変換(CASE文でSIの場合は"シ"に変換)
以下、くりかえし。

汚いとは思いますが、それしか思いつきませんでした・・・。
hiroko
常連さん
会議室デビュー日: 2003/11/26
投稿数: 23
投稿日時: 2003-11-29 02:16
諸農さん、TEA-BREAKさん返信ありがとうございました。
IMEをトラップの件、調べてみたのですが、資料が出てこなくて、
今度書店にでも行ってみようと思います。
CASE文で変換という手段、教えていただいてありがとうございます。
いろいろ考えた結果、もしIMEをトラップというのが可能であれば、そうします。
もし不可能なら、あきらめようと思います。
ご意見ありがとうございました。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2003-11-29 12:04
IMEと直接対話するときは現状ではWindowsAPIを叩きます。

http://www.kumei.ne.jp/c_lang/
ここのページの
http://www.kumei.ne.jp/c_lang/sdk3/sdk_278.htm
http://www.kumei.ne.jp/c_lang/sdk3/sdk_279.htm
http://www.kumei.ne.jp/c_lang/sdk3/sdk_280.htm
http://www.kumei.ne.jp/c_lang/sdk3/sdk_281.htm
http://www.kumei.ne.jp/c_lang/sdk3/sdk_282.htm
http://www.kumei.ne.jp/c_lang/sdk3/sdk_283.htm

この辺が役に立つと思います。ちなみにネイティブDLLの叩き方はここのTipsにもありますし、わからないなら適当に探してください。

ちょっと雑談。

引用:

例えば、"明日"と入力されたとします。
入力されたキーは『ASITA』になりますよね。
まず一文字目がAなので母音の場合は変換。(CASE文でAの場合は"ア"に変換)
次を見てSなので、そのまま保持。
その次をみてIなので変換(CASE文でSIの場合は"シ"に変換)
以下、くりかえし。



仮名打ち派としてそれは困ると突っ込んでおこうと思います
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-29 12:30
こんにちわ。諸農です。

引用:

hirokoさんの書き込み (2003-11-29 02:16) より:
諸農さん、TEA-BREAKさん返信ありがとうございました。
IMEをトラップの件、調べてみたのですが、資料が出てこなくて、
今度書店にでも行ってみようと思います。



ちょっと時間があったので、TextBox継承で作ってみました。
このクラスは、IMEで確定された文字のフリガナを取得して、
それをイベントとしてアプリケーションに通知します。
アプリケーションはイベントを通じてフリガナ文字を取得します。
エベントハンドラーデリゲートとイベント引数クラスは
このクラス用に新規で定義しています。

コード:
using System;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace MyTextBox
{
    public class TextBoxEx :TextBox
    {
        const int WM_IME_COMPOSITION = 0x010F;
        const int GCS_RESULTREADSTR = 0x0200;

        [DllImport("Imm32.dll")]
        public static extern int ImmGetContext(IntPtr hWnd);
        [DllImport("Imm32.dll")]
        public static extern int ImmGetCompositionString(
            int hIMC,
            int dwIndex,
            StringBuilder lpBuf,
            int dwBufLen 
            );
        [DllImport("Imm32.dll")]
        public static extern bool ImmReleaseContext(IntPtr hWnd,int hIMC);

        [Serializable]
        public class CompositionEventArgs:EventArgs
        {
            public string ImeStr;
        }
        public delegate void CompositionEventHandler(object sender,CompositionEventArgs e);
        public event CompositionEventHandler CompositionEvent;

        protected override void WndProc(ref Message m)
        {
            if (CompositionEvent != null && m.Msg == WM_IME_COMPOSITION)
            {
                if (((int)m.LParam & GCS_RESULTREADSTR)>0)
                {
                    int Imc = ImmGetContext(this.Handle);
                    int sz = ImmGetCompositionString(Imc,GCS_RESULTREADSTR,null,0);
                    StringBuilder str = new StringBuilder(sz);
                    ImmGetCompositionString(Imc,GCS_RESULTREADSTR,str,str.Capacity);
                    ImmReleaseContext(this.Handle,Imc);
                    CompositionEventArgs args = new CompositionEventArgs();
                    args.ImeStr = str.ToString();
                    CompositionEvent(this,args);
                }
            }
            base.WndProc(ref m);
        }
    }
}



このクラスをWindowsアプリケーションで使います。
以下のコードを実行すると、フォームの左上に上記で作成した
フリガナ取得可能なTextBoxクラスが配置されます。
IMEを起動して、日本語文字を入力し、入力文字を確定した時点で
イベントが発動されるので、イベント内でラベルにフリガナをセットしています。

コード:
        private void CompoEvent(object sender, TextBoxEx.CompositionEventArgs e)
        {
            label1.Text += e.ImeStr;
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            TextBoxEx tb = new TextBoxEx();
            tb.Name = "textBoxEx1";
            tb.Text = "textBoxEx1";
            tb.CompositionEvent += 
                         new TextBoxEx.CompositionEventHandler(this.CompoEvent);
            this.Controls.Add(tb);

        }



こんな感じで、半角カナのフリガナを取得することが出来ます。

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

スキルアップ/キャリアアップ(JOB@IT)