DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プロシージャの呼び出し

環境/言語:[Windows2000]
分類:[.NET]

kageです。お世話になります。

Private Sub Button1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdPrev.Click

で書かれたプロシージャを他プロシージャから呼び出すには
Button1.PerformClick()
で出来るのはわかるのですが、MouseDownイベントの場合がよく分かりません。

Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
If (Control.MouseButtons And MouseButtons.Left) = _
MouseButtons.Left Then
Label1.Text = "マウスの左ボタンが押されています。"
End If
If (Control.MouseButtons And MouseButtons.Right) = _
MouseButtons.Right Then
Label1.Text = "マウスの右ボタンが押されています。"
End If
End Sub

このプロシージャを別プロシージャから呼び出す方法をお願いします。
kageさん、こんにちは。
力になれるかどうか分りませんが、、。

> Button1.PerformClick()
こんなのがあったんですね、知りませんでした(恥

さて、本題ですが、、
どんな場合にButton1_MouseDownプロシージャ内の処理を行ないたいのでしょう?
Button1以外でマウス押下されたときでしょうか?
例えば
Button1_MouseDown内の処理を別関数にして(引数はButton1_MouseDownと同じ)
Button1.MouseDownイベントの時にも、呼び出したいときにも
その関数を呼ぶという方法はどうでしょう?

もう一つの方法は
@自作のイベント「TestEvent」(引数はButton1_MouseDownと同じ)
 を発生させるメソッド「TestMethod」を持つクラス「TestClass」を作成する。
AWithEvents句を使用してTestClassオブジェクトを宣言する
 >Private WithEvents MyTestClass as TestClass
BButton1_MouseDownの宣言部〜Handles Button1.MouseDownの後に
 ", MyTestClass.TestEvent"を追加する。
CButton1_MouseDownの処理を行ないたい場所でTestClass.TestMethodメソッドを
 引数を指定して呼び出す。

以上です。
ヘルプでHandlesを調べると、参考になるかもしれないですね。

では、失礼いたします。
識者の方、訂正やよりよいアドバイスありましたらよろしくお願いたします。
なおやさん、こんにちは。

> 力になれるかどうか分りませんが、、。

いえいえ、十分力になっていただけそうです。

> どんな場合にButton1_MouseDownプロシージャ内の処理を行ないたいのでしょう?
> Button1以外でマウス押下されたときでしょうか?

Form_Load時に読み込んだファイルの状況により、マウスの右ボタンや左ボタンを押したときの処理を、させたかっただけです。
ファイルにAと書いてあれば右ボタンクリック、Bと書いてあれば左ボタンクリック。

VB6であれば、引数にボタン番号を渡してやるだけでした。.netは難しい〜〜!

> もう一つの方法は

の方を今まで避けて通っていましたが、まじめに取り組みます。
ありがとうございました。   Kage
初めまして。

私はC#しか使った事がないので、お力になれるかどうかわかりませんが。
(VB.NETは触った事ありません。)

C#の場合、直呼びが可能です。
-------------------------------------------------------------------
MouseEventArgs args;
if ( ここに判定処理を入れる )
{ //左クリック
args = new MouseEventArgs(MouseButtons.Left,1,0,0,1);
} else { //右クリック
args = new MouseEventArgs(MouseButtons.Right,1,0,0,1);
}
this.Button1_MouseDown(null,args);
-------------------------------------------------------------------

MouseEventArgsクラスはpublicコンストラクタが用意されていますので、
自分でオブジェクトを生成できます。

=> 生成時にボタンを指定します。

あとは、このオブジェクトを第2引数としてメソッド呼び出しを行なえます。
第1引数のobjectは、イベントが発生したオブジェクトを表します。必要がな
ければnull値を渡してあげます。

C#では、この方法で呼び出しは可能です。
参考になれば。。。。。。
たぐぴょんさん、お世話になります。

いただいたコードをVB.NETに変換して実行してみました。

> C#の場合、直呼びが可能です。

VBの場合、これができないのでしょうか?
思わしい結果が得られませんでした。
もうちょっと頑張ってみます。ありがとうございました。
kage
kageさん、こんにちは。

C#で実現できているコードをSharpDevelop(0.99)でVB.NETに変換して
みたら、実行できました。
-------------------------------------------------------------------
Dim args As MouseEventArgs
If ここに判定処理を入れる Then
args = New MouseEventArgs (MouseButtons.Left, 1, 0, 0, 1)
Else
args = New MouseEventArgs (MouseButtons.Right, 1, 0, 0, 1)
End If
Me.Button1_MouseDown(Nothing, args)
-------------------------------------------------------------------
こんなコードになるんですね。。。。。。
みなさま、こんにちは。

>たぐぴょんさん
なるほど〜、こういったやり方のほうが簡単ですね!
今後の参考にさせていただきます!!
たぐぴょんさん、お世話になります。

実は、私も同じコードになりました。
でも動かないんです???
何か、とんでもない勘違いをしているのかも・・・。
以下が私が試しているコードです。
-------------------------------------------------------
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
If (Control.MouseButtons And MouseButtons.Left) = _
MouseButtons.Left Then
MessageBox.Show("マウスの左ボタンが押されています。")
End If
If (Control.MouseButtons And MouseButtons.Right) = _
MouseButtons.Right Then
MessageBox.Show("マウスの右ボタンが押されています。")
End If
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim args As MouseEventArgs
If Me.Label1.Text = "A" Then
args = New MouseEventArgs(MouseButtons.Left, 1, 0, 0, 1)
Else
args = New MouseEventArgs(MouseButtons.Right, 1, 0, 0, 1)
End If
Me.Button1_MouseDown(Nothing, args)
End Sub
---------------------------------------------------------------------
Form1にBottun1とLabel1を配置し、Label1に"A"を書いています。
何だ、バカ・・・。ということがありましたらご指摘ください。
よろしくお願いします。 kage
■No3564に返信(kageさんの記事)
>
> If (Control.MouseButtons And MouseButtons.Left) = _

If (e.Button And MouseButtons.Left) = _
で、Button1_MouseDown()に渡されたパラメタeのマウスボタンを判定します。
e.Button を使うと、今回のように直接イベントハンドラを呼び出した時や
MouseDownイベントが発生した時のマウスボタンを判定できます。

Control.MouseButtons では、(直前に?)実際に押されたマウスボタンを判定します。
kageさん、こんにちは。

私のコードには、Handles句がありません。
(SharpDevelopでコーディングすると、Handles句が付きません。)
違いはそれぐらいのような気がしますが。

kageさんに示していただいたソースと同じような処理をするコードの全文
を書いておきます。↓

こちらでは、このコードでFormのロード時にメッセージボックスが開きま
す。(VB.NETは持っていないので、SharpDevelop0.99で動作確認)

一度、このコードで実現できるか試してみてはいかがでしょう?
---------------------------------------------------------------------
Imports System
Imports System.Windows.Forms

Class Mouse
Inherits Form
Private Button1 As Button
Private Label1 As Label

Public Shared Sub Main()
Application.Run(New Mouse )
End Sub

Sub New()
AddHandler Me.Load, AddressOf Me.Form1_Load
Button1 = New Button
Button1.Text = "PUSH"
Button1.Dock = DockStyle.Top
AddHandler Button1.MouseDown, AddressOf Me.Button1_MouseDown
Label1 = New Label
Label1.Text="A"
Label1.Dock = DockStyle.Top
Me.Controls.Add(Label1)
Me.Controls.Add(Button1)
End Sub

Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
If e.Button = MouseButtons.Left Then
MessageBox.Show("マウスの左ボタンが押されています。")
End If
If e.Button = MouseButtons.Right Then
MessageBox.Show("マウスの右ボタンが押されています。")
End If
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
Dim args As MouseEventArgs
If Label1.Text="A" Then
args = New MouseEventArgs (MouseButtons.Left, 1, 0, 0, 1)
Else
args = New MouseEventArgs (MouseButtons.Right, 1, 0, 0, 1)
End If
Me.Button1_MouseDown(Nothing, args)
End Sub
End Class
---------------------------------------------------------------------
NowhereManさん、こんにちは。

■No3573に返信(NowhereManさんの記事)
> ■No3564に返信(kageさんの記事)
>>
>> If (Control.MouseButtons And MouseButtons.Left) = _
>
> Control.MouseButtons では、(直前に?)実際に押されたマウスボタンを判定します。
>

なるほど。これは気付きませんでした。

.NETドキュメントには、
-------------------------------------------------------------------------------
ユーザー入力は、キーボードとポインティング デバイスをとおして処理されます。
-------------------------------------------------------------------------------
と書かれていますね。
フォームロード時のユーザー入力のない状態では、Controlクラスは使用しても
意味がないという事ですね。
NowhereManさん、たぐぴょんさん、お世話になります。

> e.Button を使うと、今回のように直接イベントハンドラを呼び出した時や
> MouseDownイベントが発生した時のマウスボタンを判定できます。
> Control.MouseButtons では、(直前に?)実際に押されたマウスボタンを判定します。

できました。なるほど・・・・。
今後ともよろしくお願いします。  kage
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板