Программа
{ Ввод строки }
USES CRT; { Подключение модуля CRT }
VAR Str:string;
PROCEDURE InputString(XStart,YStart,LenWin,LenStr:byte;var Str:String);
{ Процедура ввода строки }
Const InsertFlag:boolean=TRUE; { Флаг вставки/замены }
Var BufStr:String; { Буфер для хранения начального состояния строки }
Exit:boolean; { Флаг выхода }
EscFlag:boolean; { Флаг выхода по Esc }
NumberFirstViewSymbol,Position:integer;
{ Номер первого отображаемого символа и номер вводимого символа }
ChangeString:boolean; { Флаг изменений в строке }
Ch:char; { Буфер сканированного символа }
Procedure GoToX; { Процедура позиционирования курсора }
begin
GoToXY(XStart+Position-NumberFirstViewSymbol,YStart)
{ Позиционирование курсора }
end;
Procedure WriteString; { Процедура вывода строки }
var i:integer; { Счетчик }
begin
GoToXY(XStart,YStart); { Позиционирование курсора }
for i:=NumberFirstViewSymbol to NumberFirstViewSymbol+LenWin-1
do { Цикл вывода строки }
if i<=Length(Str) then Write(Str[i]) { Вывод символа строки }
else Write(' '); { Вывод пробела }
GoToX { Позиционирование курсора }
end;
Begin { InputString }
Exit:=FALSE; { Сброс флага выхода }
ChangeString:=FALSE; { Сброс флага изменений в строке }
BufStr:=Str; { Сохранение начального значения строки }
if XStart+LenWin>81 then LenWin:=81-XStart;
{ Переопределение длины окна при неправильном вызове процедуры }
NumberFirstViewSymbol:=1; { Определение первого отображаемого символа }
Position:=1; { Определение номера вводимого символа }
WriteString; { Вывод строки }
repeat { Цикл опроса клавиатуры }
Ch:=ReadKey; { Чтение клавиатуры }
case Ch of { Выбор действия по коду нажатой клавиши }
#0: case ReadKey of { Обработка двусимвольных клавиш }
#82: InsertFlag:=not InsertFlag; { Нажатие Ins }
#83: begin { Нажатие Del }
if not ChangeString { Если не было изменений, }
then begin { то - очистка строки }
{ Сброс строки при отсутствии изменений в строке: }
Str:=''; { Удаление всей строки }
Position:=1; { Сброс позиции курсора в строке }
NumberFirstViewSymbol:=1 { Переопределение
первого отображаемого символа }
end
else Delete(Str,Position,1); { Удаление символа }
WriteString { Вывод строки }
end;
#75: begin { Движение влево }
ChangeString:=TRUE; { Подъем флага изменений }
if Position>1 { Если возможно движение влево, }
then begin { то - }
Dec(Position); { Уменьшение номера позиции }
if Position<NumberFirstViewSymbol
{ Если позиция курсора вышла за границу окна, }
then begin { то - }
Dec(NumberFirstViewSymbol);
{ Уменьшение номера первого
отображаемого символа }
WriteString { Вывод строки }
end
end;
GoToX { Позиционирование курсора }
end;
#77: begin { Движение вправо }
ChangeString:=TRUE; { Подъем флага изменений }
if Position<=Length(Str)
{ Если позиция в пределах строки, то - }
then begin
Inc(Position); { увеличение номера позиции }
if Position=NumberFirstViewSymbol+LenWin
{ Если номер позиции вышел за предел окна, }
then begin { то - }
Inc(NumberFirstViewSymbol);
{ увеличение номера первого
отображаемого символа }
WriteString { Вывод строки }
end
end;
GoToX { Позиционирование курсора }
end;
#71: begin { Нажатие Home }
ChangeString:=TRUE; { Подъем флага изменений }
Position:=1;
{ Переопределение номера вводимого символа }
NumberFirstViewSymbol:=1;
{ Переопределение номера превого отображаемого символа }
WriteString { Вывод строки }
end;
#79: begin { Нажатие End }
ChangeString:=TRUE; { Подъем флага изменений }
Position:=Length(Str)+1;
{ Переопределение номера вводимого символа }
if Position>=NumberFirstViewSymbol+LenWin then
{ Если номер позиции вышел за предел окна, то - }
begin
NumberFirstViewSymbol:=Position-LenWin+1;
{ Переопределение номера превого отображаемого символа }
WriteString { Вывод строки }
end;
GoToX { Позиционирование курсора }
end
end;
#8: begin { Нажатие BackSpace }
ChangeString:=TRUE; { Подъем флага изменений }
if Position>1 { Если позиция больше первой, }
then begin { то - движение влево с удалением символа }
Dec(Position); { Уменьшение номера позиции }
Delete(Str,Position,1); { Удаление символа }
if NumberFirstViewSymbol>1
{ Если начало строки вне окна,}
then Dec(NumberFirstViewSymbol);
{ Уменьшение номера первого отображаемого симола
(движение начала строки вправо) }
WriteString { Вывод строки }
end
end;
#13: begin { Нажатие Enter }
Exit:=TRUE; { Подъем флага "ВЫХОД" }
EscFlag:=FALSE { Сброс флага выхода по Esc }
end;
#27: begin { Нажатие Esc }
Exit:=TRUE; { Подъем флага "ВЫХОД" }
EscFlag:=TRUE { Подъем флага выхода по Esc }
end;
#9:;
else begin
if not ChangeString then { Если не было изменений, то - }
begin
Str:=''; { Предварительная очистка строки }
ChangeString:=TRUE { Подъем флага изменений }
end;
if (Position<=LenStr)
and
((Length(Str)<LenStr) and InsertFlag
or
(Length(Str)<=LenStr) and not InsertFlag)
{ Если позиция вводимого символа в строке
не превышает допустимую границу и новый символ
не увеличит строку больше допустимого }
then { то - }
begin { Ввод символа: }
if InsertFlag or (Position>Length(Str))
then Insert(Ch,Str,Position)
else Str[Position]:=Ch;
{ Если установлен режим вставки, то - вставка символа
в строку, иначе - замена }
Inc(Position); { Увеличение номера позиции }
if Position=NumberFirstViewSymbol+LenWin
{ Если номер позиции вышел за предел окна, то - }
then Inc(NumberFirstViewSymbol); { Увеличение номера
первого отображаемого символа }
WriteString { Вывод строки }
end { Ввод символа }
else Write(#7) { иначе - сигнал переполнения }
end
end
until Exit;
if EscFlag then begin { Если из цикла вышли по Esc , то - }
Str:=BufStr; { Востановление значения строки }
Position:=1; { Определение номера вводимого символа }
NumberFirstViewSymbol:=1; { Определение первого
отображаемого символа }
WriteString { Вывод строки }
end;
End; { InputString }
BEGIN
ClrScr;
Str:='1234567890.1234567890.1234567890.1234567890.=';
Str:='1234567890.12=';
GoToXY(9,10);
Write(#26);
GoToXY(9+14+1,10);
Write(#27);
InputString(10,10,14,15,Str);
GoToXY(1,1);
WriteLn(Str)
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию