投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/7/12 16:14:33
> VB中学校様の初級講座の第10回 イベントプロシージャの6.自分で呼び出す
> でできましたので、可能かと思い質問しました。

はい。もちろんそれも可能です。
先ほどのコードでいうと、下記の部分にあたりますね。
'Call txtGPIBSend_KeyPress(txtGPIBSend, New KeyPressEventArgs(ChrW(Keys.Enter)))  


ただしこういう方法は、あまり行儀の良い書き方ではない、というだけのことです。
イベントハンドラーは、「呼び出すものではなく、呼び出されるもの」なので。


> Call f.cmdSend_Click(txtGPIBSend, e)
これも先の YourProcedure 法と同様ですね。
変数 f が示すフォームに Public Sub (あるいは Friend Sub)な
公開メソッドを用意して、それを cmdSend_Click から呼ぶように設計してみてください。

そうすれば、GPIBSEND / txtGPIBSend_KeyPress からも、
その公開メソッドを通じて処理が呼び出せるようになるはずです。


なお、初級講座第10回の『6.自分で呼び出す』のところでは、
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
    Call Button2_Click(Button1, e)
End Sub
と言うサンプルが掲載されていますが、このような場合は、下記のようにした方が良いでしょう。
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
    Button2.PerfomeClick()   'これにより、Button2 の Click イベントが発生します 
End Sub


後者の方法であれば、Buton2 の Click イベントが割り当てられている先が、
通常の Sub Button2_Click ではなく、リスト8で示された Sub MyClick に
変更されていたとしても、正しく呼び出すことができます。


また、『6.自分で呼び出す』の例では、Button2_Click の sender に
Button1 や Nothing が渡されているのですが、本来の sender の役目から言えば
ここは通常、Button2 が渡されることが期待されるものですから、
やはり適切な呼び出し方とは言えません。

PerfomeClick メソッド経由で Click イベントを呼び出すようにすれば、
sender や e も適切な値が渡されるようになります。


もちろん直接呼出しであれば、sender に対して意図的に、
別のコントロールを渡したり、Nothing を渡したりといったことも行えてしまうわけですが、
そういう実装にしてしまうと、何故、あえて本来とは異なる値を引数に渡すのか、
処理の「意図」が分かりにくくなってしまいます。

どうしても直接呼び出したいのであれば、上記を十分に理解したうえで行うようにしましょう。