Форум » 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()?



полная версия страницы