Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Пример.

Приведем пример использования мakewindow:

мakewindow(1, 7, 135, "My first window",1, 20, 4, 23)

В этом примере мakewindow определяет окно номер 1, черно-белое

(ScrAttr=7). Окно будет иметь рамку (FrAttr=135) и заголовок "My first

window". Само окно будет иметь 4 строки в высоту и 34 позиции в ширину, и

его верхний правый угол будет расположен в 20 позиции 1 строки экрана.

Заметьте, что строки и позиции нумеруются числами 0, 1, 2,... и т.д.)

Заметим, что если ваш экран 25 на 80 позиций, то обращение:

мakewindow(2, 7, 135, "count the rows" ,8, 20, 19, 23)

вызовет сообщение об ошибке:

The parameters in makewindow are illegal

Состояние ошибки возникло потому, что на экране высотой 25 строк,

невозможно разместить окно из 19 строк начинающееся с 8 строки (19+8

больше 25). Заметьте, что если размер окна равен 10 на 20, и определенно,

что оно имеет рамку (т.е. FrAttr не равен 0), действительная площадь окна

равна 8 на 18, т.к. рамка занимает 2 строки и 2 столбца.

Shiftwindow/1

Этот предикат осуществляет активизацию другого окна и имеет формат:

shiftwindow(WindowNo) /* (i),(o) */

Окно с номером WindowNo будет активизировано на экране, причем кур-

сор будет помещен в ту позицию, в которой он был в момент предыдущего об-

ращения к окну. Если WindowNo свободно, то shiftwindow свяжет WindowNo с

номером текущего окна. Если WindowNo связано с номером еще неопределенно-

го окна, возникнет ошибка при исполнении программы.

Clearwindow/0

Этот предикат очищает текущее окно

clearwindow/0 /* (no arguments) */

При этом окно заполняется цветом фона и курсор помещается в верхнюю

левую позицию окна.

Removewindow/0

Предикат удаляет активное в этот момент окно

removewindow/0 /* (no arguments) */

При этом активным становится окно, активизированное перед удалением.

Если окна не определены, то возникает ошибка при исполнении.

Cursor/2

Выполняет две задачи: помещает курсор в указанную позицию окна или

(если аргументы свободны) связывает аргументы с параметрами текущей пози-

ции курсора:

cursor(Row, Col) /* (i,i), (o,o) */

Если Row и Col связаны с целыми неотрицательными числами, то после

обработки предиката курсор помещается в позицию, определенную координата-

ми (Row, Col), причем левый верхний угол окна соответствует (0,0). Если

Row и Col свободны, то они после обработки предиката принимают значения,

соответствующие текущему положению курсора. Если Row и Col указывают на

позицию за пределами окна (или отрицательны), возникает ошибка.

Пример.

1) Программа CH14EX01.PR0 посылает сообщение в соответствующее окно

(сначала в окно 1, затем в окно 2); первый вызов readint отображает вво-

димые числа в окне 2.

После нажатия клавиши ВВОД вызов предиката removewindow удаляет

окно 2.

После этого предикат readint отображает вводимые числа в окне 1, до

тех пор, пока не будет нажата клавиша ВВОД. Затем окно 1 (ставшее текущим

активным окном) тоже исчезает.

Последний readint отобразит числа в нижней части экрана.

/* Program CH14EX01.PRO */

predicates

run

goalclauses

repeat,

makewindow(1, 20, 7, "A blue window", 2, 5, 10, 50),

write("The characters are red"), nl,

makewindow(2, 176, 7, "A light cyan window",14,25,10,40),

write("This window is light cyan and the "),

write("letters are black and blink."), nl,

write("Please type an integer to exit."), nl,

readint(_),

removewindow,

write("Please type an integer to exit."), nl,

readint(_),

removewindow.

Допустимо перекрытие окон, чтобы убедится в этом, замените команды

мakewindow в программе CH14EX01.PRO на

мakewindow(1, 20, 7, "First",1, 3, 20, 30)

и

мakewindow(2, 184, 7, "Second", 6, 18, 18, 50)

соответственно.

Если текст слишком велик и не помещается в окне, то он начнет "прок-

ручиваться", как и при использовании всего экрана. Чтобы убедиться в

этом, замените команды мakewindow в программе CH14EX01.PRO на

мakewindow(1, 20, 7, "First",1, 3, 10, 15)

и

мakewindow(2, 184, 7, "Second", 6, 18, 3, 30)

2) Программа CH14EX02.PRO использует окна, превращая ваш компьютер в

простую машину для сложения, которая складывает два вводимых числа и со-

общает результат. Оба операнда и результат отображаются в окнах.

Отметим переопределение окна 2 в программе. Новое окно определяется

с ссылкой на тот же номер; всегда будет использоваться окно определенное

последним.

Для запуска программы задайте цель start.

/* Program CH14EX02.PRO */

predicates

start

run(integer)

do_sums

set_up_windows

clear_windows

clauses

start :- set_up_windows, do_sums.

set_up_windows :-

makewindow(1, 7, 7, "", 0, 0, 25, 80),

makewindow(1, 7, 7, "Left operand", 2, 5, 5, 25),

makewindow(2, 7, 7, "", 2, 35, 5, 10),

nl, write(" PLUS"),

makewindow(2, 7, 7, "Right operand", 2, 50, 5, 25),

makewindow(3, 7, 7, "Gives", 10, 27, 5, 25),

makewindow(4, 7, 7, "", 17, 22, 5, 35).

do_sums :- run(_), clear_windows, do_sums.

run(Z) :-

shiftwindow(1),

cursor(2, 1), readint(X),

shiftwindow(2),

cursor(2, 10), readint(Y),

shiftwindow(3), Z=X+Y, cursor(2, 10), write(Z),

shiftwindow(4),

write(" Please press the space bar"),

readchar(_).

clear_windows :-

shiftwindow(1), clearwindow,

shiftwindow(2), clearwindow,

shiftwindow(3), clearwindow,

shiftwindow(4), clearwindow.

Соседние файлы в папке Документация