Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- uses CRT;
- const Parts: array [1..6] of string = ('Австралия и Океания', 'Азия', 'Америка', 'Антарктида', 'Африка', 'Европа');
- Type Data = Record {Запись с данными}
- Country:string; {Страна}
- Part:integer; {Часть света (номер элемента в массиве Parts)}
- Capital:string; {Столица}
- End;
- Predicate = function(var D:Data):boolean; {Процедурный тип. Функции этого типа (ShowAll, Mode1, Mode2) возвращают значение true, если переданная им запись подходит под соответствующий режим}
- var
- Mode:byte; {Текущий режим}
- Mode1Part: integer; {Часть света (номер элемента в массиве Parts) для 1-го режима}
- Mode2Country: string; {Столица для 2-го режима}
- {-----------------------------------------------------------------------------}
- function Menu:integer; {Подпрограмма для вывода меню}
- procedure Select(SM,N:integer); {Меняет пункт меню SM на N. Процедура доступна только в подпрограмме Menu}
- begin
- if N in [1..3] then {Проверка 1<=N<=3}
- begin
- GotoXY(2, SM + 1); {Cтереть * в предыдущем выбранном пункте}
- write(' ');
- GotoXY(2, N + 1); {Вывести * в новом пнкте}
- write('*');
- end
- end;
- var
- mode: integer; {Текущий выбранный пункт}
- c: char; {Код нажатой клавиши}
- ext:boolean; {True если нажата клавиша с расширенным кодом}
- begin
- clrscr; {Очистить экран}
- repeat
- writeln('Выберите Режим');
- writeln('[*] Ввод данных');
- writeln('[ ] Просмотр и редактирование');
- writeln('[ ] Выход');
- mode := 1; {Изначально выбран 1-й пункт}
- repeat
- c := readkey; {Считываем код клавиши}
- if c in ['1'..'3'] then {Если нажата клавиша 1, 2 или 3, то}
- begin
- Select(mode, ord(c) - ord('0')); {выберем соответствующий пункт и}{ord(c)-код символа c, напрмер ord('1')-ord('0') = 1}
- mode := ord(C) - ord('0'); {Изменим значение переменной mode}
- end;
- if c = #0 then ext := true; {Если нажата клавиша с расширенным кодом, установим ext}
- if (c in [#72,#80]) and ext then {Нажата клавиша 'Up' или 'Down'}
- begin
- if (c = #72) and (mode > 1) then {обработка нажатия 'UP'}
- begin
- Select(mode, mode - 1); {Выбор пункта, который выше текущего}
- dec(mode);
- end;
- if (c = #80) and (mode < 3) then {обработка нажатия 'Down'}
- begin
- Select(mode, mode + 1 ); {Выбор пункта, который ниже текущего}
- inc(mode);
- end;
- ext := false; {Нажатие клавиши с расширенным кодом обработано, сбрасываем ext}
- end;
- until c = #13; {Повторять пока код клавиши не равен 13 (Enter)}
- until c = #13;
- menu := mode; {Возращаем вызывающей программе номер выбранного пункта}
- end;
- {-----------------------------------------------------------------------------}
- procedure ClrLine(Y,X:integer); {Процедура очищает строку Y, начиная с позиции X}
- begin
- GotoXY(X,Y); {Переместить курсор в точку (X,Y)}
- ClrEOL; {Удалить символы с позиции X до конца строки}
- end;
- {---------------------------------------------------------------------------}
- procedure Message(Y:word; s:string); {Вывод сообщения S в строке Y}
- var
- X_,Y_:integer; {Текущие координаты курсора}
- begin
- X_ := WhereX; {Сохраним старые}
- Y_ := WhereY; {координаты курсора}
- ClrLine(Y,1); {Перейдем в строку Y и очистим ее}
- write(s); {выведем строку}
- GotoXY(X_,Y_);{Восстановим старые координаты}
- end;
- {-----------------------------------------------------------------------------}
- function ReadStr(Y:integer; var S:string; var Quit:boolean):char; {Ввод и редактирование строки S в строке c номером Y. Возвращает код последней нажатой клавиши (возможные значения: #13, #72, #80). Quit = true, если нажата клавиша Esc}
- var
- c:char; {код клавиши}
- i:integer; {текущая длина строки}
- ext:boolean; {True если нажата клавиша с расширенным кодом}
- begin
- ClrLine(Y, 14); {Перейдем в строку Y и очистим ее с позиции 14 до конца (до 14 выведено название поля)}
- i := Length(S); {длина строки}
- write(S); {вывод строки}
- ext := false; {инициализация}
- Quit := false;
- repeat
- c := readkey; {Считываем код клавиши}
- if c = #27 then {если нажата клавиша Esc, то}
- begin
- Quit := true; {Установим Quit и}
- exit; {выйдем из функции}
- end;
- if (c = #8) and (i > 0) then {обработка Backspace}
- begin
- GotoXY(WhereX-1, WhereY); {стереть последний символ}
- write(' ');
- GotoXY(WhereX-1, WhereY);
- delete(S, i, 1); {Удалить последний символ из строки S}
- dec(i); {Уменьшить длину строки}
- end;
- if c = #0 then ext := true; {Если нажата клавиша с расширенным кодом, установим ext}
- if (c in ['a'..'z', 'A'..'Z', 'а'..'я', 'А'..'Я','-']) and (i<80-14) and not ext then {проверка кода клавиши на принадлежность к множеству алфавитных и проверка текущей длины строки}
- begin
- write(c); {выведем введенный символ}
- s := s+c; {присоединим его к концу строки S}
- inc(i); {увеличим длину строки на 1}
- end;
- until (c = #13) or ((c in [#72, #80]) and ext); {выход из функции происходит при нажатии Enter(13), Up(72) или Down(80)}
- ReadStr := c; {вернем код последней нажатой клавиши. М.б. только 13, 72, или 80}
- end;
- {-----------------------------------------------------------------------------}
- function ReadPart(Y:integer; var P:integer; var Quit:boolean):char; {Считывание части света (параметры и возвращаемое значение аналогичны предыдущей функции)}
- var
- c:char; {код клавиши}
- i:integer; {номер текущей строки}
- ext:boolean; {True если нажата клавиша с расширенным кодом}
- begin
- ClrLine(Y,14);{Перейдем в строку Y и очистим ее с позиции 14 до конца (до 14 выведено название поля)}
- if P <> 0 then {Если происходит редактирование, а не ввод, то выведем уже выбранную часть света}
- write(Parts[P]);
- Quit:=false; {инициализация}
- Message(9,'Выберите часть света, в которой расположена страна'); {Вывести сообщение в 9 строку}
- GotoXY(1, 10); {Переместить курсор в точку (1, 10)}
- for i:=1 to 6 do {Вывести названия частей света}
- Writeln(i,' - ', Parts[i]);
- i:= 0;
- GotoXY(14, Y); {Переместить курсор в точку (14, Y)}
- repeat
- c := readkey; {Считать код клавиши}
- if c = #27 then {Обработка нажатия Escape (как в предыдущей функции)}
- begin
- Quit := true;
- exit;
- end;
- if c = #0 then ext := true; {Если нажата клавиша с расширенным кодом, установим ext}
- if c in ['1'..'6'] then {Если нажата клавиша из диапазона 1..6, то}
- begin
- ClrLine(Y,14); {Очистим строку Y с позиции 14 до конца и }
- Write(Parts[ord(c)-ord('0')]); {Выведем название выбранной части света}
- GotoXY(WhereX-1, WhereY);
- P := ord(c)-ord('0'); {Сохраним номер выбранной части света}
- end;
- until (c=#13) or ((c in [#72, #80]) and ext); {выход из функции, если нажата клавиша Enter(13), Up(72) или Down(80)}
- for i:=0 to 6 do {Очистим строки 9-15}
- Message(9+i, '');
- ReadPart := c; {Вернем код последней клавиши (как в предыдущей функции)}
- end;
- {-----------------------------------------------------------}
- {-----------------------------------------------------------}
- procedure EnterData; {Процедура, в которой происходит ввод данных}
- var
- F: file of Data; {Файл с данными}
- G: Data; {Запись с данными}
- c: char; {Символ}
- s, quit:boolean; {Флаги: s = True, если заполнены все поля. Quit = true, если пользователь нажал Esc}
- i: word; {Номер заполняемого поля}
- begin
- assign(F, 'base.dat'); {связать F с файлом base.dat}
- {$I-} {отключить проверки IO}
- reset(F); {открыть файл}
- {$I+} {включить проверки IO}
- if IOResult <> 0 then {Если результат последней операции IO (открытие файла) <>0 (например, файл base.dat не существует), то создадим файл}
- rewrite(F)
- else {иначе переместимся в конец файла}
- while not EOF(F) do Read(F, G);
- repeat
- clrscr; {очистить экран}
- i := 1; {Инициализация}
- G.Country := ''; {Инициализация}
- G.Part := 0; {Инициализация}
- G.Capital := ''; {Инициализация}
- Writeln('Страна : ');
- Writeln('Часть света: ');
- Writeln('Столица : ');
- Message(9, 'ESC - возврат в меню');
- repeat
- repeat
- GotoXY(14, i);
- case i of {в соответствии с текущим номером поля (i), считываем}
- 1: c := ReadStr(1, G.Country, quit); {Название страны}
- 2: c := ReadPart(2, G.Part, quit); {Части света}
- 3: c := ReadStr(3, G.Capital, quit); {или столицы}
- end;
- if quit then {Если пользователь нажал Esc (В функциях ReadStr или ReadPart), то закроем файл и выйдем из процедуры}
- begin
- close(F);
- exit;
- end;
- if (c in [#72, #80]) then {Если пользователь нажал Up или Down (В функциях ReadStr или ReadPart), то перейдем в соответствующее поле}
- begin
- if (c = #72) and (i > 1) then
- dec(i);
- if (c = #80) and (i < 3) then
- inc(i);
- end;
- if (c = #13) and (i < 3) then {Если пользователь нажал Enter в 1-й или 2-й строке, то}
- begin
- inc(i); {Перейти к следующей строке}
- c := #0;
- end;
- until (c = #13) and (i = 3); {выйти из цикла ввода, когда пользователь нажимет Enter в 3 поле}
- if G.Country = '' then {Введено название страны?}
- begin
- i := 1; {если нет, то перейти в 1-е поле}
- s := false;
- end
- else s:= true; {Если заполнено 1-е поле, возможно, что все данные введены (далее еще 2 проверки)}
- if g.Part = 0 then {Введена часть света?}
- begin
- i:=2; {если нет, то перейти во 2-е поле}
- s := false;
- end;
- if G.Capital = '' then {Введена столица?}
- begin
- i:=3; {если нет, то перейти в 3-е поле}
- s := false;
- end;
- if not s then {Если не данные введены, то выведем сообщение и перейдем в начало цикла ввода (выбранным будет незаполненное поле)}
- Message(9, 'Нужно заполнить все поля');
- until s; {Выход, если s = true (все поля заполнены)}
- Write(F, G); {Запишем введенную запись в файл}
- until c = #27; {Повторять ввод пока пользователь не нажмет Esc}
- close(F); {Закрыть файл}
- end;
- Procedure WriteItem(var D:Data); {Вывод записи D}
- Var
- X,Y, i:integer;
- s:string;
- begin
- Y := WhereY; {Номер строки, в которой находится курсор}
- GotoXY(2, Y); {Переместить курсор в точку (2, Y)}
- s := D.Country; {Сохраняем название страны во временную переменную}
- if Length(D.Country)<24 then {Если длина строки < 24, то выводим ее полность}
- write('│',D.Country)
- else
- begin {иначе обрезаем ее и добавляем '...'}
- Delete(S, 22 , Length(s) - 21);
- write('│', s+'...');
- end;
- GotoXY(27, Y);
- Write('│', Parts[D.Part]); {Выводим часть света}
- {Вывод столицы (Также как вывод названия страны)}
- GotoXY(52, Y);
- s := D.Capital;
- if Length(D.Capital)<26 then {}
- write('│',D.Capital)
- else
- begin
- Delete(S, 25 , Length(s) - 25);
- write('│', s+'...');
- end;
- end;
- {Следующие 3 функции - режимы}
- {---------------------------------------------------------------------------}
- Function ShowAll(var I:Data):boolean;far; {Все записи}
- begin
- ShowAll := True;
- end;
- {----------------------------------------------------------------------------}
- Function Mode1(var I:Data):boolean;far; {Режим 1}
- begin
- if I.Part = Mode1Part then {Если запись I удовлетворяет условию (Mode1Part определяется в функции выбора режима),}
- Mode1:=true {то вернем True}
- else Mode1:=false; {иначе - False}
- end;
- {----------------------------------------------------------------------------}
- Function Mode2(var I:Data):boolean;far;
- begin
- if I.Country = Mode2Country then {Если запись I удовлетворяет условию (Mode2Country определяется в функции выбора режима),}
- Mode2:=true {то вернем True}
- else Mode2:=false; {иначе - False}
- end;
- {----------------------------------------------------------------------------}
- procedure Del(N:integer); {Удаление N-й записи из файла}
- var
- F, tmp:file of Data; {Файл с данными и временный файл}
- t:Data; {Переменная, с помощью которой будет происходить копирование записей во временный файл и обратно}
- i:integer;
- begin
- assign(F, 'base.dat');
- reset(F); {открываем файл с данными}
- assign(tmp, 'tmp.dat');
- rewrite(tmp); {создаем временный файл}
- Seek(F, N); {Перемещаемся в файле с данными к N-й записи}
- for i:=N to FileSize(F)-1 do {Копируем оставшиеся записи (от записи N до последней) во временный файл}
- begin
- read(F, t);
- write(tmp, t);
- end;
- close(tmp); {Закрываем временный файл}
- close(F); {Закрываем файл с данными}
- reset(F); {открываем файл с данными}
- seek(F, N-1); {Перемещаемся в файле с данными к N-й записи}
- Truncate(F); {Удаляем записи от записи с номером N до последней}
- close(F); {Закрываем файл с данными}
- reset(F); {открываем файл с данными}
- reset(tmp);{открываем временный файл}
- Seek(F, FileSize(F)); {Перемещаемся к концу файла с данными}
- for i:=1 to FileSize(tmp) do {Копируем записи из временного файла в файл с данными}
- begin
- read(tmp, t);
- write(F, t);
- end;
- close(F); {Закрываем файл с данными}
- close(tmp);{Закрываем временный файл}
- erase(tmp);{удаляем временный файл}
- end;
- {--------------------------------------------------------------------------}
- procedure Edit(N:integer); {Процедура для редактирования N-й записи}
- var
- F: file of Data; {Файл с данными}
- t: Data; {Редактируемая запись}
- c: char; {Символ}
- s,quit:boolean; {Флаги: s = True, если заполнены все поля. Quit = true, если пользователь нажал Esc}
- i: word; {Номер заполняемого поля}
- begin
- clrscr; {очистить экран}
- assign(F, 'base.dat'); {связать F с файлом base.dat}
- reset(F); {открыть файл}
- seek(F, N-1); {Переместиться к записи N-1}
- read(F, t); {считать запись}
- {Вывод данных}
- Writeln('Страна : ', t.Country); {Название страны}
- Writeln('Часть света: ', Parts[t.Part]); {Часть света}
- Writeln('Столица : ', t.Capital); {Столица}
- i := 1;
- repeat
- repeat
- case i of {в соответствии с текущим номером поля (i), редактируем}
- 1: c := ReadStr(1,t.Country, quit); {Название страны}
- 2: c := ReadPart(2,t.Part, quit); {Часть света}
- 3: c := ReadStr(3,t.Capital, quit); {или столицу}
- end;
- if quit then {Если пользователь нажал Esc (В функциях ReadStr или ReadPart), то сохраним изменения, закроем файл и выйдем из процедуры}
- begin
- close(F);
- reset(F);
- Seek(F, N-1);
- Write(F, t);
- close(F);
- exit;
- end;
- if (c in [#72, #80]) then {Если пользователь нажал Up или Down (В функциях ReadStr или ReadPart), то перейдем в соответствующее поле}
- begin
- if (c = #72) and (i > 1) then
- dec(i);
- if (c = #80) and (i < 3) then
- inc(i);
- end;
- if (c = #13) and (i < 3) then {Если пользователь нажал Enter в 1-й или 2-й строке, то}
- begin
- inc(i); {Перейти к следующей строке}
- c := #0;
- end
- until (c = #13) and (i = 3); {выйти из цикла ввода, когда пользователь нажимет Enter в 3 поле}
- if t.Country = '' then {Введено название страны?}
- begin
- i := 1; {если нет, то перейти в 1-е поле}
- s := false;
- end
- else s:= true; {Если заполнено 1-е поле, возможно, что все данные введены (далее еще 2 проверки)}
- if t.Part = 0 then {Введена часть света?}
- begin
- i:=2; {если нет, то перейти во 2-е поле}
- s := false;
- end;
- if t.Capital = '' then {Введена столица?}
- begin
- i:=3; {если нет, то перейти в 3-е поле}
- s := false;
- end;
- if not s then {Если не данные введены, то выведем сообщение и перейдем в начало цикла ввода (выбранным будет незаполненное поле)}
- Message(9, 'Нужно заполнить все поля');
- until s; {Выход, если s = true (все поля заполнены)}
- {Сохранение изменений}
- close(F);
- reset(F);
- Seek(F, N-1);
- Write(F, t);
- close(F);
- end;
- {---------------------------------------------------------------------------}
- Procedure SelectMode(var S:Predicate); {Выбор режима. Возвращает в параметре-переменной S функцию, соответствующую выбранному режиму}
- var
- c:char;
- i:integer;{текущий пункт}
- ext, quit:boolean; {Флаги: ext = True, если нажата клавиша с расширенным кодом. Quit = true, если пользователь нажал Esc}
- begin
- ClrScr; {очистить экран}
- writeln('[*] Показывать все записи');
- writeln('[ ] Вывод списка стран, расположенных в заданной части света');
- writeln('[ ] Вывод информации о заданной стране');
- ext := false;
- i := 1; {Изначально выбран 1-й пункт}
- repeat
- GotoXY(2, i); {выбрать i-й пункт}
- write('*');
- c := readkey;
- if c = #0 then ext := true; {установить ext, если нажата клавиша с расширенным кодом}
- if (c = #72) and ext and (i > 1) then {обработка нажатия UP}
- begin
- dec(i); {Выбрать пункт, который выше текущего}
- GotoXY(2, i+1); {Стереть *}
- write(' '); {в предыдущем пункте}
- end;
- if (c = #80) and ext and (i<3) then {обработка нажатия DOWN}
- begin
- inc(i); {Выбрать пункт, который ниже текущего}
- GotoXY(2, i-1); {Стереть *}
- write(' '); {в предыдущем пункте}
- end;
- until c = #13; {Выход из цикла при нажатии Enter}
- case i of {В зависимости от выбранного режима вернуть соответствующую функцию}
- 1: S := ShowAll; {Все записи}
- 2: begin
- S := Mode1; {1-й режим}
- ClrScr; {Очистить экран}
- Write('Часть света:');
- Mode1Part := 0;
- repeat
- c := ReadPart(1, Mode1Part, quit); {Считать часть света}
- until (c = #13) and (Mode1Part <> 0); {Выход поизойдет, когда пользователь выберет часть света и нажмет Enter}
- end;
- 3: begin
- S := Mode2; {2-й режим}
- ClrScr;
- Write('Страна : ');
- Mode2Country := '';
- repeat
- c := ReadStr(1, Mode2Country, quit); {Считать название страны}
- until (c = #13) and (Mode2Country <> ''); {Выход поизойдет, когда пользователь введет название страны и нажмет Enter}
- end;
- end;
- end;
- {---------------------------------------------------------------------------}
- Procedure Show; {вывод данных}
- var
- Items:array [1..22] of word; {массив из 22 элементов с номерами (в файле) выведенных на экран записей}
- t: Data;
- Select:Predicate; {Функция для режимов}
- N, i, j, k, offset, Y:integer; {offset - смещение в файле}
- F:file of data; {файл с данными}
- c:char;
- ext,scroll, refresh:boolean; {Флаги: ext = true, если нажата клавиша с расширенным кодом. Scroll = true, если необходима прокрутка. Refresh = true, если необходимо обновление экрана}
- begin
- ClrScr; {очистить экран}
- offset := 0; {находимя в начале файла}
- assign(F, 'base.dat'); {связать F с файлом base.dat}
- {$I-} {отключить проверки IO}
- reset(F); {открыть файл}
- {$I+} {включить проверки IO}
- if IOResult <> 0 then {Если результат последней операции IO (открытие файла) <>0, то выведем сообщение и выйдем из процедуры}
- begin
- Writeln('Файл base.dat не найден');
- Writeln('Нажмите любую клавишу чтобы вернуться в меню');
- readkey; {ожидание нажатия клавиши}
- exit;
- end;
- if FileSize(F) = 0 then {Если размер файла = 0, то выведем сообщение и выйдем из процедуры}
- begin
- ClrScr;
- Writeln('Нет записей');
- Writeln('Нажмите любую клавишу чтобы вернуться в меню');
- readkey;
- exit;
- end;
- GotoXY(1,2); {Выберем }
- write('*'); {Первую Запись, которая }
- Y := 2; {находится во 2-й строке}
- j := 1;
- scroll := false;{Прокрутка не нужна,}
- refresh := true;{но нужно обновление}
- N := 0; {Пока выведено 0 записей}
- Select := ShowAll; {Выводить все записи}
- repeat
- reset(f); {открываем файл}
- if (N = 0) or scroll or refresh then
- begin
- if refresh then {обновление}
- begin
- Message(1,' │ Страна │ Часть света │ Столица ');
- TextBackground(LightGray); {цвет фона}
- TextColor(Black); {цвет текста}
- Message(25,'Up/Down - навигация Del - удаление F3 - режим F4 - редактирование ESC - выход');
- TextColor(LightGray); {цвет текста}
- TextBackground(Black); {цвет фона}
- end;
- Seek(F, offset*22); {Перемещаемся в файле к блоку из 22 записей}
- for i:=2 to 24 do ClrLine(i,1); {очищаем экран (кроме заголовка таблицы)}
- i := offset*22 + 1;
- k:=1; {текущая строка на экране}
- GotoXY(3, 2);
- while (Not EOF(F)) and (k<=23) do {пока не достигнут конец файла и строка <= 23}
- begin
- read(F, t); {считываем запись}
- if Select(t) then {если она удовлетворяет выбранному режиму, то}
- begin
- WriteItem(t); {выводим ее}
- Items[k] := i; {сохраняем ее позицию в файле}
- inc(k); {увеличиваем номер строки}
- GotoXY(3, 1+k); {перемещаем курсор в следующую строку }
- end;
- inc(i); {увеличиваем номер записи в файле}
- end;
- N := k - 1; {сколько выведено записей}
- if N = 0 then {если выведено 0 записей, то}
- begin
- ClrScr; {предложим пользователю вернуться в меню или выбрать другой режим}
- Writeln('Нет записей');
- Writeln('ESC - вернуться в меню');
- Writeln('F3 - выбрать режим');
- c := readkey;
- if c = #0 then c:=readkey; {если нажата клавиша с расширенным кодом, то считаем следующий код}
- if c = #61 then {обработка F3}
- begin
- SelectMode(Select); {Выбрать режим}
- Refresh := true; {требуется обновление}
- offset := 0; {в начало файла}
- Y:=2; {перейти во 2-ю строку}
- Close(F); {закрыть файл}
- Continue; {перейти в начало цикла}
- end;
- if c = #27 then {если нажата клавиша Esc, то выйдем из процедуры}
- exit;
- end;
- GotoXY(1,Y); {выберем запись}
- write('*'); {в строке Y}
- Scroll := false;
- refresh := false;
- end;
- repeat
- c := readkey;
- if c = #0 then ext := true; {нажата клавиша с расширенным кодом}
- if (c = #83) and ext then {обработка Delete}
- begin
- clrscr;
- writeln('Удалить? y/n');
- repeat
- c := readkey;
- if UpCase(c) = 'Y' then {UpCase(c) преобразует символ в верхний регистр. Если пользователь нажал 'y' или 'Y', то}
- begin
- del(Items[j]); {удалим запись из файла}
- break; {выйдем из цикла}
- end;
- until UpCase(c) = 'N'; {Если пользователь нажал 'n' или 'N', то выйдем из цикла}
- if N = 1 then {если перед удалением была выведена всего 1 запись, то переместимся назад в файле }
- begin
- Dec(Offset);
- Y:=25;
- j := 23;
- end;
- if j > 1 then dec(j);
- if Y > 2 then dec(Y);
- refresh := true; {и произведем обновление}
- break; {выход из цикла}
- end;
- if (c = #61) and ext then {обработка F3}
- begin
- SelectMode(Select); {выбор режима}
- j := 1;
- Y := 2;
- offset := 0; {в начало файла}
- Refresh := true; {произведем обновление}
- break; {выход из цикла}
- end;
- if (c = #62) and ext then {Обработка F4}
- begin
- Edit(Items[j]); {Редактирование записи}
- refresh := true; {произведем обновление}
- break; {выход из цикла}
- end;
- if (c = #72) and ext and (Y >= 2) then {Обработка нажатия UP}
- begin
- if (Y = 2) and (j >= 1) then {Если находимся во 2-й строке }
- begin
- if offset > 0 then {и не в начале файла}
- begin
- dec(offset); {то переместимя назад в файле}
- Scroll := true; {и произведем прокрутку}
- Y:=24;
- j:=23;
- break;
- end
- end;
- {В противном случае - выберем запись, которая находится выше текущей}
- if j > 1 then dec(j);
- if Y > 2 then dec(Y);
- GotoXY(1, Y+1);
- write(' ');
- GotoXY(1, Y);
- write('*');
- end;
- if (c = #80) and ext and (Y <= N+1) then {Обработка нажатия Down}
- begin
- if (Y = 24) and( j <= FileSize(F)) then {Если находимся в 24-й строке и не в конце файла}
- begin
- inc(offset); {Переместимся вперед в файле}
- scroll := true; {произведем прокрутку}
- Y := 2;
- j := 1;
- break;
- end;
- If Y <= N then {Если находимся в строке с номером, меньшим, чем число выведенных записей, то выберем следующую запись}
- begin
- inc(j);
- inc(Y);
- GotoXY(1, Y-1);
- write(' ');
- GotoXY(1, Y);
- write('*');
- end;
- end;
- until (c in [#72, #80]) and ext or (c = #27);
- close(F); {Закрытие файла}
- until c = #27; {выход при нажатии Esc}
- end;
- begin
- repeat
- Mode := Menu; {вывод Меню}
- case Mode of
- 1: EnterData; {Ввод данных}
- 2: Show; {Просмотр данных}
- end;
- until mode = 3; {выход}
- end.
Add Comment
Please, Sign In to add comment