これは私の問題です: START ボタンのトリガーで、1 つのブロックを実行したいです。そして、STOPボタンを押すと実行が停止するはずです。
例:スタートボタンのトリガー:
REPEAT:
message "hai".
END.
STOPボタンを押すと停止するはずです。REPEATブロックに追加条件は何をつけたらいいですか? できればSTOPボタンのトリガーに条件を書きたくない..提案をお願いします.
これは私の問題です: START ボタンのトリガーで、1 つのブロックを実行したいです。そして、STOPボタンを押すと実行が停止するはずです。
例:スタートボタンのトリガー:
REPEAT:
message "hai".
END.
STOPボタンを押すと停止するはずです。REPEATブロックに追加条件は何をつけたらいいですか? できればSTOPボタンのトリガーに条件を書きたくない..提案をお願いします.
進行状況はマルチスレッドではありません。
そのため、偽装するには、どのコンテキストでどのコードを実行する必要があるかを慎重に検討する必要があります。(私の最初の「それはできません」という回答よりも慎重に。)
「firhang」が指摘するように、「PROCESS EVENTS」を使用して、キューに入れられ、処理の準備ができているイベントを確認できます。
そのため、イベント ハンドラー内でループを実行し、そのイベント ハンドラーに追加のイベントをリッスンさせることができます。
以下は元の質問を満たし、GUI クライアントとキャラクター クライアントの両方で機能すると思います。
define variable i as integer no-undo.
define variable bStop as logical no-undo.
define button butStart label "Start".
define button butStop label "Stop".
form butStart butStop with frame but-frame row 1.
on choose of butStop bStop = true.
on choose of butStart do:
bStop = false.
do while bStop = false:
i = i + 1.
process events.
message i.
end.
message "Paused".
end.
enable butStart butStop with frame but-frame.
pause 0 before-hide.
wait-for window-close of current-window.
PROCESS EVENTS ステートメント ユーザー入力をブロックせずに、すべての未解決のイベントを処理します。
構文
プロセスイベント
例 このプロシージャは、STOP を選択するまで 1,000 までカウントします。
r-proevs.p
DEFINE VARIABLE ix AS INTEGER NO-UNDO.
DEFINE VARIABLE stop-sel AS LOGICAL NO-UNDO.
DEFINE BUTTON stop-it LABEL "STOP".
DISPLAY stop-it.
ON CHOOSE OF stop-it
stop-sel = TRUE.
ENABLE stop-it.
DO ix = 1 TO 1000:
DISPLAY ix VIEW-AS TEXT.
PROCESS EVENTS.
IF stop-sel THEN LEAVE.
END.
ループを通過するたびに、プロシージャーは ix の新しい値を表示し、処理を待機しているイベントがあるかどうかをチェックします。イベントが発生していない場合は、実行が続行され、ループが繰り返されます。STOP ボタンが選択された場合、そのイベントは stop-sel の値を変更して処理されます。実行が継続すると、プログラムはループを終了します。
ループに PROCESS EVENTS ステートメントが含まれていない場合、choose イベントは処理されず、ix が 1,000 になるまでループが繰り返されます。
注 WAIT-FOR ステートメントは、保留中のすべてのイベントを処理し、指定されたイベントが発生するまで他のすべての実行をブロックします。PROCESS EVENTS ステートメントは保留中のすべてのイベントを処理し、すぐに次のステートメントの実行を続行します。PROCEDURE-COMPLETE イベントを受信したが、まだ処理されていない非同期要求がある場合、このステートメントは、WAIT-FOR ステートメントの説明に従ってこれらのイベントを処理します。ABL で .NET メソッド system.Windows.Forms.Application:DoEvent( ) を呼び出すことはできません。PROCESS EVENTS ステートメントは、このメソッドの機能を実行します。.NET は、このステートメントの実行時に ABL セッションのコンテキストで例外を発生させることができます。