Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2602
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2266
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1318
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1404
Дата выхода:23.12.2010, 08:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:224 / 67
Вопросов / ответов:1 / 1

Вопрос № 181423: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Помогите с программой, которая дана ниже. В ней блокируется кнопка Отмена на всех страницах диалога и переход от одной страницы на другую происходит только при правильно уст...



Вопрос № 181423:

Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Помогите с программой, которая дана ниже. В ней блокируется кнопка Отмена на всех страницах диалога и переход от одной страницы на другую происходит только при правильно установленных флагах check box’ов.
Но есть два недочёта:
1. При неправильном вводе данных на первой странице появляется столько предупреждений MessageBox, сколько раз была нажата кнопка Далее. Но на второй странице этого нет, появляется только один MessageBox, сколько бы раз ни нажималось Готово. Не могу понять, куда этот MessageBox первого диалога включить, чтобы он появлялся только один раз, как во втором окне.
2. При нажатии на кнопку Отмена на второй странице меня перебрасывает на первую страницу, несмотря на то, что я правильно активизирую указанную страницу по ее идентификатору в ресурсах, например:
.ELSEIF eax==PSN_RESET ;нажата клавиша Отмена
invoke SendMessage, hPropSheet, PSM_SETCURSEL ID, 0, IDD_DLG2 ;оставаться на странице второго диалога, но никак не первого. Из-за чего подобное может происходить? Может, я не те сообщения посылаю?

Отправлен: 18.12.2010, 08:04
Вопрос задал: Adsorores (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Adsorores!
Ваши неточности и ошибки:
1) invoke SendMessage, hPropSheet, PSM_CHANGED, hwnd, 0 - лишнее.
Это не ошибка, просто некорректность. Сообщение PSM_CHANGED посылается, когда надо явно сказать sheet-у, что появились изменения
и будет активирована кнопка Применить/Apple. Простите, где Вы видете у себя эту кнопку? На самом деле, оно дальше и автоматом идет прекрасно.
2) Победил MessageBox, задав хозяином окно диалога, чем добился, что окно MessageBox-а стало модальным, т.е. не дает идти дальше, пока не нажмешь Ок
3) Ну а кнопку Cancel победил, отрабатывая не PSN_RESET, который почему-то не доходит, а PSN_QUERYCANCEL

Код:
;<< << << << << << << << << ПЕРВЫЙ ДИАЛОГ << << << << << << << << << << <<
PSDialog1 proc uses ebx, hwnd, uMsg, wParam, lParam
mov eax, uMsg
.IF eax==WM_NOTIFY
mov ebx, lParam
mov eax, NMHDR.code[ebx] ;код уведомления
.IF eax==PSN_SETACTIVE ;делаем страницу активной
m2m hPropSheet, NMHDR.hwndFrom[ebx] ;описатель окна набора страниц свойств
invoke SendMessage, hPropSheet, PSM_SETWIZBUTTONS, 0, PSWIZB_NEXT ;делаем активной кнопку NEXT
invoke SetWindowLong, hwnd, DWL_MSGRESULT, TRUE ;сохраним изменения
ret urn TRUE
.ELSEIF eax==PSN_WIZNEXT
invoke SendDlgItemMessage, hwnd, IDD_CB1, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 1
mov cb1, eax ;сохраним результат в cb1
invoke SendDlgItemMessage, hwnd, IDD_CB2, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 2
mov cb2, eax ;сохраним результат в cb2
invoke SendDlgItemMessage, hwnd, IDD_CB3, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 3
mov cb3, eax ;сохраним результат в cb3
invoke SendDlgItemMessage, hwnd, IDD_CB4, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 4
mov cb4, eax ;сохраним результат в cb4
invoke SendDlgItemMessage, hwnd, IDD_CB5, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 5
mov cb5, eax ;сохраним результат в cb5
invoke SendDlgItemMessage, hwnd, IDD_CB6, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 6
mov cb6, eax ;сохраним результат в cb6
.IF cb1==1 && cb2==1 && cb3==0 && cb4==0 && cb5==0 && cb6==1 ;если правильно, то
invoke SetWindowLong, hwnd, DWL_MSGRESULT, 0 ;сохраним изменения
return TRUE
.ELSE ;иначе
invoke SendMessage, hPropSheet, PSM_SETCURSELID, 0, IDD_DLG1 ;остаёмся на этой же странице

invoke MessageBox,hwnd,ADDR String,ADDR String,MB_OK ;с посылкой сообщения об ошибке
invoke SetWindowLong, hwnd, DWL_MSGRESULT, TRUE ;сохраним изменения
return TRUE
.ENDIF
.ELSEIF eax==PSN_QU ERYCANCEL ;если нажата кнопка Cancel
invoke SendMessage, hPropSheet, PSM_SE TCURSELID, 0, IDD_DLG1 ;остаёмся на этой же странице
invoke SetWindowLong, hwnd, DWL_MSGRESULT, TRUE ;сохраним изменения
return TRUE
.ENDIF
.ENDIF
xor eax,eax
ret
PSDialog1 endp
;<< << << << << << << << << ВТОРОЙ ДИАЛОГ << << << << << << << << << << <<
PSDialog2 proc uses ebx, hwnd, uMsg, wParam, lParam
mov eax, uMsg
.IF eax==WM_NOTIFY
mov ebx, lParam
mov eax, NMHDR.code[ebx]
.IF eax==PSN_SETACTIVE ;делаем страницу активной
m2m hPropSheet, NMHDR.hwndFrom[ebx] ;описатель окна набора страниц свойств
invoke SendMessage, hPropSheet, PSM_SETWIZBUTTONS, 0, PSWIZB_FINISH or PSWIZB_BACK
invoke SetWindowLong, hwnd, DWL_MSGRESULT, TRUE ;сохраним изменения
return TRUE

.ELSEIF eax==PSN_WIZFINISH
invoke SendDlgItemMessage, hwnd, IDD_CB1, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 1
mov cb1, eax ;сохраним результат в cb1
invoke SendDlgItemMessage, hwnd, IDD_CB2, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 2
mov cb2, eax ;сохраним результат в cb2
invoke SendDlgItemMessage, hwnd, IDD_CB3, BM_GETCHECK,0,0 ;узнать текущее состояние флажка 3
mov cb3, eax ;сохраним результат в cb3
.IF cb1==1 && cb2==1 && cb3==0 ;если правильно, то
invoke SetWindowLong, hwnd, DWL_MSGRESULT, 0 ;сохраним изменения
return TRUE
.ELSE ;иначе
invoke SendMessage, hPropSheet, PSM_SETCURSELID, 0, IDD_DLG2 ;остаёмся на этой же странице
invoke MessageBox,hwnd,ADDR String2,ADDR String2,MB_OK ;с посылкой сообщения об ошибке
invoke SetWindowLong, hwnd, DWL_MSGRESULT, TRUE ;сохраним изменения
return TRUE
.ENDIF
.ELSEIF eax==PSN_QUERYCANCEL
;если нажата кнопка Cancel
invoke SendMessage, hPropSheet, PSM_SETCURSELID, 0, IDD_DLG2 ;остаёмся на этой же странице
invoke SetWindowLong, hwnd, DWL_MSGRESULT, TRUE ;сохраним изменения
return TRUE
.ENDIF
.ENDIF
xor eax,eax
ret
PSDialog2 endp

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 20.12.2010, 01:05
Номер ответа: 264912
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5
Комментарий к оценке:
Огромное спасибо за нахождение и чёткое объяснение моих некорректностей и неточностей!

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264912 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.25 от 13.12.2010

    В избранное