Мегаобучалка Главная | О нас | Обратная связь


Основной цикл работы программы



2019-12-29 212 Обсуждений (0)
Основной цикл работы программы 0.00 из 5.00 0 оценок




Теперь процесс инициализации работы программы завершен, и пришла пора более подробного описания процедуры основного цикла работы программы (Run). Здесь основным является управление процессом работы и ввод данных с клавиатуры (функция KeyBoardInput).

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

- команды управления курсором;

- команды завершения ввода или завершения выбора;

- команды редактирования строки ввода данных с клавиатуры;

- команды выхода или отказа.

Команды представим перечисляемым типом:

type

Commands=(

cmLeft, cmRight, cmUp, cmDown, { управление курсором }

cmEnter,                                         { завершение ввода/выбора }

cmBackSpace,cmDelete,                { редактирование строки }

cmExit,                                            { выход или отказ }

cmEmpty                                         { пустая команда });

Любое действие с клавиатурой определим как некоторое событие, описываемое переменной типа запись. Тип этой записи имеет два поля:

type

EventType=record { Тип события - это запись }

Key:char;         { Какая клавиша нажата }

Command:Commands; {Какой команде соответствует нажатие этой клавиши } end;

Для получения события от клавиатуры предусмотрена процедура GetEvent, которая определяет событие по кодам нажатых клавиш и будет всегда использоваться, когда необходимо опросить клавиатуру.

Первое применение для процедуры GetEvent сделаем в процедуре Run, где будем принимать в цикле события до тех пор, пока не поступит команда выхода из программы cmExit, а также будем обрабатывать команды перемещения курсора по таблице, используя процедуру ExecutePositionCommand.

Листинг 7

{ Процедура получения события от клавиатуры }

procedure GetEvent(var Event:EventType);

var c:char;

begin

c:=ReadKey; { Прочитать код нажатой клавиши }

with Event do

begin

Command:=cmEmpty;

case ord(c) of { Определить команду по коду нажатой клавиши }

27:Command:=cmExit; 13:Command:=cmEnter; 8:Command:=cmBackSpace;

0:

begin

c:=ReadKey; { Выбор по клавишам, имеющим двойной код }

case ord(c) of

72:Command:=cmUp; { Вверх } 75:Command:=cmLeft; { Влево}

77:Command:=cmRight; {Вправо} 80:Command:=cmDown; {Вниз} 83:Command:=cmDelete; {Удалить}

end; {case}

end;

end; {case}

Key:=c; { Запомнить код нажатой клавиши }

end; {with}

end;

...

{ Основной цикл }

procedure Run ( { П а р а м е т р ы п р о ц е д у р ы }

X,              {Номер столбца в таблице }

Y,              {Номер строки в таблице }

Nx,            {Количество строк в таблице }

Ny,            {Количество столбцов в таблице }

InitY:byte; {Номер начальной строки в таблицы на экране }

Xpos:ColumnsPositionsArray; {Массив координат столбцов }

var P:ProcessorArray); { Массив записей в таблице }

{ Процедура выполнения команд перемещения курсора }

procedure ExecutePositionCommand(

{ П а р а м е т р ы п р о ц е д у р ы }

Com:Commands; {Команда для обработки }

var X,Y,                 {Текущие координаты }

MaxX,MaxY    {Границы по координатам }

:byte);

begin

case Com of

cmLeft : if X>1 then dec(X); cmRight: if X<MaxX then inc(X);

cmUp : if Y>1 then dec(Y); cmDown : if Y<MaxY then inc(Y);

end;

end;

var E:EventType; {Локальная переменная процедуры Run }

begin {Run }

repeat

Getevent(E); { Принять событие от клавиатуры }

with E do

case Command of

cmLeft..cmDown: {Обработка команд перемещения курсора }

begin

ExecutePositionCommand(Command,X,Y,Nx,Ny);

MoveCursor(X,Y,InitY,Xpos); end;

end; {case}

until E.Command=cmExit;

end; { Run }

...

begin {Основная часть программы }

{ Инициализация }

Init(Col,Row,Ncol,Nrow,InitRow,ColPos,Processors);

{ Основной цикл (теперь уже с параметрами) }

Run(Col,Row,Ncol,Nrow,InitRow,ColPos,Processors);

Done; {Завершение работы }

end.

В процедуре Run при получении команды cmEnter будем переходить на процедуру ввода поля данных EnterField, в которой теперь необходимо определить функцию ввода данных с клавиатуры - KeyBoardInput.

{ Основной цикл }

procedure Run

...

case Command of

...

cmEnter:

EnterField(FromKeyBoard,P,Y,X,Ny,InitY,Xpos,'');

end; {case}

