![]() |
|
|
![]()
|
|
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
Создаю програму, которая работает с диалоговыми окнами, диалоговое окно создаю с помощью редактора ресурсов, а потом создаю для него отдельний клас на основе CFileDialog.В функции обработки клика на кнопке(дополнительно созданной на этом диалоге с помощью редактора ресурсов)пишу код:
GetParent()->GetDlgItem(0x480)->GetWindowText(m_strFilename);//считываю //строку с edit'a GetParent()->SendMessage(WM_COMMAND, IDCANCEL); На этом куске кода у меня выдает ошибку на макрсое ASSERT(::IsWindow(m_hWnd)); Тобишь оно фактически говорит, что GetParent() не возвращает указатель на окно.Не понимаю, в чем причина, может я не в ту сторону рою? |
|||
|
||||
| nikf |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 6.6.2005 Где: город-герой Жирно вск Репутация: 1 Всего: 1 |
а что есть уверенность что это что-то реальное возвращает?
|
||||
|
|||||
| dont |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
Цитата из файла dlgs.h
Тобишь проблема врядли в этом, строчкой GetDlgItem(0x480) прога просто должна считывать значения с edit'a и все. Я вот тут думаю, а не из-за того ли это, что я в обработке клика на кнопке IDС_DELETE,которая изначально не является елементом класса CFileDialog(это я уже вручную ее туда прикрутил), вызываю функцию GetParent(), может это окно не является непосредственным предком для IDC_DELETE? |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не ищи сложных объяснений, проверь сначала очевидное.
Во первых, выясни, кто именно порождает ASSERT. С помощью отладчика. Кандидатов 2: GetParent и GetDlgItem(0x480). Если я правильно понимаю, это код обработчика, который является методом твоего класса-диалога? Тогда 100%, что это GetDlgItem(0x480). Даже если контрол с таким ID в диалоге есть. Интересно, что ты имеещь в виду, вызывая там GetParent()... -------------------- ... |
|||
|
||||
| dont |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
Мда.... Оно вызывает Ассерт на функции GetWindowText(m_strFilename).
Хотя вот цитата из МСДН"а: The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application. ТОесть исходя из слов разработчиков МСДН"а
Не понимаю в чем проблема. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
GetWindowText вызывает ASSERT, т.к. m_hWnd равно 0.
А это так, потому что GetDlgItem возвращает 0. Потому что нет такого контрола у того окна, к которому ты взываешь! Что, по твоему, возвращает GetParent()? Вовсе не окно-диалог, как ты, видимо, рассчитываешь. В функции обработки клика тебе не надо звать парента. Это ведь метод твоего класса, который наследован от CFileDialog, так? Значит, this и есть то окно, у которого есть кнопка 0x480 (надеюсь, есть А вообще, неплохо бы писать так:
По крайней мере, пока не освоишься. -------------------- ... |
|||
|
||||
| dont |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
Это уже очень интересно, написал так, как ты посоветовал
Выдает ошибку на той же GetWindowText(m_strFilename); в файле wincore.cpp, вставлю код функции
Ну вот, первый же ассерт здесь выкидывает Ассершен Дебаг Фейлер! З.Ы, Насчет 0x480 - прочитал в умной книжке, и сам убедился, что оно определено в файле dlgs.h . Добавлено @ 03:39 Кстати, насчет GetParent(). В этой же программе в этом же файле на несколько строчек выше в функции OnInitDialog() у меня есть код:
Дак вот, он работает совершенно нормально и нормально присваивает кнопке Caption "Delete"!!! Это меня склоняет думать, что все таки трабл в том, что возможно это из-за того, что моя кнопка ID_DELETE не является родной для стандартного диалога, а поэтому не возвращает нормально указатель на родительское окно. Но как выйти из этой ситуации не знаю... ПОдскажите плз!!!!Меня этот кусок текста уже так достал, и главное что никак разобраться не могу!!! |
||||||
|
|||||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Ты звпутался окончательно, напиши что тебе конкретно надо сделать, и сделаем, а то со своими НЕНУЖНЫМИ GetParent() достал. Говори-что тебе надо сделать, только опиши подробно действия.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
dont
Да, верно, извини, диалог CFileDialog многослойный, поэтому обращение к его стандартным кнопкам через GetParent() и т.д. - правильное, это я запамятовала. НО: 1) я не совсем поняла, куда ты добавляешь свою кнопку в ресурсах: очень может статься, что ее парентом является таки непосредственно твой класс - попробуй все-таки написать без GetParent(). 2) Посмотри Spy'ем, кто чей предок. 3) если кнопка твоя - почему ты используешь какой-то странный идентификатор из dlgs.h, а не какой-нибудь свой IDC_DELETE? 4) Если дело в одной-единственной дополнительной кнопке, можно обойтись без всего этого геморроя - если отказаться от кнопки HELP и заменить на ней текст. Я имею в виду, что можно не создавать свой ресурс и не страдать, где свои кнопки, а где стандартные. А вообще, я тоже уже запуталась, имеет ли какое-нибудь отношение твоя кнопка ID_DELETE к контролу, у которого ты спрашиваешь текст ... Кстати, из того, что идентификатор edt1 определен в файле dlgs.h совершенно не следует, что он есть в FileDialog - проверь спаем. -------------------- ... |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
dont, здесь, имхо, нужно писать так: GetParent()->SetDlgItem(0x480)->GetWindowText(m_strFilename); -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ерунда, попробуй объясни компилятору, что ты имеешь в виду (Нет такой функции CWnd::SetDlgItem(ID), да и какой смысл она может иметь?) -------------------- ... |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
Да, херню сморозил не подумавши, извиняюсь.
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| dont |
|
||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 11.7.2005 Репутация: нет Всего: нет |
Что такое "многослойный диалог, сам юзал "GetParent()" т.к. опять таки же прочитал в умной книжке, а про многослойные диалоги там ничего небыло.
Я добавляю свою кнопку прямо в редакторе ресурсов на новом только созданом ДиалогБоксе, ее идентификатор IDC_DELETE(вызов многострадючих GetParent()'ov осуществляю при обработке клика на которой) .Потом для этого ресурса диалога создаю класс CSpecialFileDialog(на основе CFileDialog). Без ГетПарент() пробывал - не помагает.... =(
"Странный идентификатор" я использую для считывания строки из Edit'a(которая есть стандартным елементом класса CFileDialog).
- Никогда с ним не работал, но все же решился: смотрел-смотрел, там столько разнообразных окон,процессов и т.д., что мне трудно было определиться где какое окно, не то что кто есть чьим предком...
Нет, мне нужно именно так сделать, так что без гемороя не обойтись...
Спасибо конечно, но я все таки желаю разобраться, не люблю когда за меня что то кто-то делает. А сделать мне всего то нужно: считать в обработчике CSpecialFileDialog::OnBnClickedDelete() строку из Edit'a(который являеться стандартным елементом CFileDialog), в котором указываеться имя выбраного файла и отправить родительскому окну класса CView командное сообщение IDCANCEL . |
||||||||||||
|
|||||||||||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Итак вступление к твоей ошибке...
Вчера дядя Coocky пытался достучатся от родительского окна , к дочернему, которое находится в представлении, еще и в закладке. Так вот, время поджимало. и я под конец рабочего дня рещил за 5 минут достучаться до него через... GetWindow() Потому что поленился правильно получить указатель. Т.е получить представление, затем закладку, а уж затем , окно диалога связяное с закладкой.Теперь курю, смотрю хоккей. Так Вот, к чему я -у тебя указатель неправильный. Посмотри , чему равно m_hWnd полученого указателя, через отладчик? Даю рубь за сто, оно равно m_hWnd=??? Теперь к нашим баранам...
У тебя CSpecialFileDialog -это окно ДОЧЕРНЕЕ ( имено ДОЧЕРНЕЕ), те е порождается окном CFileDialog (не путай с наследуется!)?????, так как же тогда ты делаешь GetParent() без приведения к типу указателя Это только первый вопрос! -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Вопрос 2 Где CEdit* edit=(CEdit*)GetDlgItem(0x480) ; edit-> GetWindowText(); -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |