メッセージボックス表示による処理中断を回避するには?

解決


さとこ  2003-10-21 00:21:24  No: 79887

連続になってしまってすみません。
下の「メッセージボックス自作」に関しての補足(?)になります。

そもそも、メッセージボックスを何故自作しなければならないかと言うと、
メッセージボックスが表示されている間、アプリケーションは処理を中断
しているという現象が問題だからでした。

その現象を回避する方法はあるのでしょうか?
そうすれば自作の必要はないのですが……。
API関数のメッセージボックスを使えば出来るようなのですが、
「APIとは何か?」から始めなければならないので、今ひとつ
仕様方法がわからないのです。
それとも、また別の方法で回避する事は出来るのでしょうか?

何度も書込みをして大変申し訳ありませんが、
ご教授願えれば幸いです。宜しくお願い致します。


吉野  2003-10-21 01:30:58  No: 79888

メッセージボックスを表示している間にアプリケーションが実行されていると、
ユーザからの応答(はい、いいえ、キャンセルなど)はどうするのですか?


ねろ  2003-10-21 02:04:00  No: 79889

>、アプリケーションは処理を中断しているという現象が問題だからでした。
「はい」や「いいえ」を押すまで次の処理に進まないメッセージボックスの
ことを”モーダル”なメッセージボックスと言います。
VBのMsgBoxは”モーダル”なダイアローグボックスです。

一方メッセージボックスが開いていても処理が進むダイアローグボックスを
”モードレス”なダイアローグボックスと言います。
普通は別なフォームをモードレスのダイアローグボックスとして使用します。
詳しくはMSDN  ”モードレス”及び ”モーダル"で検索されたし。


さとこ  2003-10-21 02:07:07  No: 79890

>吉野様

メッセージボックスを表示する呼出元の
アプリケーションはモーダル表示されているので、
他のアプリケーションが動く事はありません。
ユーザからの応答があるまで呼出元のアプリケーションの
操作は受け付けません。

今回困っているのは、アプリケーションが動いている間にも
その端末に他端末から電文が飛んでくるのですが、
メッセージボックスが表示されている間は処理停止となって、
その電文が受け取れないという不具合です。


吉野  2003-10-21 03:20:28  No: 79891

フォームを作った方が早いかも・・・

<設定>
メッセージ、タイトル、アイコン、コマンドボタンの設定情報と戻り値用変数をパブリック変数に持たせます

<フォーム>
イメージコントロールに各アイコン
メッセージ用のラベルのオートサイズをTrueに設定
各コマンドボタンをセット

<フォームロード時>
メッセージをラベルにセット
ラベルの幅からフォームの横幅、ラベルの高さからフォームの高さを設定
ラベルの高さからコマンドボタンの縦位置を設定
後はVisibleプロパティの設定とCaption位です

これで出来ると思います(多分)
細かいところは分かると思いますので省略させて頂きます。
分からなければ言って下さい。


あんだう  2003-10-21 05:30:47  No: 79892

メッセージ表示専用のActiveX.exeを作るのはどうでしょう。

ActiveX.exeの構成として、
・メッセージ表示用フォーム
・制御用クラス
    フォームのShow、Unloadを行うメソッドを記述。
    フォームのShow用メソッドの引数に表示したいメッセージを指定する


Say  2003-10-21 06:22:23  No: 79893

参考  MsgBox関数とMessageBox(API)の動作の違い

Option Explicit
Private Declare Function MessageBox Lib "user32" _
                            Alias "MessageBoxA" _
                            (ByVal hwnd As Long, _
                            ByVal lpText As String, _
                            ByVal lpCaption As String, _
                            ByVal wType As Long) As Long

Private Sub Command1_Click()
    'API
    Dim lngDummy As Long
    Text1.Text = 0
    Timer1.Interval = 300
    Timer1.Enabled = True
    lngDummy = MessageBox(Me.hwnd, "おはよ", "あいさつ", 0&)
End Sub

Private Sub Command2_Click()
    'MsgBox
    Dim lngDummy As Long
    Text1.Text = 0
    Timer1.Interval = 300
    Timer1.Enabled = True
    lngDummy = MsgBox("おはよ", vbOKOnly, "あいさつ")
End Sub

Private Sub Command3_Click()
    'タイマ停止
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    Text1.Text = Text1.Text + 1
    Text1.Refresh
End Sub


ro  2003-10-21 20:22:05  No: 79894

メッセージボックスと似たダイアログフォームを作り
それをモーダブルで表示してる間、元のフォームのEnabledをfalseにすれば
よいのでは


ei  2003-10-21 22:53:34  No: 79895

処理を別スレッドにすればいいのでは?


さとこ  2003-10-22 02:14:15  No: 79896

お答え頂きました内容について、ひとつひとつ仕様者と
検討しました結果、開発上の規約や他の処理からの制約等もあり、
結局別フォームで”メッセージボックスのようなもの”を
作成するのが一番影響も少なく良いであろうという結論に至りました。

吉野様、Say様、ご丁寧に細かく教えて下さいまして
ありがとうございました。
とても助かりました。

皆様、本当にいろいろご教授ありがとうございました。
大変勉強になりました。
今後も宜しくお願い致します。


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

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






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