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

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

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

 
 Ответить  Открыть новую тему 
> Строка
сообщение
Сообщение #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 -


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

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

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


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


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

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

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


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


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

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

 





- Текстовая версия 2.10.2020 3:32
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name