⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch18.htm

📁 ncurses中文说明
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<p>
<dd>
通过C库函数atoi(3)可以很方便的解释TYPE_INTEGER类型值的缓冲区。
</dd>
</p>
<br>
<p>
TYPE_NUMERIC
</p>
<p>
<dd>
这种检查方式检查表单域的值是否是一个十进制小数。这个检查方式可以这样设置:
</dd>
</p>
<font color="maroon">
<pre>
int set_field_type(FIELD *field,          	/* 要附加输入检查的表单域  */
                   TYPE_NUMERIC,    		/* 要附加的检查模式 */
                   int padding,           	/* 要设置的精度 */
                   int vmin, int vmax);   	/* 有效值的范围 */

</pre>
</font>
<p>
<dd>
在这种情况下的有效字符为实数也可以是带“-”号的负数,也可以带小数点。同样的,当退出这个表单域的时候才检查输入值是否在规定范围之内。如果限制范围的最大值小于或者等于最小值,整数值的限制范围将被忽略。如果输入的整数通过了范围检查,函数将会自动地在这个值后面填充尽可能多的0,让其变为填充变量。
</dd>
</p>
<p>
<dd>
通过C库函数atoi(3)可以很方便的解释TYPE_NUMERIC类型值的缓冲区
</dd>
</p>
<br>
<p>
TYPE_REGEXP
</p>
<p>
<dd>
这种检查方式检查表单域的值是否是一个与常规表达式相匹配的数据。这个检查方式可以这样设置:
</dd>
</p>
<font color="maroon">
<pre>
int set_field_type(FIELD *field,          	/* 要设置检查方式的域 */
                   TYPE_REGEXP,         		/* 要关联的类型 */
                   char *regexp);         	/* 要匹配的表达式 */

</pre>
</font>
<p>
<dd>
常规表达式的语法即regcomp(3)。常规表达式是否匹配的检查在退出表单域时执行。
</dd>
</p>
<br>
<br>
<h3 align="left">
<a name="formdriver">
18.6、Form Driver:表单系统的灵魂
</a>
</h3>
<br>
<p>
<dd>
和菜单系统一样,form_driver()在表单系统中扮演同样重要的角色。各种类型的请求都是经过form_driver()处理的:
</dd>
</p>
<font color="maroon">
<pre>
int form_driver(FORM *form,     			/* 要进行操作的表单 */
                int request)    			/* 表单请求项 */

</pre>
</font>
<p>
<dd>
正像你在前面的有些例子中看到的,必须在一个循环中取得用户的输入,然后再确定这是一个数据还是一个表单处理请求。若是表单处理请求,则将信号传递给form_driver(),由它完成相应的工作。这些请求项可以大致地分为下面几类。下面将解释这些不同的请求和它们的用法:
</dd>
</p>
<br>
<h4 align="left">
<strong>
18.6.1、页面导航请求
</strong>
</h4>
<p>
<dd>
这些请求用来在表单里面实现翻页,并控制页面的显示。一个表单可以由多个页面组成。如果你的一个表单中含有很多表单域和逻辑分段,你就可以把这个表单设置为多页的。函数set_new_page()可以为指定的表单域增添一个新页面。
</dd>
</p>
<font color="maroon">
<pre>
int set_new_page(FIELD *field,			/* 要设置新页或取消设置的表单域 */
         bool new_page_flag); 			/* 若要设置断点,则应该为TRUE */

</pre>
</font>
<p>
<dd>
下面的导航请求允许你在不同的表单页面中跳转:
</dd>
</p>
<pre>
	REQ_NEXT_PAGE		跳到表单下一页
	REQ_PREV_PAGE		跳到表单上一页
	REQ_FIRST_PAGE		跳到表单第一页
	REQ_LAST_PAGE		跳到表单最后一页

</pre>
<p>
<dd>
这些请求把页面列表视作一个循环。也就是说,在最后一页发送REQ_NEXT_PAGE请求使得表单页从最后一页跳到第一页,REQ_PREV_PAGE使得表单页从第一页跳到最后一页。
</dd>
</p>
<br>
<h4 align="left">
<strong>
18.6.2、表单域间移动请求
</strong>
</h4>
<p>
<dd>
下面的这些请求处理光标在不同表单域间移动,这些表单域必须是同一个页面内的。
</dd>
</p>
<pre>
	REQ_NEXT_FIELD		跳到下一个表单域
	REQ_PREV_FIELD		跳到上一个表单域
	REQ_FIRST_FIELD		跳到第一个表单域
	REQ_LAST_FIELD		跳到最后一个表单域

	REQ_SNEXT_FIELD		跳到有序表单域的下一个表单域
	REQ_SPREV_FIELD		跳到有序表单域的上一个表单域
	REQ_SFIRST_FIELD		跳到有序表单域的第一个表单域
	REQ_SLAST_FIELD		跳到有序表单域的最后一个表单域

	REQ_LEFT_FIELD		向左跳到上一个表单域
	REQ_RIGHT_FIELD		向右跳到下一个表单域
	REQ_UP_FIELD		向上跳到上一个表单域
	REQ_DOWN_FIELD		向下跳到下一个表单域

