MFC: GetDlgItem()
От: Gildor  
Дата: 11.11.04 15:17
Оценка:
btnOK = (CButton*) GetDlgItem(IDOK);
btnCancel = (CButton*) GetDlgItem(IDC_CANCEL);
edLogin = (CEdit*) GetDlgItem(IDC_EDIT1);
edPassword = (CEdit*) GetDlgItem(IDC_EDIT2);
Group = (CStatic*) GetDlgItem(IDC_STATIC1);

При попытке вызова btnOK->SetWindowText() — все в порядке, а вот при попытке вызова btnCancel->SetWindowText() или любого другого валиться с исключением. В чем может быть проблема?


11.11.04 18:21: Перенесено модератором из 'C/C++. Прикладные вопросы' — Odi$$ey
Re: MFC: GetDlgItem()
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 11.11.04 15:26
Оценка:
Здравствуйте, Gildor, Вы писали:

G> btnOK = (CButton*) GetDlgItem(IDOK);

G> btnCancel = (CButton*) GetDlgItem(IDCANCEL);
G> edLogin = (CEdit*) GetDlgItem(IDC_EDIT1);
G> edPassword = (CEdit*) GetDlgItem(IDC_EDIT2);
G> Group = (CStatic*) GetDlgItem(IDC_STATIC1);
[ posted via RSDN@Home 1.1.4 beta 3 r230, accompanied by AC-DC — For Those About To Rock (We Salute You) ]
- Искренне ваш, Поросенок Пафнутий
Re: MFC: GetDlgItem()
От: Кодт Россия  
Дата: 11.11.04 16:18
Оценка:
Здравствуйте, Gildor, Вы писали:

G>При попытке вызова btnOK->SetWindowText() — все в порядке, а вот при попытке вызова btnCancel->SetWindowText() или любого другого валиться с исключением. В чем может быть проблема?


В том, что наверное, нет у тебя такого контрола IDC_CANCEL. Вот ты и пытаешься разыменовать объект по нулевому указателю.
Штатный ид для Cancel — это IDCANCEL, хотя, конечно, это твоё дело, как кнопки нумеровать.
Перекуём баги на фичи!
Re[2]: MFC: GetDlgItem()
От: Gildor  
Дата: 12.11.04 09:33
Оценка:
К>В том, что наверное, нет у тебя такого контрола IDC_CANCEL. Вот ты и пытаешься разыменовать объект по нулевому указателю.
К>Штатный ид для Cancel — это IDCANCEL, хотя, конечно, это твоё дело, как кнопки нумеровать.
Нет, дело в том, что IDC_CANCEL существует. Я тоже сначала думал, что проблема в IDCANCEL и сменил ему ID, но дело в том, что не работают и остальные обращения, к EditBox'ам и Static'ам. Работает только btnOK и все.
Re[3]: MFC: GetDlgItem()
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 12.11.04 09:38
Оценка:
Здравствуйте, Gildor, Вы писали:

К>>В том, что наверное, нет у тебя такого контрола IDC_CANCEL. Вот ты и пытаешься разыменовать объект по нулевому указателю.

К>>Штатный ид для Cancel — это IDCANCEL, хотя, конечно, это твоё дело, как кнопки нумеровать.
G>Нет, дело в том, что IDC_CANCEL существует. Я тоже сначала думал, что проблема в IDCANCEL и сменил ему ID, но дело в том, что не работают и остальные обращения, к EditBox'ам и Static'ам. Работает только btnOK и все.

