热门搜索 :
考研考公
您的当前位置:首页正文

力控指南-第五章-动作脚本

来源:东饰资讯网
第五章 动作脚本

力控提供动作脚本以增强对应用程序控制的灵活性。比如,用户可以在按下某一个按钮,打开某个窗口或当某一个变量的值变化时,用脚本触发一系列的逻辑控制、联锁控制,改变变量的值、改变图形对象的颜色、大小,控制图形对象的运动等等。

5.1动作脚本类型

所有动作脚本都是事件驱动的。事件可以是数据改变、条件、鼠标或键盘、计时器等等。处理顺序由应用程序指定。不同类型的动作脚本决定在何处以何种方式加入控制。

执行动作与图形对象直接相关的脚本,称作对象动作脚本。对象动作脚本分为触敏性动作脚本和一般性动作脚本。

触敏性动作脚本在图形对象被点击(左键)时执行。一般性动作脚本在图形对象所在窗口被打开、打开期间和关闭时执行(即使窗口被隐藏或被覆盖时仍然执行,在窗口被关闭后,停止执行)。

若要加入对象动作脚本,选中图形对象后双击鼠标,在“动画连接”对话框中选择“触敏动作-左键动作”或“杂项-一般性动作”。

另一种类型的脚本是命令型动作脚本,这种脚本用于创建位于Draw的“特殊功能[S]/动作”菜单项中的各种动作脚本:窗口、应用程序、数据改变、键和条件等。菜单位置如下图所示:

也可以在Draw的导航器中启动命令型动作脚本的定义过程,如下图:

5.2 对象动作脚本

图形对象的触敏性动作脚本可用于完成界面与用户之间的交互式操作,而图形对象的一般性动作

脚本可用于完成程序逻辑对图形对象本身各种属性改变的控制(例如,按照某种条件的变化实现对图形对象动态地显示或隐藏)或其它控制。

若要创建触敏性动作脚本,请执行以下步骤:

1、创建要加入动作脚本的图形对象。

2、双击对象,出现动画连接对话框。

3、在动画连接对话框中选择“触敏动作-左键动作”,弹出动作脚本编辑器:

在脚本编辑器内编写脚本语言。

举例:

1、在Draw中的当前窗口画面中,创建一个矩形对象。

2、双击矩形,进入动画连接对话框,选择“触敏动作-左键动作”,弹出触敏性动作脚本编辑器。

3、在“按下鼠标”脚本编辑器中,填写脚本如下:

this.FColor=255;

“鼠标按着周期执行”编辑器中,填写脚本如下:

a=a+5;

“释放鼠标”编辑器中,填写脚本如下:

this.FColor=0;

4、单击“确认”按钮。如要求定义变量a ,定义变量a 为中间变量。

5、在画面上建立一个变量显示对象,显示变量 a 的值。

6、在Draw中将画面“保存”,然后单击“运行”,进入运行系统VIEW下,观看动作效果。

此时,用鼠标左键点击该矩形(矩形填充颜色变为黑色),按着鼠标一段时间,观看a值的变化效果,释放鼠标,可以看到矩形颜色变为红色。

若要创建一般性动作脚本,请执行以下步骤:

1、创建要加入脚本的图形对象。

2、双击对象,进入动画连接对话框。

3、在动画连接对话框中选择“杂项-一般性动作”。弹出一般性动作脚本编辑器:

举例:

1、在Draw中的当前窗口画面中,创建一个矩形对象。

2、双击矩形,进入动画连接对话框,选择“杂项- 一般性动作”,弹出一般性动作脚本编辑器。

3、打开“运行中周期执行”编辑区域。

4、输入脚本如下:

IF c==100 THEN

Show()

ELSE

Hide()

ENDIF

5、点击“保存”,如c 变量没有事先定义,则出现对话框如下:

6、点击“确认”,进入变量定义对话框:

7、定义变量c为中间变量。并在画面上建立一个变量输入/显示对象,在运行系统下可以设置和显示变量 c 的值。

8、“运行”系统,在刚才的窗口下,c变量的初始值是0,矩形是隐藏的,设置c变量的值为100,矩形就显示了出来。

5.3 应用程序动作脚本

应用程序动作脚本的作用范围为整个应用程序,可以在这种脚本中调用其他应用程序、完成数值计算等。若要创建应用程序动作脚本,请选择“特殊功能[S]/动作/应用程序”菜单命令。

