Форум » Clipper » Memoedit » Ответить
Memoedit
Dima: Как ограничить кол-во символов вводимых в memoedit , в примере это не более 50 ? cmem:=space(50) cmem:=memoedit(cmem,11,21,18,59,.t.,"my_func",38)
Ответов - 18
Григорьев Владимир: Насколько я знаю, НИКАК! Можно вудымывать всякие приемы с пользовательской функцией, которая передается в качестве параметра MEMOEDIT(), но тем не менее всегда найдется способ, который позволит пользователю преодолеть ограничение. Я помню как-то делал BACKSPACE, когда позиция выходила за ограничение. Тем не менее если очень быстро набирать текст, то почему-то BACKSPACE не срабатывал. То есть в буфер клавиатуры печатаемые символы попадали быстрее, чем я заносил BACKSPACE. Поэтому пришлось писать свою функцию на ассемблере, которая работает как MEMOEDIT, но с ограниченным числом символов. Я ее назвал MEMOGET. Правда сейчас в связи с поломкой диска я свои нароботки утратил..
Dima: Григорьев Владимир пишет: Насколько я знаю, НИКАК Плёхо.... Может есть какой то аналог в котором можно это сделать ?
Dima: Поставим вопрос иначе Как находясь в Memoedit выяснить сколько символов введено ?
Григорьев Владимир: Опять-таки, НИКАК! Вы можете только определить номер строки и номер колонки. А символы могут удаляться и снова набираться. То есть если человек нажал 10 раз букву "А", это не означает, что в поле присутствует 10 символов. Проблемы с MEMOEDIT() в том, что очень много комбинаций служебных клваиш существует. Например, можно удалить целиком строку, или вставитиь новую строку.
Dima: Григорьев Владимир Хорошо , как тогда контролировать следующую ситуацию ? В программе сделан миничат между пользователями программы (сетевой) Длина поля для сообщения составляет 250 символов , НО , набирая сообщение в memoedit , пользователь может набрать более 250 символов. То есть на экране он видит все что хотел набрать , но реально дойдет только 250 символов.
Петр: Dima пишет: Длина поля для сообщения составляет 250 символов , НО , набирая сообщение в memoedit , пользователь может набрать более 250 символов. То есть на экране он видит все что хотел набрать , но реально дойдет только 250 символов. Делать так, как делают некоторые мобильные телефоны - автоматически разбивают длинную SMS на несколько коротких и передают.
Dima: Петр Отличная идея , спасибо !!!
ALGO: Попробовал модифицировать штатный Memoedit для CLIPPER 5.3b следующим образом: добавил 14-й параметр, который участвует в вычислении наибольшей длины возвращаемой строки следующим образом: а) если он не указан или 0 - тогда стандартное поведение MemoEdit-a. б) если он указан и больше длины исходной строки (1-й параметр), то в качестве макс. значение берется значение этого параметра, иначе - длина исходной строки. Изменения старался делать так, чтобы в наименьшей степени затронуть оригинальный текст этой функции. Результаты обнадеживающие, но пока очень сырая версия, поэтому больше для ознакомления. Пробовал c Blinker, а c Exospace еще не проверял. Для применения следует прилинковать memoedit.obj - и тогда вместо штатного MemoEdit-а будет модифицированный. Прилагается оригинальный текст программы (memoedit0.asm) и модифицированный мною (memoedit.asm) - для желающих поэкспериментировать. http://slil.ru/27732091
ALGO: Заметил один дефект - возле индикатора <Insert> появлялись лишние символы. Исправиленный вариант http://slil.ru/27732682
Dima: ALGO пишет: Попробовал модифицировать штатный Memoedit для CLIPPER 5.3b Проверить не могу так как использую Clipper 5.2e
ALGO: Попробую еще для 5.2е - не думаю, что сложнее будет.
Dima: ALGO пишет: добавил 14-й параметр, который участвует в вычислении наибольшей длины возвращаемой строки следующим образом: ALGO пишет: Попробую еще для 5.2е - не думаю, что сложнее будет. Минутку , если мы говорим о возвращаемом значении , тогда это не интерестно. Нужно было ограничить дальнейший ввод в Memoedit если длина вводимой строки превышает длину начальную.
ALGO: Функция честно возвращает ровно то, что введено - никаких дополнительных действий с возвращаемым значением не делается. Ограничение возвращаемого значения достигается за счет блокирования дальнейшего ввода и разблокированием при удалении символов, т.е. уменьшении количества символов. Я правильно понял задачу?
Dima: ALGO Да правильно. Собственно пожелание изложено в первой месаге. Если я правильно понял ответы Григорьев Владимир то сделать это сложно в том виде в котором существует Memoedit , но попробовать я готов (в смысле потестить) , хотя с другой стороны все реализовал с подсказки Петра , и всех все устроило. Спасибо , думаю нет смысла заморачиваться с переделкой !!!
PRG_MAN: а у меня своя memoedit, через объект, делаю в ней, что хочу... Лениться меньше надо, а не твердить "НИКАК,НИКАК,..."
Andrey: PRG_MAN пишет: Лениться меньше надо, а не твердить "НИКАК,НИКАК,..." Если такой умный... то почему живешь не на Канарах или Багамах ?
PRG_MAN: Ты из ГРУ ?
Григорьев Владимир: PRG_MAN пишет: а у меня своя memoedit, через объект, делаю в ней, что хочу... Лениться меньше надо, а не твердить "НИКАК,НИКАК,..." Так поделитесь идеями, что именно делает ваша MEMOEDIT(), и как она оформлена в объект. То есть какие именно методы объекта вы реализовали для MEMOEDIT()?
полная версия страницы