# 选择器

> 为一个点位登记若干选项，以按键或列表呈现，并标出现场实际处在哪一个。

**选择器**在一个可写点位之上，给操作员一组封闭的、已登记的选择：一种运行模式、一个配方、一档速度。选中一个就写入那个选项的值；把同一个点位读回来，才决定哪个选项亮起。这次读回正是这一类型存在的全部理由：一排各写一个固定值的[按钮](component-button)写得一样好，却什么也显示不出来。它属于*控制*类；新放置的一个占 5 × 1 个单元格。

## 数据 {#data}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 地址 | 选择被写进去、又被读回来的那个带根 Logic 地址：一个内部存储值变量，或者一个可写点位。列表收窄到真正可以写入的点位。 | 自由文本；建议的是可写点位 | 空 |

## 选项 {#options}

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 显示 | 这些选项怎么给出来：每个选项一个按键、并排放着，每一种选择都一眼看得见；或者一个按需展开的下拉列表，供放不下一排按键的单元格使用。 | `每个选项一个按键` · `一个下拉列表` | `每个选项一个按键` |

每个选项是一张卡片，装着一个选项*所是*的那两样东西：

| 字段 | 作用 | 取值 | 默认 |
|---|---|---|---|
| 文本 | 操作员在按键上或者列表里读到的那个词。留空则退回到值本身，因为一个什么都没写的按键什么也说明不了。 | 自由文本 | 空 |
| 数值 | 选中这个选项时写入的值，也是让它显示为生效状态的那个读数。它是一个代码，精确匹配：夹在两个代码之间的东西不是一种选择。 | 任意数值 | 空（键入之前什么也没声明） |

各卡片的顺序，就是操作员手底下那些按键的顺序：上移和下移箭头用来重排，这里没有什么会自己排序。两个选项指向同一个值时，不可能两个都画出按键（点位只能报出其中一个，控件也就没法说是哪一个），面板会说明这一点，重复的那个什么也不画。

所有按键共用一个字号，按最宽的那个已登记的词预留，于是这一排读起来是一个控件，而不是一排互不相干的按键。没有任何选项的选择器写“没有登记任何选项。”，而不是画出一排空的按键，看着像一幅还在加载的画面。

## 什么时候亮起，亮的是哪一个 {#what-lights-and-when}

亮起的那个按键（或者列表里选中的那一项）是点位自己的读数，绝不是那一次点击：

| 情形 | 控件显示 |
|---|---|
| 点位报出一个已登记的值 | 那个选项亮起，或者在列表里被选中 |
| 点位报出一个没有任何选项登记的值 | 什么也不亮，因为让最接近的按键亮起，等于画面在替现场编造它的模式 |
| 点位读不到 | 什么也不亮，组件戴上共用的读数异常标记 |

选一次不需要先有读数，因为选项带的是绝对值，所以质量不可用时控件*仍然可用*，只是指示没有了。

## 写入的含义 {#write-semantics}

选中一个选项，就把它的值经由工作站唯一的逻辑出口写下去，走的是每一条命令都要过的那道授权。放不下一个数的点位会拒绝这次写入，理由写在控件的答复行上（“这个点位存放的是 日期和时间，因此 2 不是它接受的值。”）；选中成功则用这个选项的词来答复（“已写入‘自动’”）。答复行几秒之后过期，而且每选一次都重新核对授权。选项以按键显示时，若格子里放不下这一行、那一排按键上面也没有角上标题，答复在显示期间占用被按下的那个按键上文字的位置，拒绝用错误的颜色。按键保持自己的宽度，放不下的部分以省略号截断，完整的答复在提示里；没有哪个按键会移动，答复过期后文字回来。选项以下拉列表显示时，答复以同样的方式占用收起的列表所显示内容的位置：列表保持自己的宽度和箭头，答复过期后原来显示的内容回来。

在**限值**环节已启用的点位上，值落在这些限值之外的选项也会以同样的方式被拒绝，理由会说出这些限值，什么也不写入：若按边界取值，现场会进入另一个选项，而答复行却会确认所选的那个。

在存放整数的点位上（量程换算和校准都不改变数值的整数类型点位，或者存放整数的内部存储值变量），值带小数的选项也会以同样的方式被拒绝，而不是被取整（“这个点位接受整数，因此不会写入 2.5。”），什么也不写入。

## 权限与锁 {#permissions-and-the-lock}

操作选择器需要角色具备操作仪表画面的权限。被挡下的按下会让这些按键不可用，并画出共用的锁标记，理由在组件的提示里（见[仪表画面页面](home)）。

共用的外观、标识、位置与图层、动作这几个分区，写在[组件页面](components#the-shared-property-sections)。
