如何在cobol中清除屏幕并将光标位置设置到屏幕的末尾

如何在cobol中清除屏幕并将光标位置设置到屏幕的末尾,cobol,gnucobol,Cobol,Gnucobol,因此,我尝试制作一个类似于屏幕的表单,用户在其中输入数据并将其保存在.txt文件中。我正在使用OpenCobolIDE,目前遇到了一些问题 在清除屏幕过程中。我在控制台屏幕上制作了一种表单,当用户输入数据时,我会用变量的新值刷新它,但是光标位置把我搞砸了,因为在我清除屏幕后,它会重置到控制台屏幕的开头,我希望在这个过程之后,它能转到我要显示的文本的末尾。我的解释可能令人困惑,但我希望您能从代码中理解我的观点: IDENTIFICATION DIVISION. PROGRAM-ID.PGM001.

因此,我尝试制作一个类似于屏幕的表单,用户在其中输入数据并将其保存在.txt文件中。我正在使用OpenCobolIDE,目前遇到了一些问题 在清除屏幕过程中。我在控制台屏幕上制作了一种表单,当用户输入数据时,我会用变量的新值刷新它,但是光标位置把我搞砸了,因为在我清除屏幕后,它会重置到控制台屏幕的开头,我希望在这个过程之后,它能转到我要显示的文本的末尾。我的解释可能令人困惑,但我希望您能从代码中理解我的观点:

IDENTIFICATION DIVISION.
PROGRAM-ID.PGM001.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 WS-DATA
    02 WS-ID    PIC X(03) VALUE SPACES.
    02 WS-NAME  PIC A(15) VALUE SPACES.
    02 WS-PHONE PIC X(09) VALUE SPACES.
SCREEN SECTION.
01 CLEAR-SCREEN.
    02 BLANK SCREEN.
PROCEDURE DIVISION.
MENU.
    DISPLAY "ID........:" WS-ID.
    DISPLAY "NAME......:" WS-NAME.
    DISPLAY "PHONE.....:" WS-PHONE.
    DISPLAY "-----------".

    DISPLAY "ID:".
    ACCEPT WS-ID FROM CONSOLE.

    DISPLAY CLEAR-SCREEN.
    DISPLAY "ID........:" WS-ID.
    DISPLAY "NAME......:" WS-NAME.
    DISPLAY "PHONE.....:" WS-PHONE.
    DISPLAY "-----------".

    DISPLAY "NAME:".
    ACCEPT WS-NAME FROM CONSOLE.

    DISPLAY CLEAR-SCREEN.
    DISPLAY "ID........:" WS-ID.
    DISPLAY "NAME......:" WS-NAME.
    DISPLAY "PHONE.....:" WS-PHONE.
    DISPLAY "-----------".

    DISPLAY "PHONE:".
    ACCEPT WS-PHONE FROM CONSOLE.

    DISPLAY CLEAR-SCREEN.
    DISPLAY "ID........:" WS-ID.
    DISPLAY "NAME......:" WS-NAME.
    DISPLAY "PHONE.....:" WS-PHONE.
    DISPLAY "-----------".

    STOP RUN.
END-PROGRAM PGM001.

所以你会注意到,我一直在清除屏幕并在表单中显示,但当我这样做时,光标移到屏幕的开头,我无法继续输入数据。有人能帮我吗?cobol中是否有移动光标的命令

在COBOL中,有两种类型的显示语句:用于设备的显示语句和用于屏幕的显示语句

在OpenCOBOL中,设备和屏幕显示不能同时使用;如果尝试,您会发现在第一次屏幕显示后,设备显示没有输出。这就是您的示例:CLEAR-SCREEN是在SCREEN部分定义的,因此DISPLAY CLEAR-SCREEN是一种屏幕显示

您可以通过在屏幕部分中定义输入表单来解决此问题:

SCREEN SECTION.
01  form BLANK SCREEN.
    03  VALUE "ID.........".
    03  COL + 2, PIC X(03) TO WS-ID.
    03  LINE + 1, VALUE "NAME.......".
    03  COL + 2, PIC A(15) TO WS-NAME.
    03  LINE + 1, VALUE "PHONE......".
    03  COL + 2, PIC X(09) TO WS-PHONE.
    03  LINE + 1, VALUE "-----------".
除了工作之外,这还有一个额外的优势,即程序划分可以简化为

 DISPLAY form
 ACCEPT form
因为所有表单数据都可以一次性输入

但是,如果您希望保持数据输入的原样,可以通过在第行添加以下内容将设备显示转换为屏幕显示:


在当前无法使用扩展屏幕的项目中,GnuCOBOL执行的底层curses调用会重置输出,并且在程序结束后,您不会更改最终结果;其他供应商的终端经理也做了同样的事情,我想还是要清理一下屏幕

可能的选项包括:DISPLAY WORKING-STORAGE-PIC-X-2080-ITEM您可能希望根据预期的屏幕大小调整此选项,或者使用“clear”来调整便携式呼叫“SYSTEM”我没有尝试过,但这可能会起作用

正如@edward-h已经指出的那样:如果您使用扩展屏幕来完成整个程序,那么大部分操作都将自动完成,并且您还有其他选项,如空白屏幕子句或游标是特殊名称中的关键项,允许您获取和设置游标


但由于程序退出时屏幕将被删除:您主要希望添加一个接受或省略,如果您使用的版本不支持此扩展,请在程序退出之前接受PIC-X-ITEM-DUMMY。

如果您使用的是最新版本的OCIDE for Windows,您可能已经使用了GnuCOBOL 1.1,您可以在首选项和“关于”对话框中对此进行检查。如果不是,我建议至少升级到GnuCOBOL 1.1或最近的开发快照。我尝试了第二种方法,但光标仍在等待第一行的输入,而不是屏幕的末尾。我是否也必须在ACCEPT语句中指定行或类似的内容?@levi moraes是的,您将:ACCEPT。。。在第5行,第5列应该起作用。
DISPLAY "ID........:" WS-ID AT LINE 1
DISPLAY "NAME......:" WS-NAME AT LINE 2
DISPLAY "PHONE.....:" WS-PHONE AT LINE 3
DISPLAY "-----------" AT LINE 4

DISPLAY "ID:" AT LINE 5
ACCEPT WS-ID AT LINE 5, COL 5