- ベストアンサー
TextBoxのプログラムについて
氏名:Text1 に氏名を入力しデータベースを検索 (1)Text1に入力がない場合、エラーメッセージを表示し再入力 入力されていた場合 (2)データがあった場合には、顧客コード:Text2は入力不可 (3)データがない場合に、顧客コード:Text2は入力可 という風にしたいとします。 1.[Enter]を押されたら、Text2が入力可ならText2へ 不可ならText3へ 2.[TabIndex]はText1:1 Text2:2 Text3:3になっているとし 3.マウスで項目移動できる 4.終了ボタンで終了することができる という操作をしたい場合に、どのイベントにどういう内容をコーディングしたらいいのでしょう? 他の質問に答えていて、ちょっと不安になりました。 皆さんの方法を教えてください。 できれば、Text1でコーディングするすべてのイベントについて知りたいのです。 また、こういう仕様の方がよいというアドバイスでも結構です。 特に入力チェックのタイミングを教えて頂ければと思います。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
VBをインストールしてしまった・・・ 最近プログラミングをしていないので、練習がてらにやってみたくなったので・・・ 例で挙げていたコントロールは、TABSTOPを無視する完全なバグコントロールが無かったし、プチバグ持ちのコマンドボタンも一つなので、フックする必要は無いですね^^ ※※※※重要:全てのTABSTOP=FALSE※※※※ 構成 Form1 ├Text1 ├Text2 ├Text3 └CommandButton1 Option Explicit Option Compare Text 'フォーカスインデックス Private Enum FCS_ID FCS_TEXT1 FCS_TEXT2 FCS_TEXT3 FCS_CMD_CLOSE End Enum Private fNow As FCS_ID '現在アクティブフォーカスを位置を表す、フォーカスインデックス Private fMem As FCS_ID '直前の有効なフォーカスを位置を表す、フォーカスインデックス 'テキスト1が変更されら、TAGを消す(TAGに値が入っているときは、チェックロジックを抜ける) Private Sub Text1_Change() Text1.Tag = "" End Sub Private Sub Text1_GotFocus() fNow = FCS_TEXT1 Call chkFocus End Sub Private Sub Text2_GotFocus() fNow = FCS_TEXT2 Call chkFocus End Sub Private Sub Text3_GotFocus() fNow = FCS_TEXT3 Call chkFocus End Sub Private Sub Command1_GotFocus() fNow = FCS_CMD_CLOSE Call chkFocus End Sub Private Sub Command1_Click() Unload Me End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 'タブキー入力なら If KeyCode = vbKeyTab Then 'SHIFTキーを押した状態? If (Shift And vbShiftMask) = 0 Then 'SHIFTを押していないなら、リターンキーの処理にしてしまう KeyCode = vbKeyReturn End If End If Select Case KeyCode Case vbKeyReturn 'フォーカス移動:次 Call nextFocus(True) Case vbKeyTab 'フォーカス移動:前 Call nextFocus(False) End Select End Sub 'BEEP音制御 Private Sub Form_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case vbKeyReturn, vbKeyTab, vbKeyEscape KeyAscii = 0 End Select End Sub '初期設定(お好みで変更) Private Sub Form_Load() Dim ctlWk As Control With Me For Each ctlWk In .Controls If TypeOf ctlWk Is TextBox Then ctlWk.Text = "" ctlWk.Tag = "" ctlWk.BackColor = vbWhite ctlWk.ForeColor = vbBlack End If Next ctlWk .Command1.Caption = "閉じる" .KeyPreview = True .Show Call Focus_Set(FCS_TEXT1) End With End Sub '指定インデックスのコントロールにフォーカスを当てる 'コントロールを増やしたら、忘れずに Private Sub Focus_Set(inFcsId As FCS_ID) Dim fWk As FCS_ID Dim ctlWk As Control 'ワークにセット fWk = inFcsId 'フォーカスインデックス範囲外のインデックスにならないように制御 If fWk < FCS_TEXT1 Then fWk = FCS_TEXT1 ElseIf fWk > FCS_CMD_CLOSE Then fWk = FCS_CMD_CLOSE End If 'フォーカスを当てる Select Case fWk Case FCS_TEXT1: Set ctlWk = Text1 Case FCS_TEXT2: Set ctlWk = Text2 Case FCS_TEXT3: Set ctlWk = Text3 Case FCS_CMD_CLOSE: Set ctlWk = Command1 End Select ctlWk.SetFocus '処理をOSに渡すことによりチェックロジックが走る '本当はフォーカスが当たってはいけない位置を指定した場合、チェックロジックにより、 'アクティブなフォーカスが、適正な位置に配置されている DoEvents 'チェックが走った後の現在のフォーカスを記憶 fMem = fNow End Sub '現在アクティブな位置のフォーカスによって、チェックする個所を限定する Private Sub chkFocus() Select Case fNow '現在テキスト2がアクティブなら Case FCS_TEXT2 'テキスト1をチェック If Not chkText1 Then 'エラーならフォーカスを戻す Call Focus_Set(fMem) End If End Select '現在アクティブなフォーカス位置を記憶 DoEvents fMem = fNow 'アクティブなコントロールを選択状態 On Error Resume Next With Me.ActiveControl .SelStart = 0 .SelLength = Len(.Text) End With On Error GoTo 0 End Sub 'テキスト1のチェックロジック 'サンプルではテキスト1は「A」か「B」のみTRUE Private Function chkText1() As Boolean chkText1 = True If Text1.Tag <> "" Then Exit Function End If Select Case Text1.Text Case "A", "B" '正常 Text1.Tag = "OK" Text2.BackColor = Text1.BackColor Text2.ForeColor = Text1.ForeColor Case Else 'NG 'テキスト1の入力チェックがだめならフォーカスを戻す Text1.Tag = "" chkText1 = False Text2.BackColor = vbInactiveBorder Text2.ForeColor = vbGrayText End Select End Function '次の使用可能なフォーカス位置を得る Private Sub nextFocus(inMode As Boolean) Dim fWk As FCS_ID fWk = fMem Do '次のフォーカスインデックスを算出 If inMode Then fWk = fWk + 1 Else fWk = fWk - 1 End If '対象となるコントロールにフォーカスを当ててよいかチェック Select Case fWk Case FCS_TEXT2 '正常ならループを抜ける If chkText1 Then Exit Do End If Case Else Exit Do End Select Loop 'フォーカスを当てる Call Focus_Set(fWk) End Sub
その他の回答 (5)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
色を変えたのはおまけ機能のつもりでしたので、、、 こだわるのであれば Private Sub Text1_LostFocus() Call chkText1 End Sub を加えるだけでいいのでは? ただ締め切りさえしてくれるのであれば、ポイントはどうでもいいです。
お礼
お礼が遅くなってすみません。 ちょっと、実行してみただけでしたので・・・ これ以上待っても、新しい回答はなさそうなので、この辺で締め切らせていただきます。 ありがとうございました。
- maruru01
- ベストアンサー率51% (1179/2272)
再びmaruru01です。 どのタイミングでデータベースの検索を行うかということではないでしょうか。 Text1に入力して、確定後にエンターキーを押すと、そこでデータベース検索(もちろんその前にText1の未入力チェックがありますが)して、あればText2を使用不可にしてText3へ、なければText2へという動作でしょうか。 マウス移動も対応するなら、やっぱり検索ボタンをつけるのがいいでしょう。 つまりText1入力後エンターキーを押すと、検索ボタンにフォーカスを移し、さらにエンターキーを押して(つまりボタンをクリックして)検索し、その結果によってそれぞれのテキストボックスへ移動する処理をします。 これなら、マウスで検索ボタンを押しても、その後に移動してくれます。 ちなみに、エンターキーをTabキーのように使用するというのであれば、以下のHPが参考になると思います。 http://www.interq.or.jp/www-user/komurak/enter/sample.html テキストボックス間の移動の場合は、私ならKeyDownイベント+keybd_eventAPIにしますが。
お礼
お礼が遅くなってすみません。 検索ボタンの件は参考にさせていただきます。
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 1.の条件なら、Text1のKeyDownイベントでKeyCodeを調べて、エンターキーなら、処理ルーチンを行うようにすればいいのではないでしょうか。 LostFocusイベントに書くと、終了出来ない場合が生じます。 ところで、Text1で判定を行う前は、Text2はどういう状態なのでしょうか。 各場合でのText1~3の使用可/不可の仕様によって、書き方は異なると思うのですが。 あと、No3.の人の言うように、データベース検索などは、検索ボタンを作る方がいいと思いますよ。
補足
回答ありがとうございます。 >1.の条件なら、Text1のKeyDownイベントでKeyCodeを調べて、エンターキーなら、処理ルーチンを行うようにすればいいのではないでしょうか。 マウスで移動された場合、別にコーディングするという事でしょうか? もう少し、具体的にアドバイス頂けるとありがたいのですが・・・ >データベース検索などは、検索ボタンを作る方がいいと思いますよ。 やはり今はそういう方が良いのでしょうか? 私はMS-DOSの頃の人間なのでマウスの使用と言うのがあまり好きでなく、 [Enter]で処理するプログラムは必須なのです。 ファンクションキーに割り付けたりもしますが、顧客を何人も登録するのに、いちいちファンクション押すのも面倒で・・・ 私の理想としては、[Enter]で最後の登録までいけるのが前提で、 私以外の人が使うために、マウス操作の処理やタブの処理等付け加えている状況です。 maruru01さんは、経験者ということですが、実際に会社相手にプログラミングすることがありますか? もしあれば、このごろの利用者向けのアドバイス等あったら教えてください。 別の質問になってしまうので、新しく質問した方がよいでしょうか?
- imogasi
- ベストアンサー率27% (4737/17069)
ご質問者も回答を入れておられるのではないかと思う質問で、LostFocusイベントで解答して、不十分を指摘された者ですが、根本として (1)入力フィールドを入力後、コマンドボタンを押させ コマンドボタンのクリックイベントで複数項目の関連チェックする。 (2)テキストボックス等入力完了後、今後入力予定のコントロール(例テキストボックス)まで入力の可不可を制御する。 (3)入力が後の方のコントロールの入力後に、前に入力済みの項目と関連チェックをする。 本件は(2)だと思いますが(1)が一番簡単で安定性があると思いますが、SE根性が許さない?
お礼
回答ありがうとうございます。 SE根性というよりも「簡単なプログラムでできるに越したことはない。」というだけです。 私は自営業を営んでおりまして、できるだけ金をかけずにをモットーにしています。 プログラムを作ることだけが私の仕事ではないので、プログラムだけを作っているわけにはいきません。 ですから、プログラムを作るのも仕様書をばっちり作って・・・というわけにもいかず (ただ、めんどうなだけですが・・・) そんな訳でプログラムをつくりだしてから、項目が足りなかったり、処理を追加したり という事が頻繁に起きます。(なおさら、仕様を固めてからの方が良いのでしょうが) そこで、項目が増えたり、処理が追加されてもメンテナンスが楽なように プログラムを簡潔にしておきたいのです。 今回質問したものは、自分なりに作成し、正常に動いているのですが、 皆さんは、どんな仕様にして、どのようにコーディングするのか参考にしたかったのです。 ですから、良い悪いは別にして、いろいろな意見を聞きたいと思いました。 しかし、ここの質問は、回転が速く、質問してもすぐ画面から消え去ってしまって、 後は、回答を下さった方に補足なりで答えていただくのみで、新しい意見はあまり望めませんよね? そういう場合は、何度も質問した方がよいのでしょうか? もうしばらく締め切りませんので、いろいろな方の意見が入ればと思います。
- kazuhiko5681
- ベストアンサー率49% (79/159)
はじめまして。 VBは初心者ですが、私だったら、次のようにすると思います。 >(1)Text1に入力がない場合、エラーメッセージを表示し再入力 入力されていた場合 >(2)データがあった場合には、顧客コード:Text2は入力不可 >(3)データがない場合に、顧客コード:Text2は入力可 text1のLostFocusイベントにif文で書いてみたらどうでしょうか。 私だったら、次のように書きます。 if me.text1.text = "" then msgbox "○○○" me.text1.setfocus else データを見つけるコード if でーたがあった場合 then me.text2.enabled = true else me.text2.setfocus end if >終了ボタンで終了することができる これは、フォームの×ボタンをクリックして終了させたいということですよね? 私だったら、次のように書きます。 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) end End Sub
お礼
早速の回答ありがとうございます。 この方法だと、マウスで動くときに、強制的にtext2にいってしまいますよね? 私はMS-DOS時代の人間なので、入力は項目順にと思うのですが、 WINDOWSはマウスで動かす人が多いので困ります。 その辺はどのように考えるか、もしよければ教えてください。
お礼
回答ありがとうございます。 早速試してみました。 Text1にa,b以外を入れて、マウスでText3に移動したとき、Text2は見た目(あくまで見た目)が 変化しないのですが、この部分は、コーディングでなんとかなるのでしょうか? それ以外は、バッチリでした。 参考にさせて頂きます。 今回は、良い悪いは別にして、いろいろな人にどのようにコーディングしているか聞きたかったのですが、 この後、何人の人が答えてくれるか... まだ締めずに、回答を待ちますのでポイントの方はもう少しお待ちください。