DTPickerの入力位置を取得するには?


こーえつ  2010-09-18 13:12:30  No: 102562  IP: [192.*.*.*]

DTPickerをキーボードで入力する際、以下の動きを実現させたいのですが可能でしょうか?

・年入力→Enter→月入力→Enter→日入力→Enter→次のコンポーネントへカーソル移動

現在、DTPickerでのEnter時に右カーソルを割り当てて、Enterで年→月→日の移動は行えている状態です。
ですが、日入力後は次コンポーネントへ移動させたいので、現在入力している箇所を取得できるような方法が知りたいです。
(Tabで移動させれば?と言うのは無しでお願いします・・・。)

わかる方ご教授願えないでしょうかm(__)m

編集 削除
KOEI社員  2010-09-18 20:32:32  No: 102563  IP: [192.*.*.*]

ゴミクソがウロウロするな。

編集 削除
ジャンヌ  2010-09-18 20:33:14  No: 102564  IP: [192.*.*.*]

うちの掲示板にもいるよ。
カスがね。

編集 削除
やじゅ  2010-09-18 23:29:31  No: 102565  IP: [192.*.*.*]

ブスの花ちゃんもいるけどね^^;

編集 削除
やじゅ(本物)  2010-09-20 01:28:30  No: 102566  IP: [192.*.*.*]

前の発言はなりすましのものです。

編集 削除
こーえつ  2010-09-20 10:14:43  No: 102567  IP: [192.*.*.*]

真面目に読んでる方に迷惑がかかるので、わからないならスルーでお願いしますね^^

編集 削除
魔界の仮面弁士  2010-09-20 14:28:42  No: 102568  IP: [192.*.*.*]

> 現在入力している箇所を取得できるような方法が知りたいです。
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 を調べて、振る舞いを変える必要があるかも。

編集 削除
魔界の仮面弁士  2010-09-21 00:54:55  No: 102569  IP: [192.*.*.*]

> '次フィールドに移るために[→][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

編集 削除
三木谷脱税浩  2010-09-21 22:07:32  No: 102570  IP: [192.*.*.*]

こーえつ>>オレはおまえのPCの年代を知りたいよ(笑)
ネッカフェ行くとさぁ、古臭いXPがたくさん陳列してるんだが、立ち上がりの遅さはアレな感じがする。まぁ、オレのvistaも古いらしいが、それでもアレだぞ、XPよりはマシだが。
ま、金なしオヤジじゃアレだけどな。

編集 削除