【问题标题】:Loop while public void in class is false类中的公共无效为假时循环
【发布时间】:2020-05-13 16:15:19
【问题描述】:

我正在尝试找出正确的语法,以便在类返回 false 时循环以获取正确的用户输入。

validate.cls file

******DEFINITIONS and other code********

METHOD PUBLIC VOID isEntryCorrect (INPUT userEntry AS CHARACTER):
    DEFINE VARIABLE cLogical as LOGICAL NO-UNDO.
    IF userEntry = "wrong" THEN
        DO:
            cLogical = FALSE.
    END.
    ELSE IF userEntry = "right" THEN 
        DO:
            cLogical = TRUE.
    END.

END METHOD.

有一个 .w 文件在按钮单击时接受用户输入并将 FILL-IN:SCREEN-VALUE 分配给一个变量,然后将其传递给类中的方法。

UserInput.w file

****class definition***
DEFINE VAR userInput as validate NO-UNDO.
userInput = NEW validate("").

****local variable definition****
DEF VAR windowInput AS CHARACTER NO-UNDO.
DEF VAR iCount as INTEGER NO_UNDO INITIAL 0.

windowInput = FILL-IN:SCREEN-VALUE.

但是那个 windowInput 需要传递给方法。这就是我卡住的地方。

当方法为假时,我需要程序循环并不断要求用户输入正确的字符串,但我似乎无法找出正确的语法,或者我的思路有误。

我的想法是,我可以使用 DO WHILE 来保持循环并终止计数器。

****the incorrect code*****
DO WHILE userInput:isEntryCorrect(windowInput) <> TRUE OR iCOunt = 3:

     windowInput = FILL-IN:SCREEN-VALUE.
     iCount = iCount + 1.
END.

如果这确实有效,它可能会一直循环直到数到三,然后继续执行程序的其余部分。

【问题讨论】:

    标签: openedge progress-4gl


    【解决方案1】:

    您的类方法需要返回一个 LOGiCAL 值,而不是 VOID:

    METHOD PUBLIC LOGICAL isEntryCorrect (INPUT userEntry AS CHARACTER):
        DEFINE VARIABLE cLogical as LOGICAL NO-UNDO.
        IF userEntry = "wrong" THEN
            DO:
                cLogical = FALSE.
        END.
        ELSE IF userEntry = "right" THEN 
            DO:
                cLogical = TRUE.
        END.
    
        RETURN cLogical . 
    
    END METHOD.
    

    或者只是

    METHOD PUBLIC LOGICAL isEntryCorrect (INPUT userEntry AS CHARACTER):
        DEFINE VARIABLE cLogical as LOGICAL NO-UNDO.
        IF userEntry = "wrong" THEN
            RETURN FALSE . 
        ELSE IF userEntry = "right" THEN 
            RETURN TRUE . 
    
        RETURN ? . 
    
    END METHOD.
    

    您的 DO WHILE 块将正常工作。但是,为了允许用户在迭代之间更改值,您需要一个输入阻塞语句。

    非常老式的应该是:

    UPDATE FILL-IN .
    

    PROMPT-FOR FILL-IN . 
    

    当您的编码风格更多是事件驱动时(WAIT-FOR 语句),您不会在 DO WHILE 块中执行此操作。您将在触发器中执行此操作,以填充填充的 LEAVE 事件,然后计数到 3。

    【讨论】:

    • 当 userinput.w 是 AppBuilder DIALOG-FRAME 程序时,您将不得不接受我最后的建议。您必须使用 LEAVE 触发器或 CHOOSE OK 按钮触发器,而不是在外观中执行 UPDATE 或 PROMPT-FOR。当验证失败时,您使用 RETURN NO-APPLY 结束触发块。
    • @Bazilby 其他问题最好作为问题提出。不是 cmets。
    猜你喜欢
    • 2011-09-03
    • 2017-06-08
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2019-07-28
    相关资源
    最近更新 更多