Основной цикл работы программы
Теперь процесс инициализации работы программы завершен, и пришла пора более подробного описания процедуры основного цикла работы программы (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 }
Популярное: Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (229)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |