掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
幼音を認識するには? (ID:120322)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ここで終わっても中途半端だから… 結局のところ何がしたかったのかやっぱり分からないけど、 不具合の原因くらいは理解して無いと話は進まない… という事で考え方を少し解説。 >「きゃ」を「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
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.