UserFormメソッド/モードレスダイアログ
Short ComposeForm
モードレス・ダイアログを表示します。
戻り値
成功した場合は0以外が返されます。
なお、旧Version1.0ではフォームがすでに表示されている場合は0を返しましたが、 Version2.0ではエラーとなります。
備考
フォームがすでに表示されていてはなりません。
実際にモードレスダイアログを機能させるには、WaitEvent
メソッドを繰り返し呼び出す必要があります。
モードレスダイアログの場合、チェックボックス、ラジオボタン、リストボックス、コンボボックス、ドロップダウンリストでの選択操作によりイベントが発生するようになります。
DestroyForm
モードレス・ダイアログを終了します。
備考
フォームがすでに表示されている必要があります。
Short WaitEvent(Variant timeout)
モードレス・ダイアログ用イベントループを処理します。
引数
timeoutは10mSec単位の待ち時間を指定します。
省略した場合は待ち時間なしとなります。
指定した時間が経過するか、何らかのコマンド番号が発生すると制御が返されます。
戻り値
何らかのコマンド番号が発生した場合は、待ち時間を待たず、そのコマンド番号を直ちに返します。
チェックボックス、ラジオボタン、リストボックス、ドロップダウンリスト、コンボボックスでの選択操作があった場合にも、 そのコントロール番号のイベントが返されます。
そうでない場合は待ち時間を経過後、NULLを返します。
備考
バックグラウンドで何か処理をしたい場合はtimeout値には小さな値を指定しループ中で処理を行います。
フォームのイベントを待つだけなら大きな値を指定します。
イベントはボタンやウィンドウを閉じる場合はモーダル・ダイアログの場合と同様な戻り値が返ります。
そのほかに、チェックボタンやラジオボタン、リストボックスが操作された場合には、そのコントロール番号が返ります。
イベントがなければNULLが返ります。
SeraphyScriptDialogオブジェクトの基本クラスのDoEventsと同等な機能を果たしますが、 モードレスダイアログのイベントを受け取る場合は、こちらを使ってください。
注意
スクリプトが実行されている同一スレッド上でスクリプト以外によって管理されているウィンドウがある場合、 本メソッドにより、それらのスレッドメッセージもまとめて処理されます。
その結果として、スクリプトの完了を待たずにボタンやメニューなどが操作、実行されうるので、状況により、 擬似的なマルチスレッド的な動作となる場合があり、その副作用には注意してください。
モードレスの例
ソースコード
Option Explicit
Dim obj: Set obj = CreateObject("SeraphyScriptDialog")
Dim frm: Set frm = obj.CreateForm()
frm.FormTitle = "ユーザー情報の入力"
frm.DefineLabel "姓を入れてください"
Dim nEdit1: nEdit1 = frm.DefineEdit()
frm.DefineLabel "名前を入れてください"
Dim nEdit2: nEdit2 = frm.DefineEdit()
Dim btn1: btn1 = frm.DefineButton("了解;キャンセル")
Dim lbl1: lbl1 = frm.DefineLabel("")
frm.Enable(lbl1) = False
dim cnt
frm.ComposeForm()
Do
cnt = cnt + 1
frm.Value(lbl1) = FormatDateTime(Now, vbLongTime) & ":cnt=" & cnt
Dim ret: ret = frm.WaitEvent(100)
If Not IsNull(ret) Then
' コマンド番号あり
If ret = btn1 Then
' 了解ボタン押下か?
Dim name
name = frm.Value(nEdit1) & frm.Value(nEdit2)
If Len(name) > 0 Then
' 空でなければメッセージボックスに表示
obj.MessageBox name, "ユーザ名", 0
Exit Do
Else
obj.MessageBox "ユーザ名を入れてください"
End If
Else
' ×ボタンで閉じたか、キャンセルボタンか?
Exit Do
End If
End If
Loop
frm.DestroyForm()