根据执行条件应用程序动作脚本有三种:

进入程序:在应用程序启动时执行一次。

程序运行周期执行:在应用程序运行期间周期性的执行。周期可以指定.

退出程序:在应用程序退出时执行一次。

举例:

1、首先按照第二章步骤定义中间变量c。

2、然后,选择Draw的菜单“特殊功能-应用程序动作”,打开脚本编辑器:

3、在“进入程序”脚本区域,输入脚本:

c=0;

在“程序运行周期执行”脚本区域,输入脚本:

IF c<=100 THEN

c=c+10;

ELSE

c=0;

ENDIF

4、 单击“确认”。

5、在画面上建立一个变量显示文本对象,在运行系统下可以显示变量 c 的值。

6、在Draw中点击“运行”按钮,进入VIEW运行系统,在刚才的画面窗口中观察c变量的变化。该变量将从0,10,20,….一直到110,然后返回又从0开始。

5.4窗口动作脚本

窗口动作脚本的作用范围为窗口。若要创建窗口动作脚本,请选择菜单命令“特殊功能[S]/动作/窗口”菜单项。

根据执行条件窗口动作脚本有三种:

进入窗口:开始显示窗口时执行一次。

窗口运行时周期执行:在窗口显示过程中以指定周期执行。

退出窗口:在窗口关闭时执行一次。

5.5 数据改变动作脚本

数据改变动作脚本以变量的数值改变作为触发事件。每当变量的数值发生变化时,脚本执行一次。若要数据改变动作脚本,选择菜单命令“特殊功能[S]/动作/数据改变”,出现数据改变动作脚本编辑器:

变量名:在此项中输入变量名或变量名字段。

已定义动作:这个下拉框中可以列出已经定义了数据改变动作的变量的列表,可以选择其中一个变量以修改脚本。

举例:

1、首先按照5.3节示例,定义C变量及其变化规律。

2、在窗口上画一个圆,如图:

3、用鼠标右键单击该图形对象,出现右键菜单。如图:

4、选择“对象命名”,定义该圆名称,如“round”。

5、然后,选择Draw的菜单“特殊功能-动作-数据改变”,打开对话框如下:

6、定义一个和变量C相应的数据改变动作,脚本如下:

#round.FColor=#round.FColor+5;

上述脚本含义:只要变量C发生变化,就执行上述语句一次。也就是说,对象round的填充颜色值有上述变化。

7、单击“确认”,该C变量对应的数据改变动作已经定义完毕。

8、在Draw中,单击“运行”,进入VIEW运行状态。可以看到,名叫“round”的圆形的填充颜色,随着c值的改变而改变。

5.6 键动作脚本

键动作脚本以键盘按键的动作作为触发事件。若要创建键动作脚本,选择菜单命令“特殊功能[S]/动作/键”菜单项,出现键动作脚本编辑器:

根据执行条件键动作脚本有三种:

键按下:在键按下瞬间执行一次。

按键期间周期执行:在键按下期间循环执行,执行周期取决与“系统参数”里的“动作周期”时间参数。

键释放:在键释放瞬间执行一次。

5.7 条件动作脚本

条件动作脚本以变量或逻辑表示式的条件值为触发事件。当条件值为真时、为真期间、为假时和为假期间执行条件动作脚本。若要创建条件动作脚本,选择菜单命令“特殊功能[S]/定义动作/条件”菜单项,出现条件动作脚本编辑器:

名称:此项用于指定条件动作脚本的名称。单击后面的“...”按钮,会自动列出已定义的条件动作脚本的名称。

条件执行的时机有4种:当条件为真时、为真期间、为假时和为假期间执行脚本。对于为真期间和为假期间执行的脚本,需要指定执行的时间周期。

说明:此项用于指定对条件动作脚本的说明。此项内容可以不指定。

条件选择:有2种条件,自定义条件和预定义条件。对于自定义条件,需要在条件对话框内输入条件表达式。如果要使用预定义条件,选择“预定义”按钮,这时自定义条件的条件表达式的输入框自动消失,同时显示出“预定义条件”选择按钮,单击此按钮,出现如下对话框:

预定义条件目前提供了“过程报警”、“设备故障”和“数据源故障”几种类型。选择某一种条件类型,并具体指定其他条件。

