テキストボックスの反転させるには?

解決


ree  2005-08-25 20:05:54  No: 124432

ENTERでテキストボックスのフォーカス移動
(テキストボックスの中身を青く反転)するプログラムを作っているのですが、
上手く反転してくれません。
しばらくENTERを押しっぱなしにしてると
反転するのですがはじめから、はじめから
反転させるにはどうしたら良いでしょうか
アドバイス御願い致します

ENTERでフォーカス移動する部分はじゃんぬねっとさんのHPに在ったのを
使わせて頂いてます。
' PostMessage 関数
Private Declare Function PostMessage Lib "USER32.DLL" Alias "PostMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long _
) As Long

' 定数の定義
Private Const WM_KEYDOWN As Long = &H100    ' キー押し下げ
Private Const VK_TAB     As Long = &H9      ' Tab キー

’青く反転させる
Private Sub textActive(frm As Form)
    Dim txtControl As TextBox
    'テキストボックスの場合反転
    If TypeOf frm.ActiveControl Is TextBox Then
        Set txtControl = frm.ActiveControl
        txtControl.SelStart = 0
        txtControl.SelLength = Len(txtControl.Text)
    End If
End Sub

' [Enter] キーで [Tab] キーを飛ばすことによってフォーカス遷移する
Private Sub Form_KeyPress(ByRef KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        Call PostMessage(Me.hWnd, WM_KEYDOWN, VK_TAB, ByVal 0&)
        
        KeyAscii = 0 '音を消す
  ’青く反転させる
        textActive Me
    End If
End Sub


ガッ  2005-08-25 20:19:21  No: 124433

> Call PostMessage(Me.hWnd, WM_KEYDOWN, VK_TAB, ByVal 0&)
このPostMessageによって投げられたメッセージを処理する前に、
> textActive Me
これが着てしまうからでは?
→原因がそうなら、
  他のコントロールにフォーカスが移ったことを確認してから、textActiveを呼びましょう
  となりますね。


ree  2005-08-26 04:20:59  No: 124434

ガッさん返信有難う御座います。
>他のコントロールにフォーカスが移ったことを確認してから、textActiveを呼びましょう

どうしたら移ったと確認してから呼べるのでしょうか
ループを使ってコントロールの名前が変わるのを待って見ましたが
無限ループしてしまって...
度々すみません。どうしたらよいでしょうか?
        Set txtControl1 = Me.ActiveControl
        Call PostMessage(Me.hWnd, WM_KEYDOWN, VK_TAB, ByVal 0&)

        '追加
        Do While True
            Set txtControl2 = Me.ActiveControl
            If txtControl1.Name <> txtControl2.Name Then Exit Do
        Loop

        KeyAscii = 0 '音を消す
  '青く反転させる
        textActive Me


Geo=TK3  2005-08-26 04:34:13  No: 124435

>どうしたら移ったと確認してから呼べるのでしょうか

VB6.0 ではフォーカスが移動した時点で TextBox に対して GotFocus 
イベントが発生しますので、そのイベントハンドラ内部で呼び出せば
よいかと。

VB.NET だと GotFocus の代わりに Enter を使えばいいのかな?
そこまでは手元に VB.NET がないので分からないのですが。


ree  2005-08-26 17:18:36  No: 124436

Geo=TK3さん返信有難う御座います。
イベントハンドラとは気づきませんでした。

GotFocusイベントを使ったのですが上手く行かなかったので
(組み方が悪かったのかな…;;)

LostFocusイベントで処理を行いました。
Private Sub txtControl1_LostFocus()
    'フォーマス消失後に今アクティブなControl取得
    Set txtControl1 = Me.ActiveControl
    textActive Me
End Sub

ガッさん、Geo=TK3さん有難う御座いました。


ree  2005-08-26 17:19:04  No: 124437

付け忘れいました。
すみません。


じゃんぬねっと  URL  2005-08-26 18:33:04  No: 124438

> VB.NET だと GotFocus の代わりに Enter を使えばいいのかな?

合ってます。
VB2002 以降では GotFocus は低水準イベントなので、
Enter イベントを使うようにするべきです。
同様に、LostFocus は Leave イベントになります。
http://jeanne.wankuma.com/tips/textbox/06-onselectall.html


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加