ポップアップメニューを複数使うには?

解決


マロン  2005-06-27 21:42:47  No: 90712

いつもお世話になります。
早速ですが質問させてください。

「一度に表示できるショートカット メニューは 1 つだけです。そのため、ショートカット メニューが既に表示されているか、プルダウン メニューが開いている場合は、PopupMenu メソッドの呼び出しは無視されます。」というMSDNでの解説を踏まえて、

例えばForm1でポップアップメニューを介してForm2をモーダルでオープンし、Form2でさらにポップアップメニューを表示させたい場合、MSDNの解説どおりForm2ではメニューが表示されませんが、これを可能にする何かうまい方法というのはないものでしょうか。

Form1のポップアップメニューでForm2を開くコマンドをクリックした直後に、そのメニューを消せばいいのかな?  と思ってそのようにしましたが、結果はだめでした。。。


mnu  2005-06-27 22:48:30  No: 90713

VB6ですよね?
Form1メニューのClickイベントでForm2をShowするのではなく、
そこでは、モジュールレベルのflagをセットします。
そして、Form1のMouseUpイベントでは、PopupMenuメソッドの処理が
終わってから、そのflagを判定してShowすればいいと思います。


ねろ  2005-06-27 23:37:18  No: 90714

ポップアップメニューの中から呼ぶとだめですが、
ポップアップメニューの中で
Timer1.Interval = 1
Timer1.Enabled = True
として
Private Sub Timer1_Timer()
    Timer1.Enabled = False
    Form2.Show (vbModal)
End Sub
こうやって外から呼べば良いのでは。
何か同じようなレスを何回か書いているような。


マロン  2005-06-28 01:12:50  No: 90715

mnuさん、ねろさんありがとうございました。
アドバイスどおりやってみましたら、なんとうまくいきました!
なるほど、いろんな手があるもんですね。


マロン  2005-06-28 01:24:13  No: 90716

■mnuさんへ
すみません、申し遅れました。開発環境はVB6SP6です。
VB.NETも一応持っていますが、もっぱらVB6でのプログラミングにはまっています。というより、私の場合.NETまで手が回らないと言ったほうがいいのかな。
使い方やら開発手法を学習するまでに至っていないというのが現状なんです。

■ねろさんへ

  「何か同じようなレスを何回か書いているような。」

すみません。検索をかけるべきでしたね。以後気をつけます。


ねろ  2005-06-28 02:18:55  No: 90717

>「何か同じようなレスを何回か書いているような。」
>すみません。検索をかけるべきでしたね。以後気をつけます。
検索しても出てきません、私の書き方が悪い。orz
あるイベントの中から処理を呼び出すと上手くいかない場合があり、
このような場合はTimerを使えば何とかなると言うことで。。。
ちょっと下のこれなんかと同じ悩みかなと。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200506/05060079.txt

mnuさん、私もこの方法がいい方法だとは思っていません。
そこでこれはと思い、mnuさんの方法を試して見ました。
結果は、メニューのクリックイベントは、 Form_MouseUpの後に起こりました。(^^;
どうもだめなようです、何か良い方法があるのかしら。


マロン  2005-06-28 07:03:52  No: 90718

>検索しても出てきません、私の書き方が悪い。
いえいえとんでもないです。

ところで、Timerを使用してFormを開く方法でちょっと気づいたのですが、
例えば

     Private Sub mnuOpen_Click()
          〜処理A〜
          Form2.Show (vbModal)
          〜処理B〜
     End Sub

ということをやりたい場合、他の場所でForm2を開くと処理Bの実行ができないですよね。
そのような場合、Form1のForm_Activateに処理Bを持っていき、Form2が閉じられた時だけ処理Bを実行するようにすれば良いのかな?と思いますが、他に何かよい方法があるのでしょうか。


mnu  2005-06-28 07:29:14  No: 90719

私が試した方法は、以下の様な感じです。

Form1のメニュー構造は、
mnuTop
....mnuSub (Index=0) <---先頭項目でModal-Formを開く
....mnuSub (Index=1)
と、しました。

Option Explicit
Private m_fMenuClicked As Boolean

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If (Button = vbRightButton) Then
        m_fMenuClicked = False
        PopupMenu mnuTop
        If (m_fMenuClicked) Then Form2.Show vbModal
    End If
End Sub

Private Sub mnuSub_Click(Index As Integer)
    Select Case Index
        Case 0: m_fMenuClicked = True
        Case 1:
    End Select
End Sub


ねろ  2005-06-28 17:10:44  No: 90720

>他の場所でForm2を開くと処理Bの実行ができないですよね。
いやいや、単にこれで。
Private Sub Timer1_Timer()
    Timer1.Enabled = False
    Form2.Show (vbModal)
    MsgBox ("Form2は終了しました。")
    '〜処理B〜
End Sub

mnuさんなるほど、ただこれだとメニューを非表示にしてPopUpMenuにした時、
OKですが、非表示にせずPopUpMenuにし、直接メニューをただくとだめなような。。。


マロン  2005-06-28 18:52:24  No: 90721

ねろさんありがとうございます。
なるほど、了解致しました。


mnu  2005-06-28 19:47:42  No: 90722

> ねろ さん
> 非表示にせずPopUpMenuにし、直接メニューをただくとだめなような。。。

mnuTop.Visible = True の場合も、ポップアップメニューからいけると
思いますが... もしかして、メニューバーからだと、ダメってことですか?
それは、想定外なので。orz


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加