</pre>
<p>
<dd>
这些请求把同一页内的表单域视为一个循环。也就是说,REQ_NEXT_FIELD可以使光标从最后一个表单域跳到第一个表单域,REQ_PREV_FIELD可以使光标从第一个域跳到最后一个域。对于这些请求(包括REQ_FIRST_FIELD和REQ_LAST_FIELD)来说,表单域的顺序就是表单数组中其指针的顺序(用new_form()或set_form_fields()设置)。
</dd>
</p>
<p>
<dd>
同样也可以按屏幕位置的来依次遍历这些表单域,顺序是自左至右,由上到下。可以通过使用第二组移动请求(即REQ_S开头的请求)完成。
</dd>
</p>
<P>
<dd>
最后,也可以使用方向键在表单域间移动。要完成这项功能,可以使用上面四组请求中的第三组。注意:为完成这个功能,这些请求引用的表单位置是指表单的左上角。
</dd>
</P>
<p>
<dd>
例如,假设你有一个多行表单域B和两个与B在同一行的单行表单域A和C。而且A在B的左边,C在B的右边。REQ_MOVE_RIGHT请求只在A,B,C的第一行在同一行的情况下才能使光标从A移动到B;否则将跳过B而移动到C。
</dd>
</p>
<br>
<h4 align="left">
<strong>
18.6.3、域内导航请求
</strong>
</h4>
<p>
<dd>
下面的这些请求使光标在当前表单域内移动.
</dd>
</p>
<pre>
	REQ_NEXT_CHAR		跳到下一个字符处
	REQ_PREV_CHAR		跳到前一个字符处
	REQ_NEXT_LINE		跳到下一行
	REQ_PREV_LINE		跳到前一行
	REQ_BEG_FIELD		跳到表单域的开始
	REQ_END_FIELD		跳到表单域的结尾
	REQ_BEG_LINE		跳到行首
	REQ_END_LINE		跳到行尾
	REQ_LEFT_CHAR		跳到表单域的左边
	REQ_RIGHT_CHAR		跳到表单域的右边
	REQ_UP_CHAR			跳到表单域的上边
	REQ_DOWN_CHAR		跳到表单域的下边

</pre>
<p>
<dd>
前后单词之间都用空格来分开。如果要让光标移动到起始处或末尾处(在表单域内或行内),相应的命令会在当前范围内查找第一个字符或最后一个字符。
</dd>
</p>
<br>
<h4 align="left">
<strong>
18.6.4、滚动请求
</strong>
</h4>
<p>
<dd>
增大后的动态表单域和指定显示行数的表单域都是可滚动的。单行表单域以水平方式滚动;多行表单域以垂直方式滚动。一般滚动都是因为光标移动(为使光标可见而滚动)引起的。你也可以使用下面的请求来显式地请求滚动:
</dd>
</p>
<pre>
	REQ_SCR_FLINE		纵向向前滚动一行
	REQ_SCR_BLINE		纵向向后滚动一行
	REQ_SCR_FPAGE		纵向向前滚动一页
	REQ_SCR_BPAGE		纵向向后滚动一页
	REQ_SCR_FHPAGE		纵向向前滚动半页
	REQ_SCR_BHPAGE		纵向向后滚动半页
	REQ_SCR_FCHAR		纵向向前滚动一个字符
	REQ_SCR_BCHAR		纵向向后滚动一个字符
	REQ_SCR_HFLINE		纵向向前滚动一个域宽
	REQ_SCR_HBLINE		纵向向后滚动一个域宽
	REQ_SCR_HFHALF		纵向向前滚动半个域宽
	REQ_SCR_HBHALF		纵向向后滚动半个域宽

