- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经为 curses 表单对象构建了一个通用包装器,以便与大型应用程序一起使用我正在从事的模拟项目。
基本上,我实例化一个 generic_form 对象,添加一些字段及其对其进行描述,然后为其提供焦点并使用 fill_form()
例程获取用户输入。
因为每个generic_form
对象都可以多次使用,也就是说fill_form()每次实例化可能被调用多次,所以我需要清除fill_form开头的字段缓冲区() 常规。目前,我在例程的开头使用它:
//clear the field buffers in case there's junk in them
for (std::vector<FIELD*>::iterator clear_iter = fields.begin();
clear_iter != fields.end(); clear_iter++)
{
if (*clear_iter != nullptr)
{
set_field_buffer(*clear_iter, 0, " ");
}
}
但是,它在 第二次 调用 fill_form() 例程时在 set_field_buffer
行抛出一个浮点异常。此外,set_field_buffer
行似乎实际上没有做任何事情,至少没有清除缓冲区,因为在例程结束时没有调用 free_field,而是在对象析构函数中,字段缓冲区在随后的每次调用中保持不变。
为简洁起见,这里是整个(丑陋的,开发中的)fill_form() 例程:
void generic_form::fill_form()
{
//fields.push_back(NULL);
if (fields.size() == 1)
{
fields.push_back(NULL);
form = new_form(static_cast<FIELD**>(fields.data()));
fields.erase((fields.end() - 1));
assert(fields.size() == 1);
}
else
{
form = new_form(static_cast<FIELD**>(fields.data()));
}
WINDOW* form_win = derwin(screen, fields.size() + 1, largest_desc + 6, ypos,
xpos);
set_form_win(form, form_win);
set_form_sub(form, form_win);
//clear the field buffers in case there's junk in them
for (std::vector<FIELD*>::iterator clear_iter = fields.begin();
clear_iter != fields.end(); clear_iter++)
{
if (*clear_iter != nullptr)
{
set_field_buffer(*clear_iter, 0, " ");
}
}
post_form(form);
for (int x = 0; x < descriptions.size(); x++)
{
mvwprintw(form_win, x, 0, descriptions.at(x).c_str());
}
wmove(form_win, 0, largest_desc + 1);
touchwin(screen);
wrefresh(form_win);
/* Loop through to get user requests */
int ch;
while((ch = getch()) != '\n')//KEY_F(1))
{ switch(ch)
{
case KEY_DOWN:
/* Go to next field */
form_driver(form, REQ_NEXT_FIELD);
/* Go to the end of the present buffer */
/* Leaves nicely at the last character */
form_driver(form, REQ_END_LINE);
break;
case KEY_UP:
/* Go to previous field */
form_driver(form, REQ_PREV_FIELD);
form_driver(form, REQ_END_LINE);
break;
case KEY_LEFT:
form_driver(form, REQ_PREV_CHAR);
break;
case KEY_RIGHT:
form_driver(form, REQ_NEXT_CHAR);
break;
// Delete the char before cursor
case KEY_BACKSPACE:
case 127:
form_driver(form, REQ_DEL_PREV);
break;
// Delete the char under the cursor
case KEY_DC:
form_driver(form, REQ_DEL_CHAR);
break;
default:
/* If this is a normal character, it gets */
/* Printed */
form_driver(form, ch);
break;
}
}
form_driver(form, REQ_VALIDATION);
for (int x = 0; x < fields.size() && first_run; x++)
{
//store the int_inputs from the forms
if ((fields.at(x) != nullptr) && (field_type(fields.at(x)) ==
TYPE_INTEGER))
{
int_inputs.push_back(std::atoi(field_buffer((fields.at(x)), 0)));
}
if ((fields.at(x) != nullptr) && (field_type(fields.at(x)) ==
TYPE_ALPHA))
{
str_inputs.push_back(field_buffer((fields.at(x)), 0));
}
}
first_run = false;
/* Un post form and free the memory */
unpost_form(form);
free_form(form);
for (int x = 0; x < fields.size(); x++)
{
free_field(fields.at(x));
}
delwin(form_win);
}
长话短说/TLDR:如何在不删除和重新添加的情况下清除或重置 ncurses 中的字段缓冲区?
最佳答案
您可以使用 form_driver() 清理字段缓冲区
摘录 man form_driver
REQ_CLR_EOL
Clear to end of line from cursor.
REQ_CLR_EOF
Clear to end of field from cursor.
REQ_CLR_FIELD
Clear the entire field.
为了更详细地说明这一点 :-),我使用类似于以下的代码来清除字段:
#include <stdio.h>
#include <stdlib.h>
#include <form.h>
enum f_name_l
{
f_name, f_surname, f_last
};
int main (void)
{
int ch = 0, i = 0;
FIELD *field[3], *save_field;
FORM *my_form;
initscr ();
start_color ();
noecho ();
raw ();
keypad (stdscr, TRUE);
refresh ();
field[f_name] = new_field (1, 10, 0, 25, 0, 0);
field[f_surname] = new_field (1, 10, 2, 25, 0, 0);
field[f_last] = NULL;
set_field_back (field[f_name], A_UNDERLINE);
set_field_back (field[f_surname], A_UNDERLINE);
my_form = new_form (field);
post_form (my_form);
// Form labels
mvprintw (0, 1, "Name: ");
mvprintw (2, 1, "Surname: ");
mvprintw (4, 1, "F5 to clear active field. F6 to clear form.");
pos_form_cursor (my_form);
refresh ();
// ^q to exit
while ((ch = getch ()) != 17)
{
switch (ch)
{
case KEY_UP:
form_driver (my_form, REQ_PREV_FIELD);
break;
case KEY_DOWN:
form_driver (my_form, REQ_NEXT_FIELD);
break;
case KEY_F(5):
form_driver (my_form, REQ_CLR_FIELD);
break;
case KEY_F(6):
save_field = current_field (my_form);
for (i = 0; i < f_last; i++)
{
set_current_field (my_form, field[i]);
form_driver (my_form, REQ_CLR_FIELD);
}
set_current_field (my_form, save_field);
break;
default:
form_driver (my_form, ch);
break;
}
form_driver (my_form, REQ_VALIDATION);
}
endwin ();
return EXIT_SUCCESS;
}
但是看到来自 Thomas Dickey 的帖子我开始觉得我的生活是个谎言 :-)。
关于c++ - 清除 ncurses 中的字段缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33322601/
我正在用 C 和 C++ 编写 ncurses 程序。我还没有找到向用户隐藏光标的方法。我在互联网上查了一下,但我发现的大多数信息要么涉及 (n)curses 的 Python/Ruby 实现,要么实
我有我的 window WINDOW *win = newwin(40, 40, 3, 3); 当输入一些文本并跨越更多行时,保留窗口内边框周围整齐空白的最佳方法是什么?我似乎找不到在 NCurses
我使用 ncurses 创建了一个单窗口菜单方案并让它运行起来。当我添加第二个窗口时,我无法再触发我的 wgetch 调用(或者看起来是这样)。 函数原型(prototype)让我有些困惑: int
我一直在测试 ncurses,我尝试使用 Windows 编写一个简单的代码,通过阅读教程中的代码,在我看来,如果仅对一个窗口进行更改,调用 wrefresh() 就足够了。所以我尝试了以下代码,但它
我是一名初学者 C 程序员,我的一项任务要求我为 Logo 编程语言编写一个解释器。为此,我想知道是否有可能在使用 ncurses 库时将屏幕拆分,以便一半保留具有常规文本输入/输出的基本终端属性,另
在 ncurses 中捕获 control+key 的正确方法是什么? 当前我正在这样做定义控制,如下所示: #define ctl(x) ((x) & 0x1f) 它工作正常,但问题是我不能同时捕捉
有没有办法在mvwprintw中使用ANSI转义码? mvwprintw(window, 0, 0,"%c[%dmCOLORED_TEXT!\n", 0x1B, 32);//doesn't work
我以前问过这样的问题,但它有点误导,因为我没有包括打印顺序。自从我了解了整个概念的变化后,我认为再问一次会更合适。 #include using namespace std; in
我对 ncurses 比较陌生,只是想知道在我开始的 ncurses TUI 中显示在终端/命令行中执行的命令输出的简单方法是什么。即像这样的伪代码(我知道它不起作用,只是为了得到重点:)目标是呈现一
我正在使用 ncurses 在 C 中创建一个基于控制台的应用程序,它接受单个键输入但也读取组合键。例如,当用户同时按下 S 键和 F 键时,我希望它运行一些功能。是否有一些像 getch() 这样的
我试图通过将值 COLOR_BLUE 设置为 rgb 值(1000, 0, 0)来将文本 block 的背景设置为红色。如果我使用 Gnome 的“终端”应用程序,背景是正确的(红色),但如果我使用
main :: IO() main = runCurses $ do setEcho False w ev == EventCharacter 'q' || ev == EventChara
我需要使用 ncurses 实现一个简单的文本阅读器,有点像 unix 的 less。 我在理解如何操作时遇到问题。我目前有一个窗口,每次我按下向下键(例如)时,我都会在适当的起点刷新所有行,给人一种
为什么这段代码在这里: #include #define WIN 5 #define WI win[0] #define WC win[1] int ymax, xmax; WINDOW *win[
我正在使用 ncurses 构建我自己的终端。我的主窗口包含 5 个其他窗口。我位于下面的窗口是提示面板。我希望在那里输入文本,并且我也希望能够在那里输入文本。我已使用 wmove 定位光标,但光标仍
我正在尝试使用 ncurses 库在屏幕的特定点上色。 我写了这段代码: #include int main(void) { initscr(); start_color();
我正在使用 ncurses 为我的应用程序制作一个简单的 TUI。我掌握了创建和打印到窗口的基础知识,但我在输入方面遇到问题。 当我写完的时候,光标定位在我写的字符串的末尾 但是当我开始打字时,光标会
我有一个基本的 Linux 发行版,运行在一台连接激光的机器上。我想开发一个界面,它允许我: 配置激光设置(例如工具栏和按钮) 显示激光的当前路径(例如图形窗口) 因为这些是最基本的机器,所以我没有安
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我正在编写一个需要 ncurses 提供的高级终端控制的程序,但我无
我一直在尝试自学 ncurses,到目前为止我很喜欢它。但是,我正在尝试编写一个像 pico 或 nano 这样的小型文本编辑器。到目前为止,我已经设置得相当好。我创建了一个函数来映射键。无论我做什么
我是一名优秀的程序员,十分优秀!