我为curses表单对象构建了一个通用包装器,以便与我正在处理的大型 模拟项目一起使用。在ncurses中清除字段缓冲区
基本上,我实例化一个generic_form对象,添加一些字段和它们的 描述,然后给它一个焦点,并获得用户输入一个fill_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, " ");
}
}
然而,它抛出在set_field_buffer
行上秒调用fill_form()例程的浮点异常。此外,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的重置场缓冲器,不删除并重新添加?
你能详细解答吗? :-) –
这些将清除关联的窗口,但不清除字段缓冲区。 –