Программа


{ Ввод строки }
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.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию