[リストへもどる]
一括表示

投稿時間:2004/06/25(Fri) 20:36
投稿者名:もるだー
Eメール:
URL :
タイトル:
イベント内でモーダルフォーム表示
こんにちは。
現在、モーダルフォームの動きで困っていることがあります。
モードレスフォームのあるコントロールのクリックイベントで、
モーダルフォームをShowしています。

不思議なことに、モーダルフォームのボタンをクリックしても
1回目はききません。(ボタンはへこみません)
2回目で押されます。

クリックの代わりにスペースキーやエンターキーなどは、1回目で効きます。

これって、どういうことでしょうか・・・・・

投稿時間:2004/06/26(Sat) 02:09
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: イベント内でモーダルフォーム表示
問題点をハッキリする為にも事象を再現できるコードを投稿して下さい。

投稿時間:2004/06/28(Mon) 10:58
投稿者名:もるだー
Eメール:
URL :
タイトル:
事象を再現できるコード
> 問題点をハッキリする為にも事象を再現できるコードを投稿して下さい。

失礼しました。
簡単に再現できたため、コードなどの説明を省略してしまいました。
サンプルのコードを書いている際に、TextBoxで作成したところ、
再現しませんでした。
コントロールによっては再現しないものもあるようです。
他のサードパーティ製のコントロールでも再現できたので、
リッチテキストボックスだけのバグというわけでもなさそうです。
原因と回避方法がわかれば、教えていただきたいのですが。
以下が事象を再現できるコードです。

1.form1にリッチテキストボックスコントロール(RichTextBox1)を
  貼り付けます。
2.form2を追加して、コマンドボタン(Command1)を貼り付けます。
3.form1のソース
----------------------------------------
''クリックイベント実行中フラグ
Private m_blnDuringClickEvent   As Boolean

Private Sub Form_Load()
    ''クリックイベント実行中フラグ初期化
    m_blnDuringClickEvent = False
End Sub

Private Sub RichTextBox1_Click()
    Dim form2 As form2
    
    ''クリックイベント実行中の場合
    If m_blnDuringClickEvent = True Then
        '多重起動防止のためクリックイベント実行中は処理終了
        Exit Sub
    End If
    
    ''クリックイベント実行中フラグセット
    m_blnDuringClickEvent = True
    
    ''フォーム生成
    Set form2 = New form2
    ''フォーム表示(モーダル)
    Call form2.Show(vbModal)
    ''フォーム破棄
    Set form2 = Nothing

    ''クリックイベント実行中フラグ初期化
    m_blnDuringClickEvent = False

End Sub
----------------------------------------

4.form2のソース
----------------------------------------
Private Sub Command1_Click()
    Call Unload(Me)
End Sub
----------------------------------------

投稿時間:2004/06/28(Mon) 12:37
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 事象を再現できるコード
私のところでも再現できました。
No.8194 の現象と同じかと思ったのですが
http://support.microsoft.com/default.aspx?scid=kb;ja;JP191859

クリックイベントの途中でモーダルで表示しているから
クリックイベントが完了していないせいかと思うのですが
色々試して見ましたが、今は、マウスのクリックイベントを起こすぐらいしか
見つかりません。

投稿時間:2004/06/28(Mon) 13:32
投稿者名:花ちゃん
Eメール:
URL :http://www.bcap.co.jp/hanafusa/ypcs/
タイトル:
Re: 事象を再現できるコード
Form1 のコードを下記に変更して見て下さい。

Option Explicit
'マウスを擬似的に動作させる(P1044)
Private Declare Sub mouse_event Lib "user32" _
    (ByVal dwFlags As Long, ByVal dx As Long, _
     ByVal dy As Long, ByVal cButtons As Long, _
     ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTUP = &H4      '左ボタンUP
Private Const MOUSEEVENTF_LEFTDOWN = &H2    '左ボタンDown


Private Sub RichTextBox1_Click()
    'マウスの左ボタンを離す  をここに追加
    Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

    Dim Form2 As Form2

これでモーダル表示する前にマウスがUPされますので現象が改善
できるかと思います。

又は RichTextBox1_DblClick イベント内に書けば問題なく動作するようです。

投稿時間:2004/06/28(Mon) 15:59
投稿者名:もるだー
Eメール:
URL :
タイトル:
できました!
教えていただいたコードを追加することで、問題なく動作しました。
この修正を加えることで、フラグによる2重起動チェックも不要になり
コードがすっきりしました!

と思ったら、イベント内に重たい処理+DoEventsとかあると、
多重起動してしまうので、APIとフラグを併用することで
対処できました。
(重たい処理をしているのが悪いんですけど・・・)

ありがとうございました!!
これでぐっすり寝られます。

(-_-)zzZZZZZ

おっと( ゜Д゜)まだ仕事ちゅーでした。

次に私の名前が登場するときは、アドバイザーとして登場する!
という意気込みで頑張ります!