いつもお世話になります。
早速ですが質問させてください。
「一度に表示できるショートカット メニューは 1 つだけです。そのため、ショートカット メニューが既に表示されているか、プルダウン メニューが開いている場合は、PopupMenu メソッドの呼び出しは無視されます。」というMSDNでの解説を踏まえて、
例えばForm1でポップアップメニューを介してForm2をモーダルでオープンし、Form2でさらにポップアップメニューを表示させたい場合、MSDNの解説どおりForm2ではメニューが表示されませんが、これを可能にする何かうまい方法というのはないものでしょうか。
Form1のポップアップメニューでForm2を開くコマンドをクリックした直後に、そのメニューを消せばいいのかな? と思ってそのようにしましたが、結果はだめでした。。。
VB6ですよね?
Form1メニューのClickイベントでForm2をShowするのではなく、
そこでは、モジュールレベルのflagをセットします。
そして、Form1のMouseUpイベントでは、PopupMenuメソッドの処理が
終わってから、そのflagを判定してShowすればいいと思います。
ポップアップメニューの中から呼ぶとだめですが、
ポップアップメニューの中で
Timer1.Interval = 1
Timer1.Enabled = True
として
Private Sub Timer1_Timer()
Timer1.Enabled = False
Form2.Show (vbModal)
End Sub
こうやって外から呼べば良いのでは。
何か同じようなレスを何回か書いているような。
mnuさん、ねろさんありがとうございました。
アドバイスどおりやってみましたら、なんとうまくいきました!
なるほど、いろんな手があるもんですね。
■mnuさんへ
すみません、申し遅れました。開発環境はVB6SP6です。
VB.NETも一応持っていますが、もっぱらVB6でのプログラミングにはまっています。というより、私の場合.NETまで手が回らないと言ったほうがいいのかな。
使い方やら開発手法を学習するまでに至っていないというのが現状なんです。
■ねろさんへ
「何か同じようなレスを何回か書いているような。」
すみません。検索をかけるべきでしたね。以後気をつけます。
>「何か同じようなレスを何回か書いているような。」
>すみません。検索をかけるべきでしたね。以後気をつけます。
検索しても出てきません、私の書き方が悪い。orz
あるイベントの中から処理を呼び出すと上手くいかない場合があり、
このような場合はTimerを使えば何とかなると言うことで。。。
ちょっと下のこれなんかと同じ悩みかなと。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200506/05060079.txt
mnuさん、私もこの方法がいい方法だとは思っていません。
そこでこれはと思い、mnuさんの方法を試して見ました。
結果は、メニューのクリックイベントは、 Form_MouseUpの後に起こりました。(^^;
どうもだめなようです、何か良い方法があるのかしら。
>検索しても出てきません、私の書き方が悪い。
いえいえとんでもないです。
ところで、Timerを使用してFormを開く方法でちょっと気づいたのですが、
例えば
Private Sub mnuOpen_Click()
〜処理A〜
Form2.Show (vbModal)
〜処理B〜
End Sub
ということをやりたい場合、他の場所でForm2を開くと処理Bの実行ができないですよね。
そのような場合、Form1のForm_Activateに処理Bを持っていき、Form2が閉じられた時だけ処理Bを実行するようにすれば良いのかな?と思いますが、他に何かよい方法があるのでしょうか。
私が試した方法は、以下の様な感じです。
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
>他の場所でForm2を開くと処理Bの実行ができないですよね。
いやいや、単にこれで。
Private Sub Timer1_Timer()
Timer1.Enabled = False
Form2.Show (vbModal)
MsgBox ("Form2は終了しました。")
'〜処理B〜
End Sub
mnuさんなるほど、ただこれだとメニューを非表示にしてPopUpMenuにした時、
OKですが、非表示にせずPopUpMenuにし、直接メニューをただくとだめなような。。。
ねろさんありがとうございます。
なるほど、了解致しました。
> ねろ さん
> 非表示にせずPopUpMenuにし、直接メニューをただくとだめなような。。。
mnuTop.Visible = True の場合も、ポップアップメニューからいけると
思いますが... もしかして、メニューバーからだと、ダメってことですか?
それは、想定外なので。orz
ツイート | ![]() |