动作:有2种动作,自定义动作和预定义动作。对于自定义条件,需要在自定义动作对话框内输入动作脚本。如果要使用预定义动作,单击按钮“预定义动作”,出现如下对话框:

预定义动作包含以下几种:

记录:选择此项后,当条件满足时,将形成事件记录。

标准报警声音:选择此项后,当条件满足时,系统将发出标准报警声音。

系统报警窗提示:选择此项后,当条件满足时,系统将显示报警窗口。

弹出提示框:选择此项后,当条件满足时,系统将弹出一个提示对话框。

打开窗口:选择此项后,当条件满足时,系统将打开窗口。要打开的窗口可以指定。

语音提示:选择此项后,当条件满足时,系统将播放一个语音文件。语音文件可以指定。

打印:选择此项后,当条件满足时,系统将把所发生的条件的描述信息输出到打印机上。

以上预定义动作可以同时选择一个或多个。

自定义动作和预定义动作可以同时指定,运行时将同时动作。

注意:预定义动作不能在条件“为真期间”或“为假期间”时选择。

5.8 脚本编辑器

在Draw中,各种脚本类型所用的脚本编辑器对话框的形式大体相同,我们以键动作脚本为例来说明脚本编辑器的使用。

菜单

此菜单命令用于将编辑器内的文本内容保存到文本文件中或从文件中读入文本内容。

激活此“保存到文件(S)”命令,弹出对话框:

在输入项“文件名()”内输入您要保存的文件名称,单击“保存(S)”按钮,编辑器内的文本内容则被保存到指定的文本文件中。反之亦然。

此菜单中包含一组常用的编辑命令,可用于完成“剪切”、“复制”、“粘贴”、“删除”、换”、“全部选择”等操作。

例如:选择“查找”菜单,出现“替换”对话框:

工具按钮

:一旦输入完脚本,请单击此按钮。对话框将保存脚本内容然后关闭。

:单击此按钮关闭对话框并取消当前输入。

/替“查找:单击此按钮保存脚本内容。

:单击此按钮删除编辑器中的全部文本内容。删除的内容并不保存到剪切板上,删除操

作也不能撤消。

:选择后进入函数选择列表框:

选择所需的函数,单击“选择”按钮或者直接双击函数名,函数表达式自动被添加到编辑器中(当您选择一个函数时,在说明中将自动给出这个函数的帮助信息和用法示例)。

:单击此按钮后出现窗口选择对话框:

选择一个窗口名称后,单击“确定”按钮或双击窗口名称,窗口选择对话框关闭,在脚本中插入被选择的窗口的名称。

:单击此按钮后出现变量选择对话框:

选择一个变量名称后,单击“选择”按钮,变量选择对话框关闭,在脚本中插入被选择的变量。

:单击此按钮后出现字段选择对话框:

选择一个字段后,单击“选择”按钮或双击字段名称,字段选择对话框关闭,在脚本中插入被选择的字段。

:单击这些块功能按钮在当前光标处向脚本插入标准语句块。

单击这些文本按钮在当前光标处向脚本加入以上算术运算符、逻辑运算符、注释符。

5.9 动作脚本语言

动作脚本就是用动作脚本语言编写的一段程序。动作脚本语言是力控开发系统Draw提供的一种自行约定的内嵌式程序语言。它是一种类似BASIC和C的高级语言。本节介绍该语言的语法及用法。

动作脚本语言支持赋值、数学运算等基本语法,也可以书写由IF-ELSE-EDIF等语句构成的带有分支结构的程序脚本。

5.9.1 表达式

在脚本中所用的句法与通常的四则运算相似。大多数的表达式可能是如下的形式:

a = 32; //表达式1

a = a+1; //表达式2

a = (b-c)*32/d; //表达式3

#rectangle1.fColor = 8; //表达式4

@idirect = @lic101.pv ; //表达式5

a = rand(10); //表达式6

每个表达式把等号(=)右边表达式的值赋给左边的变量。表达式以分号(;)结束。表达式中操作数必须是常量或变量。在赋值运算符(=)的左边必须是单个变量名。