</pre>
<p>
<dd>
在执行滚动时,表单域的一页就是它的可视部分的高度。
</dd>
</p>
<br>
<h4 align="left">
<strong>
18.6.5、编辑请求
</strong>
</h4>
<p>
<dd>
当你传递一个ASCII字符给Form Driver时,它被视做一个添加到表单域的数据缓冲区中的字符。是插入模式还是替换模式由表单域的编辑模式决定(默认模式是插入模式)。
下面的请求支持表单域编辑并且可以改变编辑模式:
</dd>
</p>
<pre>
	REQ_INS_MODE		设置为插入模式
	REQ_OVL_MODE		设置为替换模式
	REQ_NEW_LINE		新行请求(看下面的解释)
	REQ_INS_CHAR		在当前字符处插入一个空格
	REQ_INS_LINE		在当前字符处插入一个空行
	REQ_DEL_CHAR		删除光标所在处的字符
	REQ_DEL_PREV		删除光标所在处的前一个字
	REQ_DEL_LINE		删除光标所在行
	REQ_DEL_WORD		删除光标所在的字
	REQ_CLR_EOL			清除当前位置到行尾的字符
	REQ_CLR_EOF			清除当前位置到域尾的字符
	REQ_CLEAR_FIELD		清空整个域

</pre>
<p>
<dd>
REQ_NEW_LINE请求和REQ_DEL_PREV请求比较复杂,而且部分被其他表单选项控制。尤其是在光标处于表单域的开头或最后一行发送这类请求时,这里需要特别的说明:
</dd>
</p>
<p>
首先看一下REQ_NEW_LINE:
</p>
<p>
<dd>
通常REQ_NEW_LINE的作用是在插入模式时中断光标当前编辑位置的所在行。把当前光标后面的部分作为一个新行插入,并且光标移到新行的开头(你可以认为是在表单域缓冲区插入一行)。
</dd>
</p>
<p>
<dd>
通常REQ_NEW_LINE在替换模式下会将当前光标位置到行尾的所有内容清除。并且将光标移动到新行的开头。
</dd>
</p>
<p>
<dd>
但是,在表单域的开头或最后一行发送REQ_NEW_LINE请求时,它相当于REQ_NEXT_FIELD的功能。若选项O_NL_OVERLOAD关闭,这个特殊行为就会禁止。
</dd>
</p>
<p>
接下来看一下REQ_DEL_PREV:
</p>
<p>
<dd>
通常REQ_DEL_PREV是删除前一个字符。如果是在插入模式下并且光标在行首,当前行的内容将会接到上一行上去,这时它完成的功能是把当前行的内容接到上一行,并删除当前行(你可以认为是在表单域缓冲区中删除一新行)。
</dd>
</p>
<p>
<dd>
但是如果是在表单域的开头,REQ_DEL_PREV则被当成REQ_PREV_FIELD处理。
</dd>
</p>
<P>
<dd>
如果选项O_BS_OVERLOAD关闭,这个特殊行为就会禁止,Form Driver就会返回E_REQUEST_DENIED。
</dd>
</P>
<br>
<h4 align="left">
<strong>
18.6.6、顺序请求
</strong>
</h4>
<p>
<dd>
如果你的表单域类型是有序的,并且已经关联了取得前一个值和后一个值的函数。以下两个请求可以将前一个值或后一个值放入缓冲区:
</dd>
</p>
<pre>
	REQ_NEXT_CHOICE		把当前值的后一个值放在缓冲区
	REQ_PREV_CHOICE		把当前值的前一个值放在缓冲区

</pre>
<p>
<dd>
对于内置域类型,只有TYPE_ENUM有内置的函数用来读取前面一个值或后面一个值。当定义了一个你自己的表单域类型时(参看自定义有效检查类型),你可以关联你自己的函数。
</dd>
</p>
<br>
<h4 align="left">
<strong>
18.6.7、应用程序命令
</strong>
</h4>
<p>
<dd>
表单请求用大于KEY_MAX且小于等于常数MAX_COMMAND的整数表示。在这个范围内的值将被form_driver()忽略。这使得其他应用程序任意使用它们。它可以被看成是应用程序中特定的行为代码,并通过该代码采取相应的行为。
</dd>
</p>
</font>
</div>
<br>
<br>
<div align="center"><a href="index.htm"><font size="5">
    <strong>
    回  目  录
    </strong>
  </font></a></div>
  <div align="right">
  <font size="5">
  <a href="ch17.htm">
  <strong>
  上 一 章
  </strong>
  </a>
  <a href="ch19.htm">
    <strong>
    下 一 章
	</strong>
	</a>
	</font>
	</div>
	<br>
<br>
<br>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -