![]() |
eXeL@B —› Программирование —› ошибка в простом диалоге |
Посл.ответ | Сообщение |
|
Создано: 24 апреля 2013 19:37 · Личное сообщение · #1 всех приветствую краткое изложение проблемы: каркас простого диалога.. если пытаюсь обрабатывать по нажатию цифр/букв считывать из окна, перевести в верхний регистр и вывести в то же окно - утечка стека и крэш. причем: SetDlgItemText "уходит" в систему и при наличии бряка на cmp word [wParam], ID_field_in снова мы тут тормознем, а стек чем-то израсходован и так в цикле до крэша. если все тоже самое но вывести в соседнее окно - все нормально. если считывать из окна, перевести в верхний регистр и вывести в то же окно по кнопке GO - все нормально. голову уже сломал.. ничего не понимаю... может знающие люди что подскажут.. спасибо! исходник на фасме + ехе в архиве, пасс exelab.ru ![]() ![]() |
|
Создано: 25 апреля 2013 09:17 · Поправил: drone · Личное сообщение · #2 |
|
Создано: 25 апреля 2013 09:27 · Поправил: drone · Личное сообщение · #3 Code:
почему бы не так? Code:
и тут Code:
почему бы не так? Code:
![]() |
|
Создано: 25 апреля 2013 11:47 · Личное сообщение · #4 drone за вот это " cmp [wParam],EN_CHANGE shl 16 + ID_field_in jnz @F " отдельное спасибо ![]() остальные примеры - тоже полезны, спасибо. но это дело вкуса. но ключевая проблема/фраза осталась незамеченной: если пытаюсь обрабатывать по нажатию цифр/букв считывать из окна, перевести в верхний регистр и вывести в то же окно - утечка стека и крэш. те. в таком виде имеем непонятный цикл + крэш по исчерпанию стека Code:
![]() |
|
Создано: 25 апреля 2013 12:34 · Поправил: -=AkaBOSS=- · Личное сообщение · #5 |
|
Создано: 25 апреля 2013 12:55 · Поправил: DMD · Личное сообщение · #6 -=AkaBOSS=- обновил файлы ошибка завязана на Code:
те. если считывать из контролла и тут же в него писать ![]() ![]() |
|
Создано: 25 апреля 2013 13:17 · Личное сообщение · #7 ИМХО проблемма не в стеке, а в маршрутизации сообщений. На одно нажатие кнопки попадаем в этот участок кода 15 раз. Почему??? Stack 6FA0C, 6F4E0, 6EFB4, 6EA88, 6E55C, 6E030, 6DB04, 6D5D8, 6D0AC, 6CB80, 6C654, 6C128, 6BBFC, 6B6D0, 6B1A4 Далее новое нажатие и стек начинает снова со значения 6FA0C. Утечки нет. ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 25 апреля 2013 13:38 · Поправил: drone · Личное сообщение · #8 выкинул все непонятное и перебазировал обработчик, один фиг вылетает ![]() ps. вот такая шняга на си тоже вылетает Code:
![]() |
|
Создано: 25 апреля 2013 13:49 · Поправил: DMD · Личное сообщение · #9 OKOB пишет: ИМХО проблемма не в стеке, а в маршрутизации сообщений. На одно нажатие кнопки попадаем в этот участок кода 15 раз. Почему??? полностью согласен: стек - всего лишь внешнее проявление. вот и мне интересно. почему??? что в чтении из контролла и тут же записи в него такого уникального и только при вводе в него цифры/буквы?? по кнопке GO такой же код работает. Code:
ps/ такое впечатление что при ассинхронном вводе в контрол следующим шагом в него нельзя писать.. с чего бы это? ![]() |
|
Создано: 25 апреля 2013 14:01 · Поправил: drone · Личное сообщение · #10 |
|
Создано: 25 апреля 2013 14:30 · Личное сообщение · #11 ну, как по мне, тут всё правильно - винда ловит изменение текста в контроле, шлёт сигнал обработчику. обработчик меняет текст в контроле, винда ОПЯТЬ ловит изменение и ОПЯТЬ вызывает обработчик и так рекурсивно до полного охренения. у меня, правда, это никакой ошибки не вызывает предлагаю такой костыль: Code:
![]() |
|
Создано: 25 апреля 2013 14:41 · Личное сообщение · #12 |
|
Создано: 25 апреля 2013 15:18 · Личное сообщение · #13 -=AkaBOSS=- костыль в принципе работает, но приходится по каждому вводу в контролл ставить курсор в крайнее правое положение.. иначе вместо "123456" получим "654321" придется изменить вопрос: как лучше всего сделать ввод в контролл, обработать что ввели, на пример- перевели в верхний регистр и вывести в том же контроле? ну и там дальше.. или в связи с рекурсией это сделать не так просто как кажется? ![]() |
|
Создано: 25 апреля 2013 15:36 · Личное сообщение · #14 |
|
Создано: 25 апреля 2013 15:45 · Поправил: -=AkaBOSS=- · Личное сообщение · #15 DMD пишет: но приходится по каждому вводу в контролл ставить курсор в крайнее правое положение не понимаю, почему так получается.. ![]() как вариант, можно послать EM_SETSEL: Code:
DMD пишет: как лучше всего сделать ввод в контролл, обработать что ввели, на пример- перевели в верхний регистр и вывести в том же контроле? если нужно просто перевести в верхний регистр, то лучше установи у эдита стиль ES_UPPERCASE можно обрабатывать WM_CHAR или WM_KEYUP ![]() |
|
Создано: 25 апреля 2013 16:58 · Личное сообщение · #16 |
|
Создано: 25 апреля 2013 17:58 · Личное сообщение · #17 |
|
Создано: 25 апреля 2013 20:31 · Поправил: neomant · Личное сообщение · #18 Так и есть - рекурсия. После отправки контролу WM_SETTEXT контрол уведомляет диалог WM_COMMAND EN_UPDATE и EN_CHANGE. Правильно в данном случае выставить в ресурсах свойство Uppercase контрола в True, чем изобретать костыли или не искать лёгкого пути. ----- Следуй за белым кроликом ![]() |
|
Создано: 25 апреля 2013 21:05 · Поправил: neomant · Личное сообщение · #19 Если таки не ищем лёгких: Code:
----- Следуй за белым кроликом ![]() |
|
Создано: 25 апреля 2013 22:42 · Личное сообщение · #20 |
|
Создано: 26 апреля 2013 10:03 · Поправил: DMD · Личное сообщение · #21 neomant пишет: в данном случае выставить в ресурсах свойство Uppercase контрола в True перевод в верхний регистр - это только как пример. при любой другой обработке введенных символов без "костылей" похоже не обойтись. какие есть мысли на этот счет? -=AkaBOSS=- "костыль" фактически дает двухкратную запись в контролл вывода. коррекция: Code:
но почему после вывода в контролл ID_field_out "ловим" останов на " mov [flag], 0"?? и в стек указатель на ID_field_in 0006FB74 |00000111 0006FB78 |03000101 [img]img/attach.gif"> <SCRIPT type=text/javascript>dfl("files/","ebb3_26.04.2013_EXELAB.rU.tgz");</SCRIPT> - Sample__Dialog_a_.EXE ps/ лишние символы в коде - это не ко мне <img src="http://exelab.ruimg/smilies/s1.gif[/img] ![]() |
|
Создано: 26 апреля 2013 11:09 · Личное сообщение · #22 А почему бы не обработать сообщение WM_CHAR. В wParam будет ASCII код вводимого символа, делай с ним че хошь и отдавай обратно в wParam ![]() |
|
Создано: 26 апреля 2013 13:00 · Личное сообщение · #23 |
|
Создано: 26 апреля 2013 14:01 · Личное сообщение · #24 DMD crc1, кстати, правильно говорит. если обрабатывать вместо EN_UPDATE - WM_CHAR, можно обойтись без SetWindowText/SetDlgItemTxt и, стало быть, и без рекурсивного вызова обработчика а насчёт моего костыля - фикс должен выглядеть немного иначе, имхо см аттач. ![]() ![]() |
|
Создано: 26 апреля 2013 14:23 · Личное сообщение · #25 |
|
Создано: 26 апреля 2013 14:30 · Поправил: neomant · Личное сообщение · #26 |
|
Создано: 26 апреля 2013 15:13 · Личное сообщение · #27 |
|
Создано: 26 апреля 2013 15:23 · Поправил: -=AkaBOSS=- · Личное сообщение · #28 |
|
Создано: 26 апреля 2013 15:40 · Личное сообщение · #29 |
|
Создано: 28 апреля 2013 00:15 · Личное сообщение · #30 |
![]() |
eXeL@B —› Программирование —› ошибка в простом диалоге |
Эта тема закрыта. Ответы больше не принимаются. |