表达式4“#rectangle1.fColor = 8;”以符号“#”开头,表示其后面的有效符号为图形对象名称。在此例中rectangle1是一个填充矩形的对象名称,fColor是它的属性字段,代表它的填充颜色。这个表达式的运行结果是将一个名为rectagnle1的填充矩形的填充颜色置为编号为8的颜色。在这里,我们解释一下图形对象及其属性字段的概念。在开发系统中,包括从简单图形(如:线、矩形等)到标准图形(如:趋势、报警记录等)都可以视为图形对象。每一种对象都有一些共同属性和专有属性。比如:所有的图形对象都存在着位置坐标属性;而填充类型的图形对象还有边线颜色或填充颜色等属性。在运行时,对象的属性可以通过改变其属性字段的值而动态改变。属性字段的引用格式为“对象名.字段名”。当在对象动作脚本中引用对象本身属性字段时,可以用“this”代表对象本身,即“this.字段名”。另外,当表达式中涉及图形对象名称时,图形对象名称必须以“#”符号开头。

下面给出几个实例:

#Tred1.tr_euhi = 100 ; //Tred1是一个趋势对象的名称

#Caledar1.Day = 29 ; //Caledar1是一个ActiveX控件对象的名称

Tag1 = #Caledar1.Year ; //Tag1是一个普通变量的名称

表达式5“@indirect = @lic101.pv ;”在变量名称前面加上了符号“@”表示这个表达式不是一个赋值操作,是一个变量代换操作。这个表达式说明,indirect是一个间接变量,经过这种变量代换后,变量indirect和lic101.pv的数值和行为即变为完全一致。改变indirect的数值就等于改变lic101.pv的值,改变lic101.pv的数值就等于改变indirect的值,这种效果将一直保持,直到indirect变量被代换为其它变量。

表达式6“a = rand(10);”中“rand()”是动作脚本语言提供的一个函数。力控动作脚本语言提供了内容丰富的函数集,有关函数的内容可查阅参考手册。

5.9.2 算术与逻辑运算

Draw提供了基本的赋值、算术运算、逻辑运算功能。

例如:

rad = 300 ;

把数值300赋值给变量rad。

Area = 3.14 * rad * rad ;

这是一个面积计算公式。其结果赋值给代表面积的变量Area。

操作符

除简单的赋值、数学运算外,Draw还支持其它几种对操作数(操作数包括变量、数字等)操作的操作符。

单目操作符:

单目操作符是指只允许有一个操作数参与运算的操作符。

~ 取反

! 逻辑非

双目操作符:

双目操作符是指有两个操作数参与运算的操作符。

* 乘

/ 除

+ 加

- 减

= 赋值

% 取余

** 乘方

^ 异或

& 按位与

| 按位或

&& 逻辑与

|| 逻辑或

= 赋值

< 小于

<= 小于等于

== 等于

<> 不等于

> 大于

>= 大于等于

操作符优先级

下面列出了操作符的优先级次序。第一行操作符为第一级,第二行为第二级等等。同一行的操作符具有相等的优先级。操作符由最高优先级向最低优先级次序列出(当操作符优先级相同时运算顺序按表达式从左到右的顺序进行)。

高优先级

()

~,!

**

*,/,%

+,-

>,>=,<,<=

==,<>

&

^

|

=

AD

OR

低优先级

操作符说明

以上列出的操作符参数可以是数字或变量。在参数外加括号是可选的,而且操作符名称不区分大小写。

括号():

括号主要用于限制和调整运算次序。

举例:a+b*c 运算次序为a+(b*c)

若要先运算a+b,然后再与c相乘。只需写成(a+b)*c即可。

按位取反(~):

每一个数值变量的值都可以写成一串二进制串。按位取反就是将这串二进制串的每一位进行取反。

举例:a=7;

b=~a; b的值为65528,即其二进制为:1111111111111000

乘方(**):

对一个数值型数据进行乘方运算。

举例:a=3**; a的最后结果为9

加(+),减(-),乘(*),除(/):

这些二元操作符执行基本的数学操作。加号(+)也可以用于连接字符串型变量。

举例:a = “Hello” + “ Draw !” ;

a的内容是“Hello Draw !”

模除(%):

取余是用第一个操作数去除另外一个操作数所得的余数。

举例:a=73%8 a的结果为1。

按位与(&):

参与按位与的两个量都需要是整型的。按位与的实质是把参与“与”操作的两个量所对应的二进制进行按位与操作。

举例:a=3&4 a是整型量,a的结果为0

