Помощь - Поиск - Пользователи - Календарь
Полная версия: Строка
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Tan
Решил сделать прогу, которая при вводе строки позволяет использовать клавиши backspace, del и передвигаться по символам используя кнопки влево, вправо имея при этом возможность вставить символ в любое место. Ну что - то напутал, так как del и вставление символа не пашут. Наверно что - то с переменной Active, вгляните пожалуйста.

uses crt;
var  Active : Integer; {позиция курсора}
          s : string; {рабочая строка}
         ch : char; {для посимвольной считки}
  begin
    writeln ('Vvedite stroku');
    S:='' ;
    Active:=1; {1, ведь изначально курсор после символа}
    repeat
      Clrscr;
       Write (s);
         read (ch);
          if (ord(ch) = 8) and (Length(S) <> 0) then {BACKSPASE}
              begin 
                   gotoXY(WhereX - 1, Wherey);
                   Active:=Active - 1;          
                   Delete (s,Active,Length(s));
              end else
                      if (ord(ch) = 75) and (Length(S) <> 0 ) then {LEFT}
               
                begin 
                     gotoXY(whereX - 1, WhereY); 
                     Active:=Active - 1;
                end
                    else
             if ord(ch) = 77 then {RIGHT}
                begin   
                     gotoXY(wherex + 1, Wherey);
                     Active:=Active + 1;
                end
              else
                 If (Active <= Length(s)) and  (ch In ['a'..'z']) then  Insert (ch,s,active) {INSERT}
              else 
                 if (Active <=Length(s)) and (ord(ch) = 83) then Delete (s,Active,1); {DELETE}
                 if Active = Length(s) then S:= S + Ch;
    until ord(ch) = 13;
  end.

Renbo



uses crt;
function get_str(max_len: byte): string;
  var s: string; ch: char;
  begin
    s := '';
    repeat
      ch := readkey;
      if length(s) <= max_len then
        case ch of
          #8: begin
                if length(s) > 0 then begin
                  write(#8,#32,#8);
                  delete(s, length(s), 1)
                end
              end
          #13:;
          else
            if length(s) <> max_len then
              begin s := s + ch; write(ch) end
        end;
    until ch = #13;
    writeln;
    get_str := s
  end;




ВОт алгоритм, кажись Volvo написал, за что ему огромная благодарность )
Думаю мож поможет чем-то тебе...
Tan
спасибо, но в этом алго помоему только бекспейс работает. Мне всё таки очень интересно разобраться со своими набросками.
volvo
Во-первых, посмотри, насколько проще становится структура программы при использовании Case:
uses crt;
var
  Active: Integer;
  s: string;
  ch: char;

begin
  writeln('Vvedite stroku');
  s := '';

  Active := 1;
  repeat
    gotoxy(1, WhereY); clreol;
    write(s); gotoxy(Active, 1);

    ch := readkey;
    case ch of
      #0:
      case readkey of
        #75:
        if Active > 1 then begin { LEFT }
          dec(Active);
          gotoXY(Active, WhereY);
          end;

          #77:
          if WhereX <= length(s) then begin { RIGHT }
            inc(Active);
            gotoXY(Active, Wherey);
          end;

          #83:
          if Active <= Length(s) then
            Delete(s, Active, 1); { DELETE }

        end;

        #8:
          if length(s) <> 0 then begin { BS }
            dec(Active);
            gotoXY(Active, Wherey);
            Delete(s, Active, length(s));
          end;

        #13:
        break;

        'a' .. 'z':
        begin
          if Active <= Length(s) then Insert(ch, s, active)
          else s := s + ch;
          inc(Active);
        end;


      end;

    until false;

    writeln;
    writeln('s = ', s);
  end.


А теперь, собственно, почему не работал твой вариант? Потому, что read(ch) не отработает до тех пор, пока ты не нажмешь Enter... То есть, фактически ты вводишь строку, пользуясь теми возможностями, которые у тебя есть, если ты напишешь
Var s: string;
...
ReadLn(s);

. Но вот когда ты нажимаешь Enter, в Ch заносится только первый символ введенной тобой строки... Очень серьезная ошибка.
Tan
Большое спасибо ! Действительна структура очень простая стала!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.