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

addしたmenuItemの区別

  • 題名: addしたmenuItemの区別
  • 著者: かるいざわ
  • 日時: 2004/03/29 18:52:44
  • ID: 3370
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[VB.NET]
分類:[.NET]

こんにちは。宜しくお願いします。
今回、プログラム中でメニューの追加をしたくて下記のようなコードを作りました。
private sub A()
{
dim i%
dim m as MenuItem = New MenuItem
dim mi() as MenuItem

'メニューアイテムの定義
redim mi(10)
for i=0 to 9
mi(i) = New MenuItem
mi(i).Text="menu:" + i
m.menuItems.add(mi(i))
next

'メニューに追加
m.menuItems.add(m)

'ハンドラ設定
for i=0 to 10
addhandler MYmenuitem(i).Click,Addressof Me.B_Click
next i
}
'共通に呼び出される処理
private sub B_Click(Sender as System.Object,ByVal e As System.Eventsrgs)
{
' sender ???
' e ???
}

うまく呼び出されたのですが、どこから呼び出されたのか知る方法がわかりません。
基本的な事がわかっていないようで恥ずかしい限りですが・・・
こんにちは、どらごらです。

■No3370に返信(かるいざわさんの記事)

    Private Sub A()
        '変数
        Dim I As Integer
        Dim tmpContextMenu As ContextMenu
        Dim tmpMenuItem As MenuItem

        '初期化
        tmpContextMenu = New ContextMenu
        For I = 0 To 9
            tmpMenuItem = New MenuItem("MenuItem" & CStr(I), New EventHandler(AddressOf MenuItem_Click))
            tmpContextMenu.MenuItems.Add(tmpMenuItem)
        Next

        Me.ContextMenu = tmpContextMenu
    End Sub


    Private Sub MenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MsgBox(sender.ToString)
    End Sub

こんなのでどうでしょう?
  • 題名: Re[2]: addしたmenuItemの区別
  • 著者: Codingslave
  • 日時: 2004/03/30 11:57:03
  • ID: 3380
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
>private sub B_Click(Sender as System.Object,ByVal e As System.Eventsrgs)
この変数senderはイベントを発生させたオブジェクトを表わします。
さまざまなイベントからひとつのメソッドを共有させるためにすべての型の基本型であるObject型になっていますが、この場合、senderの正体はクリックされたメニューに対応するMenuItem型のオブジェクトです。
したがって、このsenderはMenuItem型に変換することができるのでこれを使ってどのメニューがクリックされたのかを知ることができます。

>うまく呼び出されたのですが、どこから呼び出されたのか知る方法がわかりません。
>基本的な事がわかっていないようで恥ずかしい限りですが・・・
メニューのクリックに対応するイベントは

1.ユーザーがメニューをクリックする
2.Windowsがクリックされたことを感知する
3.対応するアプリケーションにクリックされたことをWindowsがメッセージを送って通知する
4.アプリケーションがメッセージをもとにどのメニューがクリックされたかを調べる
5.特定されたメニューがイベントを呼び出すメソッドを行う
6.MenuItem_Click()を呼び出す

といったような過程を経て呼び出されます。
MenuItem_Click()が呼び出されるまでにどんなメソッドが呼び出されたかを調べるには下のコードを実行して調べることができます。

Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
Dim i As Integer
Dim st As New StackTrace(True)
Dim stackInfo As String = ""

For i = 0 To st.FrameCount - 1
stackInfo = String.Format("{1}{0}{2}", Environment.NewLine, stackInfo, st.GetFrame(i).GetMethod())
Next i
MessageBox.Show(stackInfo)
End Sub
どらごらさん

有り難うございます。
わかりやすいスッキリしたサンプルで色々と勉強になりました。
色々といじってさらに理解を深めてみたいと思います。m(_ _)m
解決済み!
  • 題名: Re[3]: addしたmenuItemの区別
  • 著者: かるいざわ
  • 日時: 2004/03/30 12:37:43
  • ID: 3384
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
Codingslaveさん

ご回答有り難うございます。

senderに対する解説とその理解を深めるサンプルまで提示して下さって感謝です。
「StackTrace」等は知りませんでしたので、またこれで色々楽しめそうです。
今日の午後はこれらを色々いじってみたいと思います。

みなさん有り難うございました。
解決済み!

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