按位或(|)异或(^):

参与按位或和异或的两个量都需要是整型的。按位或和异或的实质是把参与“或”操作的两个量所对应的二进制进行按位或或者是异或操作。

举例:a=3|4 a是整型量,a的结果为7

a=3^2 a的结果为1

数学比较操作符(<、<=、>、>=、<>、==):

数学比较操作符常常用在IF ELSE EDIF等表示判断的语句中,当放在该判断语句中的条件成立时,系统将要执行条件成立时的一串语句,当条件不成立时,系统将执行与条件不成立相对应的语句。

与(&&)、或(||)、非(!):

这些操作是对离散量进行操作的。如果操作数是整型的或者是实型的,它们按照下面的格式进行转化。

实型对离散量的转化:如果实型是0.0,转化的结果为0。否则转化的结果为1。

整型对离散量的转化:如果整型的值为0,转化的结果为0,否则转化的结果为1。

5.9.3 程序结构

除了顺序程序结构外,脚本还具有以IF-THEN-ELSE为基础的分支程序结构和循环结构

利用IF-THEN-ELSE语句,您可以构建各种复杂脚本程序。利用循环语句,则可以创建更为灵活的程序控制。

分支程序结构

下面是IF-THEN-ELSE的一个例子:

IF Fliuid_tempture > 98 THEN

Flag_Alerm=1;

Out_Message=“温度超高”

PlaySoud(“Alert.wav”,0);

ELSE

Out_Message=“温度正常”;

EDIF

在这个例子中,当液体温度超过98摄氏度时,报警标志位为1,系统发出声音报警。否则系统的输出信息为“温度正常”

注意:每个IF表达式都需要一个ENDIF作为结束标志,即IF与ENDIF是配对使用的。

IF-THEN-ELSE表达式用于在不同条件下执行不同的指令。下列关系操作符经常用于设置IF-THEN-ELSE表达式的条件:

< 小于

> 大于

<= 小于或等于

>= 大于或等于

<> 不等于

下面举出了一些用IF-THEN-ELSE表达式编写的程序示例:

IF-THEN表达式,无ELSE子句:

IF Fliuid_tempture > 98 || Fliuid_tempture < 60 THEN

Out_Message=“温度不正常”;

Playsoud(alert.wav);

EDIF

IF-THEN-ELSE表达式,含一个ELSE子句:

IF Fliuid_tempture > 98 || Fliuid_tempture < 60 THEN

Out_Message=“温度不正常”;

Playsoud(alert.wav);

ELSE

Out_Message=“温度正常”;

EDIF

IF-THEN-ELSE表达式,有一个ELSE IF子句和一个ELSE子句:

IF Fliuid_tempture > 98 THEN

Out_Message=“温度过高”;

Playsoud(alert1.wav);

ELSE IF Fliuid_tempture < 60 THEN

Out_Message=“温度过低”;

Playsoud(alert2.wav);

ELSE

Out_Message=“温度正常”;

EDIF

EDIF

循环结构

力控提供两种循环语句,WHILE 循环和FOR循环,循环语句一般配合数组使用。在变量一章,我们介绍了间接变量的数组概念,这里结合循环语句介绍一下:

注意:在数组元素使用前,首先要对其指向的变量进行指定,然后才可以对其进行各种操作。否则对数组元素的引用或操作将无意义。这里是一个数组循环的使用举例:

求数值型变量A,B,C,D,E的最大值。(IndirVar为一间接变量)

IndirVar[0] = &A;

IndirVar[1] = &B;

IndirVar[2] = &C;

IndirVar[3] = &D;

IndirVar[4] = &E;

n = 0;

Max = IndirVar[0];

WHILE n < 5 DO

IF (IndirVar[n] > Max) THEN

Max = IndirVar[n];

ENDIF

n = n + 1;

ENDWHILE

WHILE循环

WHILE 的语法为:

WHILE 条件表达式 DO

执行体

ENDWHILE

示例:

n = 0;

m = 1;

WHILE n < 10 DO

m = m * n;

n = n +1;//n为循环控制变量

ENDWHILE

FOR循环

FOR的语法为:

FOR I = E1 TO E2 [STEP E3]

执行体

NEXT

说明:

上述语法结构中的变量或表达式含义如下:

I为循环控制变量,必须为整型,一般应为中间变量,或窗口中间变量。

