· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Ограничить число вводимых символов в Edit

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Сен 8, 2003 02:32:47

Уже задолбался мудрить..
Нужна процедура, ограничивающая количество
вводимых символов в Edit, только, например, 8 символов
и всё, чтоб при попытке ввести 9 раздавался
стандартный виндовый сигнал и символ не вводился.
Может уже всё до меня написано, а я выдумываю
велосипед??


Дата: Сен 8, 2003 02:43:28

Ламерское решение: EM_SETLIMITTEXT
Но... там есть большое НО. Лучше ловить EN_UPDATE, обрезать лишний текст и пищать через MessageBeep. Я когда-то так и делал, но кода что-то не найду.


Дата: Сен 8, 2003 03:03:30 · Поправил: Asterix

Сам я мудрил :-) вот такое, но по написании обнаружилось несколько
багов, т.е. мой код обрабатывает не все ситуации..
invoke GetWindowText, Edit1, ADDR szEdit1, 10
           mov StrLen,eax

           lea esi,szEdit1 ;загрузить в esi адрес буфера со строкой полученной из Edit1
           lea edi,szBuff
metka:
           cmp byte ptr [esi],00h
           jz ok
           xor ecx,ecx
           mov cl,byte ptr [esi]
           mov byte ptr [edi],cl
           inc esi
           inc edi

           jmp metka
bad:
           dec edi
           mov byte ptr [edi],00h
           invoke  SetWindowText, Edit1, ADDR szBuff

           jmp exit

ok:
            cmp StrLen,8         ;ограничение до 8 символов
            ja bad
exit:


Дата: Сен 8, 2003 03:34:13

Забыл добавить, нужно ещё обрабатывать вводимые символы,
допуская только 0-9 A-F


Дата: Сен 8, 2003 07:06:58

Примерно так. Надо погонять под отладчиком.
.IF uMsg == WM_COMMAND
 mov eax,wParam
 shr eax,16 ; получаем HIWORD
 .IF eax == EN_UPDATE
  invoke GetWindowText,lParam,ADDR szBuf,8
  .IF eax
   lea esi,szBuf
   mov edi,esi
   cld
   mov ecx,8
@parser:
   lodsb
   test al,al
   jz @endparse
   cmp al,'0'
   jl @skip
   cmp al,'F'
   jg @skip
   . . . ; проверка на 9-A
   stosb
@skip:
   loop @parser
@endparse:
   xor al,al
   stosb
   invoke SetWindowText,lParam,ADDR szBuff
  .ENDIF
 .ENDIF
.ENDIF


Дата: Сен 8, 2003 07:07:30

Пожалуй через EN_UPDATE - есть самый лучший способ. Только стоит посмотреть, чтобы он не очень тормозил ввод.


Дата: Сен 8, 2003 07:30:13

Quantum

Спасибо, я погоняю :-) Завтра меня провайдер отключит от инета
времени будет полно ;-)


Дата: Сен 8, 2003 11:23:18

[ Asterix: Забыл добавить, нужно ещё обрабатывать вводимые символы, допуская только 0-9 A-F ]

Вот некое общее решение стыринное у Джеймса Брауна. Может понравится...

_1158315539__MaskedEdit.rar


Дата: Сен 8, 2003 11:55:25

Проще всего субклассировать этот эдитбокс, а там уже делать, что угодно.


Дата: Сен 10, 2003 17:34:43

Всем спасибо за советы и исходники, но пока проблема не решена %)


Дата: Сен 10, 2003 18:55:24

Quantum

Твой вариант, как мне показалось, не обрабатывает ситуацию если
символы вводить в уже заполненный Edit в начале строки???

Four-F

Твой пример вроде работает как нужно, но код перенасыщен макросами
я в них запутался :(
---------------------------------------------------------
Пока сидел без инета написал ещё один вариант, как мне казалось
правильный, но прога что-то с ним отказалась работать, вылетает
с ошибкой, код конечно ламерный, но это сделано специально
для понятности
---------------------------------------------------------
.if eax == Edit1
           invoke GetWindowText, Edit1, ADDR szEdit1, 512
           lea esi,szEdit1 ;загрузить в esi адрес буфера со строкой полученной из Edit1
           lea edi,szBuff
           cmp eax,8
           ja @metka
@metka3:
           xor eax,eax
@metka1:
           cmp byte ptr [esi],00h
           jz @F
           cmp eax,8
           jz @F
           xor ecx,ecx
           mov cl,byte ptr [esi]
           mov byte ptr [edi],cl
           inc esi
           inc edi
           inc eax
           jmp @metka1
@@:
           mov byte ptr [edi],00h
           jmp @exit
@metka:
            xor ecx,ecx
@metka2:
            cmp byte ptr [edi],00h
            jz @F
            inc edi
            inc ecx
            jmp @metka2
@@:
            cmp ecx,8
            jnz @metka3
            invoke MessageBeep,MB_OK
@exit:
            invoke SetWindowText, Edit1, ADDR szBuff
.endif


Дата: Сен 10, 2003 19:17:00

Вот ещё искомый Edit..

_828525391__edit.zip


Дата: Сен 11, 2003 01:55:32

Asterix
Получилось, вроде...

_961481025__edit.rar


Дата: Сен 11, 2003 03:31:01

Quantum

Спасибо. Что-то получилось, но... поставь курсор в начало уже
заполненного Edit и всё что будет вводится будет забивать уже
введённое, т.е. как бы если б я это предварительно выделил мышью
и начал вводить.


Дата: Сен 11, 2003 03:56:07

Мне кажется что алгоритм должен быть такой, только у меня не
получается его реализовать:

1) Получаем строку в буфере и её длину(по какому условию в данном
случае не важно, хотя бы EN_UPDATE)
2) Проверка длины строки, если строка <= 8, то копируем
строку в буфер Buff, причем отсчитываем 8 символов, и выводим в Edit
выходим из процедуры
3) Если строка > 8 символов, то проверяем длину строки в
буфере Buff
4) Если длина строки в Buff уже была равна 8, т.е. буфер
заполнен полностью, то выводим строку в Edit из Buff и выходим из
процедуры
5) Иначе считаем строку в Buff < 8, т.к. при занесении строки
в этот буфер мы устанавливали счётчик и она не может быть
больше 8, и тогда переходим к пункту 2

Может это всё неправильно, но мне пока ничего другого не приходит в голову..

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.086