Литмир - Электронная Библиотека
Содержание  
A
A

 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, &quot;%s&quot;, txt_ptr);

  if (current_row == current_highlight) attroff(A_STANDOUT);

  current_row++;

  option_ptr++;

 }

 mvprintw(start_row + current_row + 3, start_col,

  &quot;Move highlight then press Return &quot;);

 refresh();

}

3. Далее рассмотрим функцию

clear_all_screen
, которая, как ни странно, очищает экран и перезаписывает заголовок. Если компакт-диск выбран, отображаются его данные:

<i>void clear all_screen() {</i>

 clear();

 mvprintw(2, 20, &quot;%s&quot;, &quot;CD Database Application&quot;);

 if (current_cd[0]) {

  mvprintw(ERROR_LINE, 0, &quot;Current CD: %s: %s\n&quot;, 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, &quot;Enter new CD details&quot;);

 screenrow += 2;

 mvprintw(screenrow, screencol, &quot;Catalog Number: &quot; );

<i> get_string(catalog_number);</i>

 screenrow++;

 mvprintw(screenrow, screencol, &quot; CD Title: &quot;);

<i> get_string(cd_title);</i>

 screenrow++;

 mvprintw(screenrow, screencol, &quot; CD Type: &quot;);

<i> get_string(cd_type);</i>

 screenrow++;

 mvprintw(screenrow, screencol, &quot; Artist: &quot;);

<i> get_string(cd_artist);</i>

 screenrow++;

 mvprintw(PROMPT_LINE-2, 5, &quot;About to add this new entry:&quot;);

 sprintf(cd_entry, &quot;%s, %s, %s, %s&quot;,

  catalog_number, cd_title, cd_type, cd_artist);

 mvprintw(PROMPT_LINE, 5, &quot;%s&quot;, 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
приглашает к вводу и считывает строку из текущей позиции экрана. Она также удаляет завершающую новую пустую строку:

108
{"b":"285844","o":1}