E1 为I的初值表达式。

E2 为I的上限。

E3 为循环控制变量I的增量表达式。

FOR TO STEP NEXT 为FOR循环保留字。

中括号中的STEP E3可以省略,如果没有STEP子句,增量缺省为1。

注意:初值表达式E2, 增量表达式E3在进入循环时对其求值一次,循环中不在计算。

示例1:

m = 0;

FOR I = 0 TO 3

m = m+1;

NEXT

在上例中,循环次数为3,I每次增量为1。第一次循环I 取值为 0。第二次循环I 取值为 1。第三次循环I 取值为 2。执行完后m的值为3。

示例2:

m = 0;

FOR I = 0 TO 10 STEP 2

m = m+1;

NEXT

在上例中,循环次数为5,I每次增量为2。示例3:

m = 0;

FOR I = 0 TO I + 10 STEP I + 2

m = m+1;

m = m+1;

执行完后m的值为5。

NEXT

在上例中,I上限为10,循环增量为2。循环次数为5,I每次增量为2。执行完后m的值为10。

多分支结构

多分支语句用来实现多分支选择,它能够根据表达式的值来决定控制的转向,即根据表达式的值,来决定执行几组语句中的其中之一。IF语句可以实现两路选择,而实际情况却经常需要多分支的选择。如根据炉膛温度的不同范围(如320~330;330~340;340~350;...),采取不同的处理方案。通过一条Switch语句可以清晰的对各种情况进行处理。虽然IF语句嵌套也能实现,但是层数多,不直观,可读性差。

语法:

Switch (E)

[Case c-1:

[statements-1]] ...

[Case c-i:

[statements-i]] ...

[Case c-n:

[statements-n]] ...

[Default:

[elsestatements]]

EndSwitch

说明:

E,Switch括号内的E为必有参数。为数值表达式。 当该表达式的值与下面哪一个Case语句中的常量匹配时,就将转向执行那个Case后的语句。

c-1,...,c-n, 一般为一常量,也可以是一组分界列表,形式为:c1,c2 ,c3,...各分界间以逗号“,”分隔。To 关键字可用来指定一个数值范围,如5 TO 10,表示取值为5到10之间,包括5和10。如果使用 To 关键字,则一般较小的数值要出现在To 之前。当表达式E的值与c-n的任何一分界值相匹配时,便执行其后的执行语句,当执行到下一个Case或Default语句时,将跳出多分支语句。

statements-i,一条或若干条执行语句。

Default,当E不匹配 Case 子句的任何部分时执行其后的执行语句。当执行到下一个Case

时,将跳出多分支语句。如果没有Default语句,且没有哪一个Case的界值与表达式E的值相匹配,多分支内的任何语句都不会被执行,控制将转向多分支体后的语句执行。

注意事项:

Case语句与执行语句间必须以“:”结束。

Default语句可以没有,但是不能有多个。

界符不能重复或交叉。

Switch语句可以任意嵌套。

示例1:

Switch (a)

Case 0:

b = b+ 1;

Case 1:

b = b+2;

Default:

b = b+10;

EndSwitch

在上例中,a的值为0时将执行b = b+1;a的值为1时将执行b = b+2;a为0,1以外的其他值时将执行b = b+10;

示例2:

Switch (a)

Case 0, 1, 2:

b = b+ 1;

Case 3:

b = b+2;

Default:

b = b+10;

EndSwitch

在上例中,a的值为0,1,2时将执行b = b+1;a的值为3时将执行b = b+2;a为0,1,2,3以外的其他值时将执行b = b+10;

示例3:

Switch (a)

Case 0,1, 10 TO 15, 21:

B = b+ 1;

Case 3:

b = b+2;

Default:

b = b+10;

EndSwitch

在上例中,a的值为0,1,10~15,21时将执行b = b+1;a的值为3时将执行b = b+2;a为其他值时将执行b = b+10;

5.10 调试脚本

当您保存或从脚本编辑器中返回时,脚本编辑器对脚本程序进行语法检查和编译。当发现语法错误时,会发出警告提示。

例如,当脚本程序的第3行含有语法错误时,系统出现提示:

按下确定按钮后,系统自动将脚本编辑器中第3行内容中可能含有错误的文本选中,被选中的文本的背景色变为黑色。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top