- PR -

TextBoxでTAB入力を検出できたでしょうか?

1
投稿者投稿内容
seai
ベテラン
会議室デビュー日: 2007/04/10
投稿数: 60
投稿日時: 2007-12-26 10:21
おはようございます。
seaiです。

久々にVB6.0をいじることになったのですが
TextBoxでTAB入力を検出できたでしょうか?

OCRを使用する設備があります。OCRから送られてくる文字列を
TextBoxに取り込んで処理するプログラムがあります。
その文字列の終端として今までのOCRは[CR]が付加されていたのですが
故障してしまったので在庫品と交換したのですが[TAB]が付加されていました。
プログラムは終端文字の入力を検出して処理を開始しています。
TABは通常フォーカスの移動になると思い付加される終端文字を変えたいのですが
OCRが古すぎてマニュアルも見つからない状態なので変えることができません。
プログラムの修正で対応することになったのですが

交換前の文字列(例:"ABCDEFG"+[CR])はKeyDownイベントで
終端文字[CR]を検出できていました。
交換後の文字列(例:"ABCDEFG"+[TAB])はKeyDownイベントで
終端文字[TAB]を検出できませんでした。

プログラムを実行する設備はWindows2000-SP4です。
開発用のPCはWindowsXP-SP2です。
何か見落としがあるのでしょうか?
ご教示のほどよろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-26 10:46
Tab が入っていることを検証するだけならば普通にできます。 実際に Tab 文字が入っていないだけではないのでしょうか。

コード:

    Private Sub Command1_Click()
        Me.Text1.Text = "123" & vbTab
        Call MsgBox(CStr(InStr(1, Me.Text1.Text, vbTab)))
    End Sub


普通に InStr 関数で検知可能です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
seai
ベテラン
会議室デビュー日: 2007/04/10
投稿数: 60
投稿日時: 2007-12-26 11:57
じゃんぬねっとさん
早速の返信ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2007-12-26 10:46) より:
Tab が入っていることを検証するだけならば普通にできます。 実際に Tab 文字が入っていないだけではないのでしょうか。

コード:

    Private Sub Command1_Click()
        Me.Text1.Text = "123" & vbTab
        Call MsgBox(CStr(InStr(1, Me.Text1.Text, vbTab)))
    End Sub


普通に InStr 関数で検知可能です。





TABは入っています。メモ帳に取り込んで確認してあります。
きちんとカーソル位置の前にTABが入っています。
ご提示の関数でTAB検出可能なのはわかるのですが、
TextBoxにTABキーが打ち込まれた時に処理をさせたいのです。

OCRからの入力はキーボードエミュレーションなので
常にText1にフォーカスを当てて入力を受け付けられるようにして、
終端文字の検出は以下の様に行おうとしています。

コード:
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = &HD Or KeyCode = &H9 Then   '終端文字の検出
        call DataSyori
    End If
End Sub


「OCRからTABが送られる」=「TABキーを押す」ということで
Text1にフォーカスを当ててキーボードのTABキーを押しても
KeyDownイベントが発生してくれません。
[CR]なら発生していましたので・・・

要はTextBoxで文字列の入力を受けて最後にTABキーが押された
(OCRからTABコードが届いた)ということを検出したいのです。

どうかよろしくお願いします。
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2007-12-26 12:55
こんにちは。

VB6ではTabキーの操作はKeyDownイベント、KeyPressイベントでは検出されません。
Validateイベントなどで代替処理をしてください。

[追記]
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200612/200612_06120048.html
こちらでも書かれてますが、マニュアルに載ってます。
#オンラインでのMSDNを探しきれませんでした・・・

[ メッセージ編集済み 編集者: J.J. 編集日時 2007-12-26 14:43 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-26 13:21
引用:

seaiさんの書き込み (2007-12-26 11:57) より:

ご提示の関数でTAB検出可能なのはわかるのですが、
TextBoxにTABキーが打ち込まれた時に処理をさせたいのです。


あ、そういうことですか。 ならば、Tab がデータとして入っているのと今回の質問とは直接は関係ないということですね。

引用:

Text1にフォーカスを当ててキーボードのTABキーを押してもKeyDownイベントが発生してくれません。


うーん、反応してくれるハズです。

コード:

    Private Sub Text1_KeyDown(ByRef KeyCode As Integer, ByRef Shift As Integer)
        If KeyCode = vbKeyTab Then
            Dim stText As String
            stText = Me.Text1.Text

            Dim lSelectionStart As Long
            lSelectionStart = Me.Text1.SelStart

            Me.Text1.Text = Left$(stText, lSelectionStart) & vbTab & Mid$(stText, lSelectionStart + 1)
            Me.Text1.SelStart = lSelectionStart + 1
        End If
    End Sub


これで AcceptsTab な TextBox ができるハズなので。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
seai
ベテラン
会議室デビュー日: 2007/04/10
投稿数: 60
投稿日時: 2007-12-26 15:43
じゃんぬねっとさん
返信ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2007-12-26 13:21) より:

コード:
    Private Sub Text1_KeyDown(ByRef KeyCode As Integer, ByRef Shift As Integer)
        If KeyCode = vbKeyTab Then
            Dim stText As String
            stText = Me.Text1.Text

            Dim lSelectionStart As Long
            lSelectionStart = Me.Text1.SelStart

            Me.Text1.Text = Left$(stText, lSelectionStart) & vbTab & Mid$(stText, lSelectionStart + 1)
            Me.Text1.SelStart = lSelectionStart + 1
        End If
    End Sub


これで AcceptsTab な TextBox ができるハズなので。


早速ご提示のコードで確認してみました。
FormにTextBoxを1個だけ貼り付けたて確認したところ
確かにKeyDownイベントでTABキーを受け付けてくれました。

そこで、現在修正中のプログラムに適用してみたのですが
うまくいきません。単独の場合と何か違うところがないか
探してみたところフォーカスを受け取れるコントロールで複数あり
TabStopプロパティーがTrueになっているものが1つだけありました。
そのプロパティーをFalesにしたところKeyDownイベントでTABキーを
受け付けてくれるようになりました。

特定のTextBoxでTabキーのKeyDownイベントを発生させたいときには
フォーカスを受け取れる他のコントロール全てのTabStopプロパティーを
Falseにしなければならないということでよろしいのでしょうか?


J.Jさん

情報ありがとうございます。
引用:

VB6ではTabキーの操作はKeyDownイベント、KeyPressイベントでは検出されません。
Validateイベントなどで代替処理をしてください。

[追記]
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200612/200612_06120048.html
こちらでも書かれてますが、マニュアルに載ってます。
#オンラインでのMSDNを探しきれませんでした・・・



フォーム上ではそのようですね。

何はともあれこれで設備の修正が一歩前進しました。
ありがとうございました。

nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2007-12-26 16:50
引用:

seaiさんの書き込み (2007-12-26 15:43) より:
FormにTextBoxを1個だけ貼り付けたて確認したところ
確かにKeyDownイベントでTABキーを受け付けてくれました。


そういうことか・・・orz
私のほうではTextBoxを複数配置して検証してたので「検出できねえじゃん」とか思ってました。
フォーカスが移動できない状態であれば検出できるようですね。(^_^;

引用:

特定のTextBoxでTabキーのKeyDownイベントを発生させたいときには
フォーカスを受け取れる他のコントロール全てのTabStopプロパティーを
Falseにしなければならないということでよろしいのでしょうか?


Tabキーの性質を考えるとそうなんじゃないでしょうか。
もしくは、前述しましたがValidateイベントを使うとか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-26 17:42
少々意地悪だったかもしれませんね...
Windows Message を取る方法もありますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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