投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/7/9 23:40:08
> ①関数の※AのCall txtGPIBSend_KeyPress(sender, e) で    
> ②テキストボックスのイベントを動かしたいです。
>  ※Aの(sender, e)の引数をどう記述すればいいのかよくわかりません。

そういう書き方をするべきではありません。
イベントの使い方がいろいろと間違っていますよ。


イベントハンドラである Sub txtGPIBSend_KeyPress は、原則として
「Handles txtGPIBSend.KeyPress」によって呼び出されるためのものです。

すなわち、txtGPIBSend と名付けられた TextBox の KeyPress イベントによって、
『呼び出される』ものであって、本来は『呼び出す』ものではないということです。
※ この点は VB6 であっても同様。




同様の理由で、「Call f.cmdSend_Click(txtGPIBSend, e)」のような呼び出しも NG です。
cmdSend_Click などといった「イベントハンドラ」は、本来、
何かの操作に基づいて発生する「イベント」を通じて呼び出されるものであり、
プログラムから意図的に呼び出すのは、あまり行儀の良いコードではありません。

Button がクリックされたり、Button の PerformClick メソッドが呼ばれると
その Button の Click イベントが呼ばれます。でも、自分で Call Button1_Click(…) などとはしない。

TextBox の Text が変化すると、その TextBox の TextChanged イベントが呼ばれます。
でも、自分で Call TextBox1_TextChanged(…) などとはしない。

Form が右上の × ボタンなどで閉じられると、その Form の FormClosing イベントが呼ばれます。
でも、自分で Call Form1_FormClosing(…) などとはしない。


ではどうするとかと言えば、たとえば、「txtGPIBSend 上で Enter が押されたときの処理」を
GPIBSEND の中から呼び出したいのであれば、こんな感じで処理します。

Private Sub txtGPIBSend_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtGPIBSend.KeyPress
    'Enterキーが押された事を取得 
    If e.KeyChar = ChrW(Keys.Enter) Then
        e.Handled = True

        '別途用意したプロシージャーを呼び出します 
        YourProcedure()
    End If
End Sub

Private Sub YourProcedure()
    '★ここに「Enter が押されたときに行いたい処理」を記述します★ 
End Sub

'これって Function ではなく Sub で良いのでは? 
Public Function GPIBSEND(PORTNO As String, Command As StringAs Boolean
    'こういう時は Case 分岐よりも、Dictionary を使った方がスマートかも 
    Select Case PORTNO
        Case "SLAVE1" : cmbGPIB.SelectedIndex = 0
        Case "SLAVE2" : cmbGPIB.SelectedIndex = 1
        Case "SLAVE3" : cmbGPIB.SelectedIndex = 2
        Case "SLAVE4" : cmbGPIB.SelectedIndex = 3
    End Select
    Me.txtGPIBSend.Text = Command

    '★これが今回の主題★ 
    '下記のように呼べなくも無いですが、そのようにはせず 
    'Call txtGPIBSend_KeyPress(txtGPIBSend, New KeyPressEventArgs(ChrW(Keys.Enter))) 
    
    'このように、別途用意したプロシージャーを呼び出すようにします。 
    YourProcedure()

    If Items(Sq, ceWait1) <> "" Then
        WaitTime(CLng(Items(Sq, ceWait1)))
    End If
    WaitTime(CLng(Items(Sq, ceWait2)))
    Return True
End Function



> KeyPressEventArgsの意味がよくわかりません。

イベントは基本的に、引数として「sender As Object」と「e As EventArgs」の 2 つを取ります。
イベントによっては、後者が「e As [EventArgsを継承したクラス]」になります。


イベント引数 sender は、「そのイベントの発生元となるオブジェクト」を指します。
たとえばこういう使い方をします。

'TextBox1~3の TextChanged イベントに、下記のイベントハンドラが割り当てられている 
Private Sub TextBoxes_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged, TextBox3.TextChanged
    '引数 sender は、TextBox1/TextBox2/TextBox3 のいずれかが渡される 
    If sender.Text = "" Then
        'テキストが空になったら、背景を黄色にする 
        sender.Backcolor = Color.Yellow
    Else
        'テキストが空でなくなれば、背景色をリセットする 
        sender.ResetBackColor()
    End If
End Sub



イベント引数 e は、「そのイベントにとって必要な情報」を指します。
KeyPress イベントなら「入力された文字」を表す KeyPressEventArgs が渡され
MouseDown イベントなら「マウスの座標や押されたボタン」を表す MouseEventArgs が
渡されます。特に特筆すべき情報が無い場合には、EventArgs.Empty が渡されます。

たとえば Button1 の Click イベントなどでは、フォーカス遷移後に
キーボードのスペースキーで押されたときは、e は EventArgs.Empty ですが、
マウス操作で押されたときは、e に MouseEventArgs が渡されていたりします。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If TypeOf e Is MouseEventArgs Then
        Dim e2 As MouseEventArgs = DirectCast(e, MouseEventArgs)
        MsgBox("マウス操作で呼ばれた:座標=" & e2.Location.ToString())
    ElseIf e Is EventArgs.Empty Then
        MsgBox("マウス操作以外で呼ばれた")
    End If
End Sub