В функции KeyBoardInput надо также выполнить много действий, которые выделены в отдельные процедуры и функции (эти действия рассмотрим не сразу, а последовательно одно за другим):

- начальные значения для переменных и начальное местоположение курсора определяет процедура InitKeyBoardInput;

Листинг 8

{ Ф у н к ц и я в в о д а с к л а в и а т у р ы }

function KeyBoardInput:string;

{ Локальные переменные для функции KeyBoardInput }

var Ev:EventType; Si:string; X,Y:byte; Cor:Corporations;

{ Процедура определения начальных установок }

procedure InitKeyBoardInput;

begin { InitKeyBoardInput }

Ev.Command:=cmEmpty; { Команды нет }

Cor:=P[R].Corp;    { Начальное значение для имени корпорации }

{ Вывод дополнительных сообщений }

GoToSpecialLine(2);

Write('<Enter> - принять изменения, <Esc> - отказ от изменений.');

GoToSpecialLine(1);

if C=2 { Во втором столбце - выбор вариантов }

then

begin

Write('Выбор значения клавишами стрелок ( <- -> ): ');

ClrEol; X:=WhereX; Y:=WhereY; Write(CorpName[Cor]);

end

else Write('Введите значение: ');

end; { InitKeyBoardInput }

- ввод поля выбором вариантов с использованием клавиш стрелок простая, не требующая дополнительных пояснений функция InputByRows;

Листинг 9

{ Функция ввода поля выбором вариантов клавишами стрелок }

function InputByRows:string;

begin { InputByRows }

repeat

GetEvent(Ev);

if Ev.Command in [cmLeft,cmRight] then

begin

case Ev.Command of

cmLeft: if Cor<>Intel then Cor:=Pred(Cor) else Cor:=Cyrix;

cmRight:if Cor<>Cyrix then Cor:=Succ(Cor) else Cor:=Intel;

end; {case}

GotoXY(X,Y); ClrEol; Write(CorpName[Cor]);

end;

until Ev.Command in [cmEnter,cmExit];

InputByRows:=CorpName[Cor];

end; { InputByRows }

- ввод данных в виде строки с клавиатуры - функция InputString, реализующая простейшие функции редактирования;

Листинг 10

{ Функция ввода строки с клавиатуры }

function InputString:string;

var S:string; X,Y,i,j:byte;

begin InputString

{Начальные значения вводимой строки и местоположения курсора}

S:=''; X:=WhereX; Y:=WhereY; i:=1; repeat

GetEvent(Ev); { Получить событие от клавиатуры }

with Ev do

begin

case Command of { Выбор действий по командам }

cmEmpty: begin {Нет команды, тогда ввод символа }

Insert(Key,S,i); GotoXY(X,Y); write(S); inc(i); end;

cmBackSpace: begin { Удалить символ перед курсором }

Delete(S,i-1,1); GotoXY(X,Y); ClrEol; GotoXY(X,Y); write(S); if i>1 then dec(i); end;

cmDelete: begin { Удалить символ после курсора }

Delete(S,i,1); GotoXY(X,Y); ClrEol; GotoXY(X,Y);     write(S);                  end;

cmLeft:    if i>1 then dec(i);                { Курсор влево }

cmRight:  if i<length(S)+1 then inc(i); { Курсор вправо }

end; {case}

end; {with}

GotoXY(X+i-1,Y);

until (Ev.Command=cmExit)or(Ev.Command=cmEnter);

if Ev.Command=cmEnter { если команда cmEnter }

then InputString:=S { Тогда принять ввод строки }

else InputString:=''; { Иначе отказ от введенных данных }

end; { InputString }

- процедура ClearSpecialLines - убирает с экрана всю дополнительную информацию.

Листинг 11

{ Процедура очистки специальных строк на экране монитора }

procedure ClearSpecialLines;

begin

GoToSpecialLine(1); ClrEol; GoToSpecialLine(2); ClrEol;

end;

С учетом изложенного основная часть процедуры ввода данных с клавиатуры примет вид:

Листинг 12

begin {KeyBoardInput }

InitKeyBoardInput;    { Инициализация ввода с клавиатуры }

if C=2 { Если во втором столбце - выбор вариантов }

then Si:=InputByRows { Ввод поля выбором вариантов }

else Si:=InputString; {Ввод строкой с клавиатуры} ClearSpecialLines;

if Ev.Command=cmEnter

then KeyBoardInput:=Si { Принять ввод строки }

else KeyBoardInput:=''; {Отказ от введенных данных }

end; { KeyBoardInput }



2019-12-29 212 Обсуждений (0)
Основной цикл работы программы 0.00 из 5.00 0 оценок









Обсуждение в статье: Основной цикл работы программы

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (212)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)