Решил сделать прогу, которая при вводе строки позволяет использовать клавиши 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));
endelseif (ord(ch) = 75) and (Length(S) <> 0 ) then{LEFT}begin
gotoXY(whereX - 1, WhereY);
Active:=Active - 1;
endelseif ord(ch) = 77then{RIGHT}begin
gotoXY(wherex + 1, Wherey);
Active:=Active + 1;
endelseIf (Active <= Length(s)) and (ch In ['a'..'z']) then Insert (ch,s,active) {INSERT}elseif (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
9.04.2007 21:59
uses crt;
function get_str(max_len: byte): string;
var s: string; ch: char;
begin
s := '';
repeat
ch := readkey;
if length(s) <= max_len thencase ch of#8: beginif length(s) > 0thenbeginwrite(#8,#32,#8);
delete(s, length(s), 1)
endend#13:;
elseif length(s) <> max_len thenbegin s := s + ch; write(ch) endend;
until ch = #13;
writeln;
get_str := s
end;
ВОт алгоритм, кажись Volvo написал, за что ему огромная благодарность ) Думаю мож поможет чем-то тебе...
Tan
9.04.2007 22:14
спасибо, но в этом алго помоему только бекспейс работает. Мне всё таки очень интересно разобраться со своими набросками.
volvo
9.04.2007 22:26
Во-первых, посмотри, насколько проще становится структура программы при использовании 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 > 1thenbegin{ LEFT }
dec(Active);
gotoXY(Active, WhereY);
end;
#77:
if WhereX <= length(s) thenbegin{ RIGHT }
inc(Active);
gotoXY(Active, Wherey);
end;
#83:
if Active <= Length(s) then
Delete(s, Active, 1); { DELETE }end;
#8:
if length(s) <> 0thenbegin{ BS }
dec(Active);
gotoXY(Active, Wherey);
Delete(s, Active, length(s));
end;
#13:
break;
'a' .. 'z':
beginif 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
10.04.2007 15:04
Большое спасибо ! Действительна структура очень простая стала!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.