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

How to clear screen and set cursor position to the end of the screen in cobol

所以我正在尝试制作一个类似表单的屏幕,用户可以在其中输入数据并将其保存在 .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 中,有两种类型的 DISPLAY 语句:一种用于设备,一种用于屏幕。

在OpenCOBOL中,设备和屏幕DISPLAY不能同时使用;如果你尝试,你会发现在第一个屏幕 DISPLAY 之后,设备 DISPLAYs 没有输出。这就是您的示例所发生的情况:CLEAR-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

因为所有的表单数据都可以一次输入。

但是,如果您想保持数据输入不变,您可以通过添加 AT LINE <line-num>:

将设备显示转换为屏幕显示
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

在无法使用 "extended screens" 的当前项目中(由 GnuCOBOL 完成的底层 curses CALL 会重置输出,您不会在程序结束后得到最终结果;其他供应商的 "terminal managers"完全一样)我想 "still kind-of-clear" 屏幕。

可能的选项包括:DISPLAY WORKING-STORAGE-PIC-X-2080-ITEM(您可能需要根据预期的屏幕尺寸进行调整)或(便携性较差)CALL 'SYSTEM' USING 'clear'(我没有尝试过,但这可能有效) .

正如@edward-h 已经指出的那样:如果您对整个程序使用 "extended" SCREEN,其中大部分将自动完成,您还有其他选项,例如 BLANK SCREEN 子句或 [= SPECIAL-NAMES 中的 13=] 允许您获取和设置光标。

但由于屏幕将在程序退出时被删除:您主要想在程序前添加一个 ACCEPT OMITTED(或者,如果您使用的版本不支持此扩展 ACCEPT PIC-X-ITEM-DUMMY)退出。