Чтение онлайн

ЖАНРЫ

Основы программирования в Linux
Шрифт:

Теперь давайте подробно рассмотрим функции, связанные с тремя секциями программы.

Формирование меню

В этой секции рассматриваются три функции, относящиеся к пользовательскому интерфейсу программы.

1. Функция

getchoice
, вызываемая из функции
main
, — это основная функция данной секции. В функцию
getchoice
передается приглашение
greet
и указатель
choices
на базовое или расширенное меню (в зависимости от того, выбран ли компакт-диск). Вы также увидите, как
main_menu
или
extended_menu
передаются как параметры в описанную ранее функцию
main
.

int get_choice(char *greet, char* choises[]) {

 static int selected_row = 0;

 int max_row = 0;

 int start_screenrow = MESSAGE_LINE, start_screencol = 10;

 char **option;

 int selected;

 int key = 0;

 option = choices;

 while (*option) {

max_row++;

option++;

 }

 if (selected_row >= max_row)

selected_row = 0;

 clear_all_screen;

 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];

draw_menu(choices, selected_row, start_screen_row, start_screencol);

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
, которая, как ни странно, очищает экран и перезаписывает заголовок. Если компакт-диск выбран, отображаются его данные:

void clear all_screen {

 clear;

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

 if (current_cd[0]) {

mvprintw(ERROR_LINE, 0, "Current CD: %s: %s\n", current_cat, current_cd);

 }

 refresh;

}

Управление базой данных

В этом разделе описаны функции пополнения или обновления базы данных компакт-дисков. Функции

add_record
,
update_cd
и
remove_cd
вызываются из функции
main
.

Добавление записей

1. Добавьте сведения о новом компакт-диске в базу данных.

void add_record {

 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;

 clear_all_screen;

 mvprintw(screenrow, screencol, "Enter new CD details");

 screenrow += 2;

 mvprintw(screenrow, screencol, "Catalog Number: " );

 get_string(catalog_number);

 screenrow++;

 mvprintw(screenrow, screencol, " CD Title: ");

 get_string(cd_title);

 screenrow++;

 mvprintw(screenrow, screencol, " CD Type: ");

 get_string(cd_type);

 screenrow++;

 mvprintw(screenrow, screencol, " Artist: ");

 get_string(cd_artist);

 screenrow++;

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

 sprintf(cd_entry, "%s, %s, %s, %s",

Поделиться с друзьями: