2012-03-29 10 views
1

これは私の問題です: STARTボタンのトリガーでは、1つのブロックを実行することができます。 STOPボタンを押すと実行を停止する必要があります。スタートボタンのtrigerにイベントが発生するまでブロックをREPEATしますか?

例: :

REPEAT: 
    message "hai". 
END. 

と私はSTOPボタンを押すと、それは停止する必要があります。 REPEATブロックにどのような条件を追加する必要がありますか?できれば、STOPボタンTrigerで条件を書いてください。提案をお願いします。

+0

あなたのWAIT-FORはどこですか? –

+0

あなたは正確に何を達成しようとしていますか? –

答えて

2

進捗状況はマルチスレッドではありません。

したがって、どのコンテキストで実行する必要があるかを慎重に考える必要があります。 (私の最初の "それはできない"応答よりも慎重に)

"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. 
+0

完璧なもの...以上何が必要なのですか..thanks .. –

0
DEFINE VARIABLE bStop AS LOGICAL NO-UNDO. 

DEFINE BUTTON butStop LABEL "Stop". 

FORM butStop WITH FRAME but-frame ROW 1. 

ON CHOOSE OF butStop bStop = TRUE. 

ENABLE butStop WITH FRAME but-frame. 

REPEAT: 
    PROCESS EVENTS. 
    MESSAGE "hai". 
    IF bStop THEN LEAVE. 
END. 

MESSAGE "stoped". 

WAIT-FOR WINDOW-CLOSE OF CURRENT-WINDOW. 
+1

このコードは機能しません。繰り返しは実行を継続し、WAIT-FORは実行されません。したがって、ON CHOOSEを実行する機会はありません。 –

+0

試しましたか?あなたはPROCESS EVENTSコマンドについて何かを読んでおくべきです。 ;) – firhang

+0

はい、私はそれを試してみました。だから私はそれがうまくいかないと言ったのです。 –

1

プロセスイベント文のユーザ入力をブロックせず プロセスのすべての未処理のイベントを。あなたは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セッションのコンテキストで例外を発生させることがあります。

+0

これは動作しています..ありがとうございますが、それは1000まで動作しますので、私はちょうどix = 1〜ix + 1を与えました:それは無限の時間に利用可能にしていた... .. –

関連する問題