2013-08-28 3 views
1

У меня есть код, который читает поле формы, используя ncurses (C++), но я не могу показать значение, когда поле формы не заполнено полностью.Как читать неполное поле формы ncurses C++

#include <form.h> 
#include <curses.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 

WINDOW *chatwin, *entrywin; 
FIELD *field[1]; 
FORM *fo; 

void quit(void) 
{ 
    int i; 
    unpost_form(fo); 
    free_form(fo); 

    free_field(field[0]); 
    free_field(field[1]); 

    delwin(chatwin); 
    endwin(); 
} 

int main(void) 
{ 
    int xsize, ysize; 
    int charinput, i; 
    char inputstring[200]; 
    char ttime[10]; 
    initscr(); 
    atexit(quit); 
    clear(); 
    noecho(); 
    curs_set(1); 
    cbreak(); 
    keypad(stdscr, TRUE); 

    getmaxyx(stdscr, ysize, xsize); 

    start_color(); 
    use_default_colors(); 
    init_pair(1, COLOR_YELLOW, COLOR_BLUE); 
    init_pair(2, COLOR_BLUE, COLOR_WHITE); 

    chatwin = newwin((ysize - 8), (xsize-21), 6, 21); 

    entrywin = newwin(1, (xsize-21), (ysize - 1), 21); 

    field[0] = new_field(1, (xsize - 21), 0, 0, 0, 10); 
    field[1] = 0; 
    set_form_win(fo, entrywin); 
    fo = new_form(field); 
    post_form(fo); 
    field_opts_on(field[0], O_STATIC); 
    set_field_fore(field[0], COLOR_PAIR(2)); 
    set_field_back(field[0], COLOR_PAIR(2)); 

    refresh(); 
    wrefresh(chatwin); 
    wrefresh(entrywin); 

    while((charinput=getch()) != KEY_END) 
    { 
     switch(charinput) 
     { 
      case 10: 
       snprintf(inputstring, 200, "%s", field_buffer(field[0], 0)); 
       struct tm *akttime; 
       time_t second; 
       time(&second); 
       akttime = localtime(&second); 
       strftime(ttime, 10, "%H:%M:%S", akttime); 
       wprintw(chatwin, "<%s> %s|\n", ttime, inputstring); 
       wrefresh(chatwin); 
       set_field_buffer(field[0], 0, ""); 
       wrefresh(entrywin); 
       break; 

      default: 
       form_driver(fo, charinput); 
       wrefresh(entrywin); 
     } 
    } 

    return(0); 
} 

ВЫХОД

найд .: Вторая линия была типизированных: ejheeh, но выход был пуст

<02:31:42> dddddddkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk 
        kkkkkkkkkkk| 

<02:31:45> 
           | 

<02:31:51> ddddddddddddddddddddddddddddddddddddddddddddddddddddfffffff 
        fffffffffff| 

ответ

4

Обычно Ncurses образуют библиотека не синхронизировать буфер поля пока вы не покинете поле. Поскольку вы пытаетесь прочитать буфер перед выходом из поля, буфер не имеет текущего содержимого.

Простой способ принудительно синхронизировать буфер без фактического перехода к следующему полю - принудительная проверка поля - это будет синхронизироваться, а затем запускать любые функции проверки.

Добавьте эту строку в начале из вашего case 10:

form_driver(fo, REQ_VALIDATION); 

Вы можете проверить на наличие ошибок валидации:

if (form_driver(fo, REQ_VALIDATION) != E_OK) { 
    // do something 
} 
Смежные вопросы