幼音を認識するには?


さき  2005-03-17 20:47:43  No: 120318

初めて質問します。
VB.NET  超初心者です。
タイピングソフトを作成しています。
入力する文字は入力モード「ひらがな」変換モード「無変換」です。
テキストボックスに入力すると入力したキーをLabelに表示したいのです。
chr関数で「あ」〜「ん」など2つキーを使う文字は表示できたのですが、「きゃ」を「kya」など3つのキーを使う文字を入力すると「ゃ」しか表示されません。これを「きゃ」と表示する方法はあるのでしょうか?
どうか、教えて下さい。よろしくお願いします。


特攻隊長まるるう  2005-03-17 22:28:07  No: 120319

>「あ」〜「ん」など2つキーを使う文字は表示できたのですが、
>「きゃ」を「kya」など3つのキーを使う文字を入力すると
入力する(全角)英小文字をキーと呼んでるとして「あ」は「a」で1つキーでは???
1つキーと2つキーの処理ができてるなら3つキーも同じだと思うけど…。
>「ゃ」しか表示されません。これを「きゃ」と表示する方法はあるのでしょうか?
表示しているのは自分なんでしょ?「ゃ」と表示できるなら「き」と「ゃ」を
表示するだけにしか考えられません。chr関数が何故必要なのかも不明。

申し訳ないですがどういった処理を行ってるのか分かるサンプルコードを
提供していただけないでしょうか?。


さき  2005-03-17 22:45:12  No: 120320

特攻隊長まるるうさん、ありがとうございます。
また、うまく表現できなくて申し訳ありません。

入力方法はローマ字入力なので、2つキーを使うと書きました。
chr関数は必要ないと書いてあったので、取り除きました。
コードはこんな感じなのですが・・・
よろしくお願いします。

 Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress

        Dim Nyuryoku As String
        Dim mozi As String
         
        Nyuryoku = TextBox2.Text

        mozi = e.KeyChar
 
        Label2.Text = mozi


特攻隊長まるるう  2005-03-18 00:07:06  No: 120321

>chr関数は必要ないと書いてあったので、取り除きました。
え゛?ボクが書いたの?必要ないかどうかも分からなかったんですが?
さきさんが必要としてるなら理由を説明してくだされば…。

で、これはテキストボックスへの
>入力する文字は入力モード「ひらがな」変換モード「無変換」です。
具体的には「きゃ」だとして、
>「ゃ」しか表示されません。これを「きゃ」と表示する方法はあるのでしょうか?
出力も「きゃ」なわけ?…なんの目的なんだろう???この処理は。…まぁいいか(汗)
    Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        Me.Label2.Text = Me.TextBox2.Text
    End Sub

ラベルにどんどん入力した文字が追加されれば良いのかな?
    Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        Me.Label2.Text = Me.Label2.Text & Me.TextBox2.Text
        Me.TextBox2.Text = ""
    End Sub

何がしたいのか、入力と出力結果の具体的な例を交えて説明して下さい。


特攻隊長まるるう  2005-03-23 21:39:46  No: 120322

ここで終わっても中途半端だから…

結局のところ何がしたかったのかやっぱり分からないけど、
不具合の原因くらいは理解して無いと話は進まない…
という事で考え方を少し解説。
>「きゃ」を「kya」など3つのキーを使う文字を入力すると「ゃ」しか表示されません。
これは何故か?ソースで言うと
>        mozi = e.KeyChar
の部分だけど、確かに文字として「ゃ」しか取得できてません。
じゃあ「き」はドコに?
こんな場合は…というかどんな場合でもステップ実行しないと
分からない場合が多いんだけど…自称初心者はここを省く。…それ
じゃ何時まで経っても分からないよ…と思えるのがプログラマ
として成り立つかどうかの分かれ道。ステップ実行しないモノは
プログラマでは無い。…などとまた言い切ってみたりするw。
…上級者でもステップ実行はしてると思うですがにぁ…。

で、イベントなんかはプログラムを止めて1行ずつ見てると
順番が入れ替わってしまい、予定(:program)通りの動きを
しない場合があります。ですからブレークポイントやメッセージ
ボックスで止めたりしません。Debug.WriteLine で出力
したり(デバッグ時)、ログファイルにテキスト出力して確認
(EXE実行時)するわけです。

さて、ヘルプにもイベントの起こる順番とか書いてあったりします。
…が、実際に動かして自分の目で確かめる事を推奨します。一度、
そのコントロールに用意されている全てのイベントに
   Debug.WriteLine "イベント名"
だけ書いてどんな時にどんなイベントが何回起こってるのか?
調べてみましょう。勉強になります。

さて、今回の場合、
    Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
        Debug.WriteLine("KeyPress " & e.KeyChar)
    End Sub
でひらがな入力「きゃ(kya)」を実行した結果は
KeyPress き
KeyPress ゃ

行方不明だった「き」が見つかりましたw。
…まぁ、もともと KeyPress で処理しようというのもナンですが…
そこは(面白そうなので)質問者のアイデアを優先するとして、2回
起こってるイベントの内容を保持しておかないと…という結論になります。

ついでに問題点をいくつか…。
・全てのキーを調べていませんが、ボクの環境では[Backspace]キーで
KeyPress イベントが発生してしまいます。出力は…(?)
・拗音の入力…だけを考える…という仕様なのか?という部分で
「ゃ(lya)」とか「ぁ(la)」とかだけを直接入力されたら
どうするのか?
・テキストボックスの入力制限などでよく出てくるけど、コピペ
されたらどうするのか?

…といった具合に決めてもらわないといけない事がたくさんあったり
します。あとはアイデアしだいですねぇ。こーゆー処理を見た事が
ありません。自分で考えるしか無いでしょう。回答は1つではない
…というか結局どんな動きが理想なのか予想できませんが、1つの
例という事で。思い付くまま書いたので改良点、及び別のアプローチ
のレス歓迎。…使い道あるのか?ってツッコミ不可。
[VB.NET]
    Private mMojiStack As String = ""
    Private mNyuryokuCount As Integer
    Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
        If Not Char.IsControl(e.KeyChar) Then
            Debug.WriteLine("KeyPress " & e.KeyChar)
            Me.mMojiStack = Me.mMojiStack & e.KeyChar
        Else
            Debug.WriteLine("KeyPress Ctrl(" & Asc(e.KeyChar) & ")")
            Me.mMojiStack = " "
        End If
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        Debug.WriteLine("TextChanged " & Me.TextBox2.Text)
        If Me.mMojiStack.Length <> 0 Then
            Me.Label2.Text = Trim(Me.mMojiStack)
            Me.mNyuryokuCount = Me.mMojiStack.Length - 1
            Me.mMojiStack = ""
        Else
            If Me.mNyuryokuCount <= 0 Then
                Me.Label2.Text = Trim(Me.TextBox2.Text)
            Else
                Me.mNyuryokuCount = Me.mNyuryokuCount - 1
            End If
        End If
    End Sub


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

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






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