MFC - проблемы с отладкой приложения
Но я не знаю, как его отладить, как зайти в код, обрабатывающий событие нажатия кнопки. Искал в нескольких книгах и в свойствах VC касательно дебага, но пока ничего. При дебаге окно проги блокируется и нет возможности сделать какие-либо действия, выдается сообщение "There is no source code available for the current location.", т.е. брейкпоинты в коде обработчика нажатия кнопки не видны.
Как решить проблему? Почему окно проги заблокировалось? Можно ли сгенерировать сообщения или вызвать принудительно обработчик события во время дебага?
Цитата: blackswan
Простой вопрос. Наказали писать код для простенького приложения на VC. У меня VS 2005. Написал код на MFC (визардом сделал CDialog), где по нажатию на кнопку происходит вычисление и выдача результатов в CEdit. При запуске приложения оно работает нормально и по кнопке выдает значения, но не те, что надо. я бы хотел узнать, в чем ошибка вычисления или может отображение результата не работает.
Но я не знаю, как его отладить, как зайти в код, обрабатывающий событие нажатия кнопки. Искал в нескольких книгах и в свойствах VC касательно дебага, но пока ничего. При дебаге окно проги блокируется и нет возможности сделать какие-либо действия, выдается сообщение "There is no source code available for the current location.", т.е. брейкпоинты в коде обработчика нажатия кнопки не видны.
Как решить проблему? Почему окно проги заблокировалось? Можно ли сгенерировать сообщения или вызвать принудительно обработчик события во время дебага?
Но я не знаю, как его отладить, как зайти в код, обрабатывающий событие нажатия кнопки. Искал в нескольких книгах и в свойствах VC касательно дебага, но пока ничего. При дебаге окно проги блокируется и нет возможности сделать какие-либо действия, выдается сообщение "There is no source code available for the current location.", т.е. брейкпоинты в коде обработчика нажатия кнопки не видны.
Как решить проблему? Почему окно проги заблокировалось? Можно ли сгенерировать сообщения или вызвать принудительно обработчик события во время дебага?
Ставите один breakpoint в обработчике кнопки. Жмете F5, дальше жмете на кнопку и F10, F11
конечно же не забыть скомпилироваться в режиме Debug и нажимать вышеуказанную кнопку F5 для режима Debug, а не Release
я так и делаю, и прекрасно отличаю кнопку F5 от других кнопок и знаю, что каждая обозначает, было бы так просто, я б не писал тут. Был бы рад, если б вы ответили на мои вопросы насчет блокировки окна проги в режиме F5, если б я мог нажимать на кнопки в моей проге, то естественно попал бы внутрь кода обработчика. И можно ли как-то сгенерировать сообщение по событию нажатия на кнопку искусственно во время дебага?
Цитата: blackswan
я так и делаю, и прекрасно отличаю кнопку F5 от других кнопок и знаю, что каждая обозначает, было бы так просто, я б не писал тут. Был бы рад, если б вы ответили на мои вопросы насчет блокировки окна проги в режиме F5, если б я мог нажимать на кнопки в моей проге, то естественно попал бы внутрь кода обработчика. И можно ли как-то сгенерировать сообщение по событию нажатия на кнопку искусственно во время дебага?
Ну тогда выкладывайте проект. Пояснение "окно блокируется" как-то не очень информативно. Обычно оно блокируется когда во время дебага среда ждет от вас действий.
Конечно окно блокируется в "режиме F5" - тоесть в режиме пошаговой отладки. Именно поэтому брекпоинт нужно поставить уже внутри обработчика нажатия кнопки, а не где-то еще. Например, на первом операторе вычислений.
Есть такой хороший отладчик, называеться OllyDbg можешь им проверить где и что меняется.
при дебаге выдает каракули при преобразовании... подскажите, как записать результат- число float - в CEdit...
И вот еще вопрос, мне необходимо обработать событие изменения текста в одном CEdit.. я так понимаю, надо добавить макро в карту сообщений диалога и установить связь с обрабатывающим методом, в msdn нашел это :
ON_EN_CHANGE( <id>, <memberFxn> ) - макро в карту
и afx_msg void memberFxn( ) - описание метода в классе диалога
но как я понял <id> - это идентификатор, если я рисую CEdit статически через ресурсы, а я создаю (и пересоздаю) его динамически в коде программы, как мне получить <id> для такого объекта, или может его не существует и надо по-другому делать обработку?
Цитата: blackswan
спасибо... собственно сейчас уже всё ок и дебаг нормально делаю, не знаю, что изменилось, ничего не делал вроде... теперь другой простой вопрос... есть у меня много Cedit, в которых я пишу числа... из одних я читаю значения используя _wtof и _wtoi , в другие должен записать результат после работы с числами, но не могу найти правильной функции превращения чисел в widechar, только в ASCII... в чем разница между multibytechar и widechar?... widechar - это Unicode ?...
при дебаге выдает каракули при преобразовании... подскажите, как записать результат- число float - в CEdit...
при дебаге выдает каракули при преобразовании... подскажите, как записать результат- число float - в CEdit...
Используйте sprintf и swprintf, или CString::Format
Цитата: blackswan
И вот еще вопрос, мне необходимо обработать событие изменения текста в одном CEdit.. я так понимаю, надо добавить макро в карту сообщений диалога и установить связь с обрабатывающим методом, в msdn нашел это :
ON_EN_CHANGE( <id>, <memberFxn> ) - макро в карту
и afx_msg void memberFxn( ) - описание метода в классе диалога
но как я понял <id> - это идентификатор, если я рисую CEdit статически через ресурсы, а я создаю (и пересоздаю) его динамически в коде программы, как мне получить <id> для такого объекта, или может его не существует и надо по-другому делать обработку?
При создании динамически ID вы указваете в последнем параметре метода Create.
спасибо, работает... а в VC есть какой-нибудь простой служебный messagebox?
Цитата: blackswan
спасибо, работает... а в VC есть какой-нибудь простой служебный messagebox?
Ну обычный ::MessageBox. И еще, если не изменяет память, CWnd::MessageBox
Цитата: blackswan
спасибо, работает... а в VC есть какой-нибудь простой служебный messagebox?
Ну если уж быть точным, не в VC (ибо это среда разработки), а в MFC. Я считаю таким "простым" месажбоксом AfxMessageBox()
Ну API функция MessageBox к MFC никоим боком не относиться. )