Caché 变量大全 $X 变量
包含光标的当前水平位置。
大纲
代码语言:javascript复制$X
描述
$X
包含光标的当前水平位置。将字符写入设备时,Caché会更新$X
以反映水平光标位置。
输出的每个可打印字符将
X`重置为0(零)。
$X
是16位无符号整数。
- 在非UNICODE系统上,当
$X
的值达到65536时,它会换行为0。换句话说,如果$X
为65535,则下一个输出字符将其重置为0。 - 在UNICODE系统上,
$X
在其值达到16384时换行为0(其余两位用于日语音调编码)。
可以使用set
命令为$X
和$Y
赋值。例如,可以使用特殊的转义序列来改变物理游标位置,而不更新$X
和$Y
的值。在这种情况下,在使用转义序列之后,使用set
将正确的值分配给$X
和$Y
。
注意
NLS字符映射
国家语言支持(NLS)实用程序$X/$Y
选项卡定义当前区域设置的$X
和$Y
光标移动字符。
带终端I/O的$X
下表显示了不同字符对$X
的影响。
Echoed Character | ASCII Code | Effect on $X |
---|---|---|
<FORM FEED> | 12 | $X=0 |
<RETURN> | 13 | $X=0 |
<LINE FEED> | 10 | $X=$X |
<BACKSPACE> | 8 | $X=$X-1 |
<TAB> | 9 | $X=$X 1 |
任何可打印的ASCII字符 | 32-126 | $X=$X 1 |
不可打印的字符(如转义序列) | 127-255 | 参考 Caché ObjectScript. |
OPEN
和USE
命令的S(ECRET)协议关闭回显。它还可以防止$X
在输入过程中被更改,因此它指示真实的光标位置。
WRITE $CHAR()
更改$X
。 WRITE *
不会更改$X
。例如,WRITE $X,"/",$CHAR(8),$X
执行退格(删除/字符)并相应地重置$X
,返回01。相反,WRITE $X,"/",*8,$X
执行退格键(删除/字符),但不重置$X
;它返回02。
使用WRITE*
,可以向终端发送控制序列,$X
仍将反映真实光标位置。由于某些控制序列确实会移动光标,因此可以使用SET
命令直接设置$X
。例如,以下命令将光标移动到数字VT100终端(或等效终端)上的列20和行10,并相应地设置$X
和$Y
:
/// d ##class(PHA.TEST.SpecialVariables).X()
ClassMethod X()
{
SET dy=10,dx=20
WRITE *27,*91,dy 1,*59,dx 1,*72
SET $Y=dy,$X=dx
w $Y,!,$X,!
}
代码语言:javascript复制DHC-APP>d ##class(PHA.TEST.SpecialVariables).X()
10
0
设备执行但不输出的ANSI标准控制序列(如转义序列)可能会在$X
和$Y
值与真实光标位置之间产生差异。要避免此问题,请使用WRITE*
(整数表达式)语法并指定字符串中每个字符的ASCII值。例如,不使用:
WRITE !,$CHAR(27)_"[1m"
WRITE !,$X
使用此等效表:
代码语言:javascript复制 WRITE !,*27,*91,*49,*109
WRITE !,$X
通常,在显式移动光标的任何转义序列之后,应更新$X
和$Y
以反映实际光标位置。
可以使用%SYSTEM.Process类的dx()
方法设置$X
如何处理当前进程的转义序列。可以通过设置Config.Miscellous
类的DX
属性来建立系统范围的默认行为。
$X
,带TCP和进程间通信
当使用WRITE
命令向客户端或服务器TCP设备发送数据时,Caché首先将数据存储在缓冲区中。它还更新$X
以反映缓冲区中的字符数。此计数中不包括ASCII字符<return>
和<line feed>
,因为它们被视为记录的一部分。
如果使用写入刷新$X
缓冲区!命令时,Caché会将$X
重置为0,并将$Y
值递增1。如果使用Write#
命令刷新$X
和$Y
缓冲区,则Caché会将ASCII字符作为单独的记录写入,并将$X
和$Y
都重置为0。