IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Строка
Tan
сообщение 9.04.2007 21:41
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


Решил сделать прогу, которая при вводе строки позволяет использовать клавиши 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.



Сообщение отредактировано: Tan - 9.04.2007 21:42


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Renbo
сообщение 9.04.2007 21:59
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской

Репутация: -  0  +





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 написал, за что ему огромная благодарность )
Думаю мож поможет чем-то тебе...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tan
сообщение 9.04.2007 22:14
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


спасибо, но в этом алго помоему только бекспейс работает. Мне всё таки очень интересно разобраться со своими набросками.


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.04.2007 22:26
Сообщение #4


Гость






Во-первых, посмотри, насколько проще становится структура программы при использовании 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 заносится только первый символ введенной тобой строки... Очень серьезная ошибка.

Сообщение отредактировано: volvo - 9.04.2007 22:28
 К началу страницы 
+ Ответить 
Tan
сообщение 10.04.2007 15:04
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


Большое спасибо ! Действительна структура очень простая стала!


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 2:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"