DTPickerをキーボードで入力する際、以下の動きを実現させたいのですが可能でしょうか?
・年入力→Enter→月入力→Enter→日入力→Enter→次のコンポーネントへカーソル移動
現在、DTPickerでのEnter時に右カーソルを割り当てて、Enterで年→月→日の移動は行えている状態です。
ですが、日入力後は次コンポーネントへ移動させたいので、現在入力している箇所を取得できるような方法が知りたいです。
(Tabで移動させれば?と言うのは無しでお願いします・・・。)
わかる方ご教授願えないでしょうかm(__)m
ゴミクソがウロウロするな。
編集 削除うちの掲示板にもいるよ。
カスがね。
ブスの花ちゃんもいるけどね^^;
編集 削除前の発言はなりすましのものです。
編集 削除真面目に読んでる方に迷惑がかかるので、わからないならスルーでお願いしますね^^
編集 削除> 現在入力している箇所を取得できるような方法が知りたいです。
CustomFormat でコールバック フィールドを指定しては如何でしょう。
これならば、各種イベントの CallbackField 引数で判定できます。
とはいえ、年や月や日をすべてコールバック フィールドにしてしまうと、
CallbackKeyDown イベントの実装が大変な手間になってしまうので、
ここは「年+月+日+コールバック」の4フィールド構成にしておき、
『コールバック フィールドにきたときにフォーカス遷移』という
実装にするというのは如何でしょう。
'---------------------
Option Explicit
Private Sub Form_Load()
'末尾にダミーフィールド X を指定しておく。
DTPicker1.CustomFormat = "yyyy'/'MM'/'ddX"
DTPicker1.Format = dtpCustom
'KeyDown や KeyUp イベント等とは異なり、CallbackKeyDown イベントは
'コールバック フィールド以外では発生しないため、日付の末尾に
'ダミーフィールドを設けておけば、ここで発生したキー入力イベントは
'年月日すべての入力が完了した後という事になる。
End Sub
Private Sub DTPicker1_Format(ByVal CallbackField As String, FormattedString As String)
'「まず使われない」キーとして、F16 を制御キーに使う。
'(DTPicker や他のコントロールの動作に影響を与えないキーを選択する)
SendKeys "{F16}", False
'ここでの F16 送出は必須ではないが、これを書いておかないと、
'フィールド移動に(Enter ではなく)右矢印キーを押した場合に都合が悪い。
End Sub
'KeyPress では Enter キーを拾えないので、KeyUp で代用。
Private Sub DTPicker1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
'次フィールドに移るために[→][F16]を送出する。
SendKeys "{Right}{F16}", True
End If
End Sub
Private Sub DTPicker1_CallbackKeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer, _
ByVal CallbackField As String, CallbackDate As Date)
'ダミーフィールドで制御キー(今回はF16)が押されたら
'SetFocus メソッド(もしくは Tab キー送出)等を用いて、
'次のコントロールにフォーカスを切り替える。
If KeyCode = vbKeyF16 Then '←今回の場合、KeyCode 判定無しでもOK。
'コントロールのフォーカスを切り替える前に、次回フォーカス時に向け
'アクティブなフィールドを、(X ではなく)yyyy もしくは dd 部に
'戻しておく必要がある。
'SendKeys "{Right 1}", True 'yyyy 部をアクティブにする場合
SendKeys "{Left 1}", True 'dd 部をアクティブにする場合
'次のコントロールに遷移
Text1.SetFocus
End If
End Sub
'---------------------
ただし上記の実装だと、yyyy 部で[←]を押した場合も、
次コントロールへの遷移として扱われますのでご注意を。
もし、yyyy 部での [←] を無視する(または dd 部に送る)ように
変更したいのであれば、X の次または yyyy の前に、もう一つの
ダミーコールバックフィールドを用意しておき、各イベントで
CallbackField を調べて、振る舞いを変える必要があるかも。
> '次フィールドに移るために[→][F16]を送出する。
> SendKeys "{Right}{F16}", True
[Enter] を [→][F16] に置き換える必要は無かったかも。
[→] にするだけで大丈夫かな。
---------------
Option Explicit
Private Sub Form_Load()
DTPicker1.CustomFormat = "yyyy'/'MM'/'ddX"
DTPicker1.Format = dtpCustom
End Sub
Private Sub DTPicker1_Format(ByVal CallbackField As String, _
FormattedString As String)
SendKeys "{F16}", True
End Sub
Private Sub DTPicker1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
SendKeys "{Right}", True
End If
End Sub
Private Sub DTPicker1_CallbackKeyDown(ByVal KeyCode As Integer, _
ByVal Shift As Integer, _
ByVal CallbackField As String, _
CallbackDate As Date)
SendKeys "{Right}", True
Text1.SetFocus
End Sub
こーえつ>>オレはおまえのPCの年代を知りたいよ(笑)
ネッカフェ行くとさぁ、古臭いXPがたくさん陳列してるんだが、立ち上がりの遅さはアレな感じがする。まぁ、オレのvistaも古いらしいが、それでもアレだぞ、XPよりはマシだが。
ま、金なしオヤジじゃアレだけどな。