mvprintw(start_screenrow - 2, start_screencol, greet);
keypad(stdscr, TRUE);
cbreak();
noecho();
key = 0;
while (key != 'q' && key != KEY_ENTER && key != 'n') {
if (key == KEY_UP) {
if (selected_row == 0) selected_row = max_row - 1;
else selected_row--;
}
if (key == KEY_DOWN) {
if (selected_row == (max_row - 1)) selected_row = 0;
else selected_row++;
}
selected = *choices[selected_row];
<i> draw_menu(choices, selected_row, start_screen_row, start_screencol);</i>
key = getch();
}
keypad(stdscr, FALSE);
nocbreak();
echo();
if (key == 'q') selected = 'q';
return(selected);
}
2. Обратите внимание на то, как две локальные функции clear_all_screen и draw_menu вызываются внутри функции getchoice. Первой рассмотрим функцию draw_menu:
void draw_menu(char* options[], int current_highlight, int start_row, int start_col) {
int current_row = 0;
char **option_ptr;
char *txt_ptr;
option_ptr = options;
while (*option_ptr) {
if (current_row == current_highlight) attron(A_STANDOUT);
txt_ptr = options[current_row];
txt_ptr++;
mvprintw(start_row + current_row, start_col, "%s", txt_ptr);
if (current_row == current_highlight) attroff(A_STANDOUT);
current_row++;
option_ptr++;
}
mvprintw(start_row + current_row + 3, start_col,
"Move highlight then press Return ");
refresh();
}
3. Далее рассмотрим функцию clear_all_screen, которая, как ни странно, очищает экран и перезаписывает заголовок. Если компакт-диск выбран, отображаются его данные:
<i>void clear all_screen() {</i>
clear();
mvprintw(2, 20, "%s", "CD Database Application");
if (current_cd[0]) {
mvprintw(ERROR_LINE, 0, "Current CD: %s: %sn", current_cat, current_cd);
}
refresh();
}
Управление базой данных
В этом разделе описаны функции пополнения или обновления базы данных компакт-дисков. Функции add_record, update_cd и remove_cd вызываются из функции main.
Добавление записей
1. Добавьте сведения о новом компакт-диске в базу данных.
<i>void add_record {</i>
char catalog_number[MAX_STRING];
char cd_title[MAX_STRING];
char cd_type[MAX_STRING];
char cd_artist[MAX_STRING];
char cd_entry[MAX_STRING];
int screenrow = MESSAGE_LINE;
int screencol = 10;
<i> clear_all_screen();</i>
mvprintw(screenrow, screencol, "Enter new CD details");
screenrow += 2;
mvprintw(screenrow, screencol, "Catalog Number: " );
<i> get_string(catalog_number);</i>
screenrow++;
mvprintw(screenrow, screencol, " CD Title: ");
<i> get_string(cd_title);</i>
screenrow++;
mvprintw(screenrow, screencol, " CD Type: ");
<i> get_string(cd_type);</i>
screenrow++;
mvprintw(screenrow, screencol, " Artist: ");
<i> get_string(cd_artist);</i>
screenrow++;
mvprintw(PROMPT_LINE-2, 5, "About to add this new entry:");
sprintf(cd_entry, "%s, %s, %s, %s",
catalog_number, cd_title, cd_type, cd_artist);
mvprintw(PROMPT_LINE, 5, "%s", cd_entry);
refresh();
move(PROMPT_LINE, 0);
<i> if (get_confirm()) {</i>
<i> insert_title(cd_entry);</i>
strcpy(current_cd, cd_title);
strcpy(current_cat, catalog_number);
}
}
2. Функция get_string приглашает к вводу и считывает строку из текущей позиции экрана. Она также удаляет завершающую новую пустую строку: