这是我的问题: 在START按钮的三分之一处,我想执行一个块。并且我应该停止执行 按STOP按钮。
例如 在开始按钮的三角形上:
REPEAT:
message "hai".
END.
当我按下STOP按钮时它应该停止。我应该给REPEAT块什么附加条件?最好我不想在STOP按钮Triger中写条件。请给出建议。
答案 0 :(得分:2)
进展不是多线程的。
因此,您必须仔细考虑需要在哪些上下文中执行哪些代码才能伪造它。 (比我最初的“无法做到的”回复更仔细。)
正如“firhang”指出“过程事件”可以用来检查排队等待准备好的事件。
因此,您可以在事件处理程序中运行循环,并让该事件处理程序侦听其他事件。
我相信以下内容满足原始问题,并且可以在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.
答案 1 :(得分:1)
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会话的上下文中引发异常。
答案 2 :(得分: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.