Попробуйте оттрассировать вызов GetDlgItem(). Скорее всего, MFC/винда не находят окон с указанными идентификаторами (они точно правильные?), после чего Вам и возвращается нулевой указатель, приводящий при попытке разыменования к исключению. Проверьте свое окно спаем (Spy++) и сравните идентификаторы, которые покажет он, с теми, которые в используете в проблемном коде.
[ posted via RSDN@Home 1.1.4 beta 3 r231, accompanied by The Exploited — Now I'm Dead ]
- Искренне ваш, Поросенок Пафнутий
Re: MFC: GetDlgItem()
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 12.11.04 09:43
Оценка:
Здравствуйте, Gildor, Вы писали:

G> btnOK = (CButton*) GetDlgItem(IDOK);

G> btnCancel = (CButton*) GetDlgItem(IDC_CANCEL);
G> edLogin = (CEdit*) GetDlgItem(IDC_EDIT1);
G> edPassword = (CEdit*) GetDlgItem(IDC_EDIT2);
G> Group = (CStatic*) GetDlgItem(IDC_STATIC1);

G>При попытке вызова btnOK->SetWindowText() — все в порядке, а вот при попытке вызова btnCancel->SetWindowText() или любого другого валиться с исключением. В чем может быть проблема?


почему-бы не сделать все по-человечески, через

DDX_Control(pDX, IDC_CANCEL, btnCancel);

и т.д.?
Re[2]: MFC: GetDlgItem()
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 12.11.04 09:48
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>почему-бы не сделать все по-человечески, через


OE>DDX_Control(pDX, IDC_CANCEL, btnCancel);


Если ID-шники "кривые" (а у меня есть подозрение, что дело именно в этом), то будет валиться точно так же.
[ posted via RSDN@Home 1.1.4 beta 3 r231, accompanied by The Exploited — Don't Pay The Poll Tax ]
- Искренне ваш, Поросенок Пафнутий
Re[3]: MFC: GetDlgItem()
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 12.11.04 09:56
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

OE>>почему-бы не сделать все по-человечески, через

OE>>DDX_Control(pDX, IDC_CANCEL, btnCancel);
SDB>Если ID-шники "кривые" (а у меня есть подозрение, что дело именно в этом), то будет валиться точно так же.

если будет связывать контролы с переменными при помощи визарда, то все ID будут честными (до следующей модернизации диалога, уж точно)
Re[4]: MFC: GetDlgItem()
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 12.11.04 10:11
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>если будет связывать контролы с переменными при помощи визарда, то все ID будут честными (до следующей модернизации диалога, уж точно)


Тогда-то конечно...
[ posted via RSDN@Home 1.1.4 beta 3 r231, accompanied by The Exploited — Stop The Slaughter ]
- Искренне ваш, Поросенок Пафнутий
Re: MFC: GetDlgItem()
От: Кодт Россия  
Дата: 12.11.04 12:27
Оценка:
Здравствуйте, Gildor, Вы писали:

<>

А может, ты не к тому диалогу прицепился?
Например, такое бывает, когда есть несколько диалогов с одинаковым идентификатором (в разных DLL'ках, или в resource.h идентификаторы неуникальные).

Попробуй показать этот диалог безо всякой обработки/настройки. Это то, что ты хотел?
Если да, запусти Spy++ или тому подобный инструмент, и посмотри, какие ID'ы у его контролов. Их числовые значения совпадают с тем, что написано в resource.h ?
Наконец, хэндл окна диалога — совпадает с тем, который ты получил?
Перекуём баги на фичи!
Re[2]: MFC: GetDlgItem()
От: Gildor  
Дата: 12.11.04 14:36
Оценка:
К>Попробуй показать этот диалог безо всякой обработки/настройки. Это то, что ты хотел?
К>Если да, запусти Spy++ или тому подобный инструмент, и посмотри, какие ID'ы у его контролов. Их числовые значения совпадают с тем, что написано в resource.h ?
К>Наконец, хэндл окна диалога — совпадает с тем, который ты получил?

Ладно, до понедельника все равно не смогу проверить. На самом деле вся эта писанина — это апплет для Control Panel, который поддерживает *.ini файлы с языками и работает с *NiX сервером по SOAP. Он был реализован с помощью Builder'а и его VCL(каюсь), а потом выяснилось, что апплет-то глючный оказался. Вот и пришлось мне его заново переписывать на VC+MFC. А я (как бы помягче?) в нем не очень. Непривычно. Может быть кто-то подскажет, как можно по-другому работать c Caption'ами. Буду очень благодарен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.