tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルテキストボックスの書き込みで正常で無い症状の場合は、どの様に考えれば良いでしょうか。
記事No16715
投稿日: 2025/02/18(Tue) 13:10
投稿者AK
お世話になります。

Windows10  VB6

テキストボックス(Text1)に[1: 3: 4:]が書かれています。
2行目は空白になっています。

Text1
-------------------
1:   '1行目
        '2行目
3:   '3行目
4:   '4行目
-------------------

Command1ボタン・・カーソルを↓キーで1行目から2行目に移動します。
Command2ボタン・・2行目に"2:"を書き込みます。

空白に[2]が書き込まれました。

Text1
-------------------
1:   '1行目
2:      '2行目
3:   '3行目
4:   '4行目
-------------------

'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
Private Declare Sub keybd_event Lib "user32.dll" _
        (ByVal bVk As Byte, ByVal bScan As Byte, _
         ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const KEYEVENTF_KEYUP = &H2

'正常の症状

Private Sub Command1_Click()
    Call keybd_event(40, 0, 0, 0) '↓キー on
    Call keybd_event(40, 0, KEYEVENTF_KEYUP, 0) '↓キー off 離す
    Text1.SetFocus 'フォーカス
End Sub
Private Sub Command2_Click()
    Text1.SelText = "2:"
End Sub
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'正常で無い症状

Command3ボタンで行いますと2行目に書き込まないで1行目に[2:1:]となります。

Text1
-------------------
2:1:   '1行目
        '2行目
3:   '3行目
4:   '4行目
-------------------

Private Sub Command3_Click()
    Call keybd_event(40, 0, 0, 0) '↓キー on
    Call keybd_event(40, 0, KEYEVENTF_KEYUP, 0) '↓キー off 離す
    Text1.SetFocus 'フォーカス
    Text1.SelText = "2:"
End Sub

質問:
Command3ボタンで2行目に"2:"を書き込む方法につきまして、ご教示願えますと幸いであります。

Text1
-------------------
1:   '1行目
2:      '2行目
3:   '3行目
4:   '4行目
-------------------

宜しくお願い致します。

[ツリー表示へ]
タイトルRe: テキストボックスの書き込みで正常で無い症状の場合は、どの様に考えれば良いでしょうか。
記事No16716
投稿日: 2025/02/18(Tue) 18:38
投稿者魔界の仮面弁士
> テキストボックス(Text1)に[1: 3: 4:]が書かれています。
> 2行目は空白になっています。
それは
 Text1.Text = "1: 3: 4:"
ということではなく、MultiLine = True となっていて
 Text1.Text = Join(Split("1:  3: 4:"), vbNewLine)
な状態である、ということですね。


> '正常の症状
ユーザー入力(キーボード入力、マウス入力など)は、直ちに実行されるわけではありません。
入力メッセージが処理待ち行列に蓄えられ、その後の Idle Time(イベント処理などが行われていない時間)に
処理待ちメッセージが順次消化されていくようになっています。
そのため提示例では、Command1 が End Sub で脱出した後でキー入力が反映されています。


故に Command1 は
 Call keybd_event(vbKeyDown, 0, 0, 0)
  Call keybd_event(vbKeyDown, 0, KEYEVENTF_KEYUP, 0)
 Text1.SetFocus
でも
 Call keybd_event(vbKeyDown, 0, 0, 0)
 Text1.SetFocus
  Call keybd_event(vbKeyDown, 0, KEYEVENTF_KEYUP, 0)
でも
 Text1.SetFocus
 Call keybd_event(vbKeyDown, 0, 0, 0)
  Call keybd_event(vbKeyDown, 0, KEYEVENTF_KEYUP, 0)
でも
 Text1.Enabled = False
 Call keybd_event(vbKeyDown, 0, 0, 0)
  Call keybd_event(vbKeyDown, 0, KEYEVENTF_KEYUP, 0)
 Text1.Enabled = True
 Text1.SetFocus
でも、同じように動作することでしょう。


> '正常で無い症状
ひとまず
「keybd_event を送出した後」かつ「SelText に書き込む前」にて
DoEvents を呼び出せば期待動作するかと思います。
SetFous は DoEvents の前であれば、keybd_event の前でも後でも構いません。

[ツリー表示へ]
タイトルRe^2: テキストボックスの書き込みで正常で無い症状の場合は、どの様に考えれば良いでしょうか。
記事No16717
投稿日: 2025/02/18(Tue) 19:15
投稿者AK
魔界の仮面弁士 さん

ご返答くださいまして、ありがとうございました。

>ユーザー入力(キーボード入力、マウス入力など)は、直ちに実行されるわけではありません。
>入力メッセージが処理待ち行列に蓄えられ、その後の Idle Time(イベント処理などが行われていない時間)に
>処理待ちメッセージが順次消化されていくようになっています。
[直ちに実行されるわけではありません。]は大変参考になりました。

ご指導していただきました貴重なご意見をありがとうございました。

これから勉強を兼ねて調べることができます。感謝申し上げます。

ご教示いただき、大変ありがとうございました。

[ツリー表示へ]
タイトルRe^2: テキストボックスの書き込みで正常で無い症状の場合は、どの様に考えれば良いでしょうか。
記事No16718
投稿日: 2025/02/18(Tue) 20:41
投稿者AK
魔界の仮面弁士 さん

済みません。再度ご質問致します。

> でも、同じように動作することでしょう。
はい、3種類の【デモ」は同じように動作しました。

実行しますと図のようになりました。
何か考えられます必要な設定などがありましたら、ご教示願えますと幸いです。

'正常で無い症状
> ひとまず
> 「keybd_event を送出した後」かつ「SelText に書き込む前」にて
> DoEvents を呼び出せば期待動作するかと思います。
> SetFous は DoEvents の前であれば、keybd_event の前でも後でも構いません。
はい、ありがとうございます。
間違いが無ければ以下の位置に[DoEvents] を※追加しました。

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
Private Sub Command3_Click()

Call keybd_event(40, 0, 0, 0) '↓キー on
Call keybd_event(40, 0, KEYEVENTF_KEYUP, 0) '↓キー off 離す
  
     Text1.SetFocus 'フォーカス

     DoEvents '※追加しました。
    
     Text1.SelText = "2:"
    
End Sub
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'


Command3ボタンをクリック

Text1
-------------------
2:1:  '1行目
     '2行目
3:      '3行目
4:      '4行目
-------------------

2度目のCommand3ボタンをクリック

Text1
-------------------
2:1:  '1行目
2:    '2行目
3:      '3行目
4:      '4行目
-------------------

[ツリー表示へ]
タイトルRe^3: テキストボックスの書き込みで正常で無い症状の場合は、どの様に考えれば良いでしょうか。
記事No16719
投稿日: 2025/02/19(Wed) 06:09
投稿者魔界の仮面弁士
こちらでは、下記で期待動作していることを確認しています。
また、 No.16718 の処理順に変更した場合も問題は確認されず、
AK さんの事象は再現していません。

Private Sub Command3_Click()
    Text1.SetFocus
    Call keybd_event(vbKeyDown, 0, 0, 0)
    Call keybd_event(vbKeyDown, 0, KEYEVENTF_KEYUP, 0)
    DoEvents
    Text1.SelText = "2:"
End Sub

ただし当方では、Windows10+VB6 な環境は持ち合わせておらず、
検証用の Hyper-V 仮想マシン( Win7x86Pro+VB6 )上でのテストのため
環境の違いによって振る舞いが変わっている可能性もあります。


しかし、keybd_event API を SendKeys ステートメントに差し替えて
    Text1.SetFocus
    SendKeys "{Down}", True
    Text1.SelText = "2:"
とした場合、これを(開発環境からではなく)EXE にして実行してみたところ、当方環境においても
AK さんの「正常で無い症状」という振る舞いが再現しました。
(EXE から実行したのは、開発環境からの実行だと SendKeys が実行時エラー70 になるため)


SendKeys を使う方法については、
    Text1.SetFocus
    DoEvents
    SendKeys "{Down}", True
    DoEvents
    Text1.SelText = "2:"
あるいは
    Text1.SetFocus
    SendKeys "{Down}", True
    DoEvents
    Text1.SelText = "2:"
ないしは
    SendKeys "{Down}", True
    Text1.SetFocus
    DoEvents
    Text1.SelText = "2:"
のように、SelText 前に DoEvents を含めていた場合は期待動作しています。

もしくはそもそも SelText を使わず
    Text1.SetFocus
    SendKeys "{Down}2:", False
であるとか
    SendKeys "{Down}2:", False
    Text1.SetFocus
などとした場合も期待動作しています。

[ツリー表示へ]
タイトルRe^4: テキストボックスの書き込みで正常で無い症状の場合は、どの様に考えれば良いでしょうか。
記事No16720
投稿日: 2025/02/19(Wed) 10:10
投稿者AK
魔界の仮面弁士 さん

度重ね、ご返答くださいまして、ありがとうございました。

お陰様で解決することができました。

>SendKeys を使う方法については、
>もしくはそもそも SelText を使わず
Windows10:実行時エラー70 になりました。

>環境の違いによって振る舞いが変わっている可能性もあります。
お陰様でWindowsXPで確認することを思いつきました。
WindowsXPでは以下で正常に動作しました。
WindowsXPでコンパイルしたEXEファイルはWindows10で正常動作しました。
WindowsXPでコンパイルすることにしました。
本当にありがとうございました。大変感謝しております。

WindowsXP:正常に動作しました。
>SendKeys を使う方法については、
>    Text1.SetFocus
>    DoEvents
>    SendKeys "{Down}", True
>    DoEvents
>    Text1.SelText = "2:"
>あるいは
>    Text1.SetFocus
>    SendKeys "{Down}", True
>    DoEvents
>    Text1.SelText = "2:"
>ないしは
  
>のように、SelText 前に DoEvents を含めていた場合は期待動作しています。

>もしくはそもそも SelText を使わず
>    Text1.SetFocus
>    SendKeys "{Down}2:", False
>であるとか
>    SendKeys "{Down}2:", False
>    Text1.SetFocus
>などとした場合も期待動作しています。

度重なる質問に詳細にご回答くださりありがとうございます。
ご丁寧にご教示いただき深く感謝申し上げます。

[ツリー表示へ]