Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Visual C++.Dialog Box, в MFC 
:(
    Опции темы
dont
Дата 22.10.2005, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.7.2005

Репутация: нет
Всего: нет



Создаю програму, которая работает с диалоговыми окнами, диалоговое окно создаю с помощью редактора ресурсов, а потом создаю для него отдельний клас на основе CFileDialog.В функции обработки клика на кнопке(дополнительно созданной на этом диалоге с помощью редактора ресурсов)пишу код:

GetParent()->GetDlgItem(0x480)->GetWindowText(m_strFilename);//считываю //строку с edit'a
GetParent()->SendMessage(WM_COMMAND, IDCANCEL);
На этом куске кода у меня выдает ошибку на макрсое ASSERT(::IsWindow(m_hWnd));
Тобишь оно фактически говорит, что GetParent() не возвращает указатель на окно.Не понимаю, в чем причина, может я не в ту сторону рою?

PM MAIL ICQ   Вверх
nikf
Дата 22.10.2005, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: 1
Всего: 1



Цитата(dont @ 22.10.2005, 19:29)
GetParent()->GetDlgItem(0x480)

а что есть уверенность что это что-то реальное возвращает?
Цитата(dont @ 22.10.2005, 19:29)
GetDlgItem(0x480)
-подозрительно 0x480 чего за цифры

PM MAIL   Вверх
dont
Дата 22.10.2005, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.7.2005

Репутация: нет
Всего: нет



Цитата
подозрительно 0x480 чего за цифры

Цитата из файла dlgs.h
Цитата
/* Edit controls */
#define edt1        0x0480

Тобишь проблема врядли в этом, строчкой GetDlgItem(0x480) прога просто должна считывать значения с edit'a и все.
Я вот тут думаю, а не из-за того ли это, что я в обработке клика на кнопке IDС_DELETE,которая изначально не является елементом класса CFileDialog(это я уже вручную ее туда прикрутил), вызываю функцию GetParent(), может это окно не является непосредственным предком для IDC_DELETE?

PM MAIL ICQ   Вверх
Earnest
Дата 23.10.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Не ищи сложных объяснений, проверь сначала очевидное.
Во первых, выясни, кто именно порождает ASSERT. С помощью отладчика.
Кандидатов 2: GetParent и GetDlgItem(0x480).

Если я правильно понимаю, это код обработчика, который является методом твоего класса-диалога? Тогда 100%, что это GetDlgItem(0x480). Даже если контрол с таким ID в диалоге есть. Интересно, что ты имеещь в виду, вызывая там GetParent()...





--------------------
...
PM   Вверх
dont
Дата 23.10.2005, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.

ТОесть исходя из слов разработчиков МСДН"а
Цитата
If the specified window is a control, the text of the control is copied
макрос ::IsWindow(m_hWnd)); не должен вообще вызыватся.
Не понимаю в чем проблема.
PM MAIL ICQ   Вверх
Earnest
Дата 23.10.2005, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



GetWindowText вызывает ASSERT, т.к. m_hWnd равно 0.
А это так, потому что GetDlgItem возвращает 0.
Потому что нет такого контрола у того окна, к которому ты взываешь!

Что, по твоему, возвращает GetParent()? Вовсе не окно-диалог, как ты, видимо, рассчитываешь. В функции обработки клика тебе не надо звать парента. Это ведь метод твоего класса, который наследован от CFileDialog, так? Значит, this и есть то окно, у которого есть кнопка 0x480 (надеюсь, есть smile ). Пиши просто GetDlgItem(ID)->GetWindowText.
А вообще, неплохо бы писать так:
Код

CWnd* pWnd = GetDlgItem(ID_XXX);
ASSERT(pWnd);
pWnd->GetWindowText(str);

По крайней мере, пока не освоишься.



--------------------
...
PM   Вверх
dont
Дата 25.10.2005, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.7.2005

Репутация: нет
Всего: нет



Это уже очень интересно, написал так, как ты посоветовал
Код

                               CWnd* pWnd = GetDlgItem(0x480);
        ASSERT(pWnd);
        pWnd->GetWindowText(m_strFilename);


Выдает ошибку на той же GetWindowText(m_strFilename); в файле wincore.cpp, вставлю код функции
Код

void CWnd::GetWindowText(CString& rString) const
{
    ASSERT(::IsWindow(m_hWnd));

#ifndef _AFX_NO_OCC_SUPPORT
    if (m_pCtrlSite == NULL)
    {
#endif
        int nLen = ::GetWindowTextLength(m_hWnd);
        ::GetWindowText(m_hWnd, rString.GetBufferSetLength(nLen), nLen+1);
        rString.ReleaseBuffer();

#ifndef _AFX_NO_OCC_SUPPORT
    }
    else
    {
        m_pCtrlSite->GetWindowText(rString);
    }
#endif
}

Ну вот, первый же ассерт здесь выкидывает Ассершен Дебаг Фейлер!
З.Ы, Насчет 0x480 - прочитал в умной книжке, и сам убедился, что оно определено в файле dlgs.h .


Добавлено @ 03:39
Кстати, насчет GetParent(). В этой же программе в этом же файле на несколько строчек выше в функции OnInitDialog() у меня есть код:
Код

BOOL bRet = CFileDialog::OnInitDialog();
    if (bRet == TRUE) {
        GetParent()->GetDlgItem(IDOK)->SetWindowText("Delete");

Дак вот, он работает совершенно нормально и нормально присваивает кнопке Caption "Delete"!!!
Это меня склоняет думать, что все таки трабл в том, что возможно это из-за того, что моя кнопка ID_DELETE не является родной для стандартного диалога, а поэтому не возвращает нормально указатель на родительское окно. Но как выйти из этой ситуации не знаю... ПОдскажите плз!!!!Меня этот кусок текста уже так достал, и главное что никак разобраться не могу!!! smile

PM MAIL ICQ   Вверх
Coocky
Дата 25.10.2005, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



smile
Ты звпутался окончательно, напиши что тебе конкретно надо сделать, и сделаем, а то со своими НЕНУЖНЫМИ GetParent() достал.
Говори-что тебе надо сделать, только опиши подробно действия..


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 25.10.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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 - проверь спаем.


--------------------
...
PM   Вверх
Dov
Дата 25.10.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: нет
Всего: 88



Цитата(dont @ 22.10.2005, 19:29)
GetParent()->GetDlgItem(0x480)->GetWindowText(m_strFilename);//считываю //строку с edit'a

dont,
здесь, имхо, нужно писать так:
GetParent()->SetDlgItem(0x480)->GetWindowText(m_strFilename);


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Earnest
Дата 25.10.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(Dov @ 25.10.2005, 19:03)
здесь, имхо, нужно писать так:
GetParent()->SetDlgItem(0x480)->GetWindowText(m_strFilename);


Ерунда, попробуй объясни компилятору, что ты имеешь в виду smile
(Нет такой функции CWnd::SetDlgItem(ID), да и какой смысл она может иметь?)



--------------------
...
PM   Вверх
Dov
Дата 25.10.2005, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: нет
Всего: 88



Да, херню сморозил не подумавши, извиняюсь.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
dont
Дата 26.10.2005, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 11.7.2005

Репутация: нет
Всего: нет



Цитата
Да, верно, извини, диалог CFileDialog многослойный, поэтому обращение к его стандартным кнопкам через GetParent() и т.д. - правильное, это я запамятовала.

Что такое "многослойный диалог, сам юзал "GetParent()" т.к. опять таки же прочитал в умной книжке, а про многослойные диалоги там ничего небыло.

Цитата
1) я не совсем поняла, куда ты добавляешь свою кнопку в ресурсах: очень может статься, что ее парентом является таки непосредственно твой класс - попробуй все-таки написать без GetParent().

Я добавляю свою кнопку прямо в редакторе ресурсов на новом только созданом ДиалогБоксе, ее идентификатор IDC_DELETE(вызов многострадючих GetParent()'ov осуществляю при обработке клика на которой) .Потом для этого ресурса диалога создаю класс CSpecialFileDialog(на основе CFileDialog).
Без ГетПарент() пробывал - не помагает.... =(
Цитата
3) если кнопка твоя - почему ты используешь какой-то странный идентификатор из dlgs.h, а не какой-нибудь свой IDC_DELETE?


"Странный идентификатор" я использую для считывания строки из Edit'a(которая есть стандартным елементом класса CFileDialog).

Цитата
3) если кнопка твоя - почему ты используешь какой-то странный идентификатор из dlgs.h, а не какой-нибудь свой IDC_DELETE?

- Никогда с ним не работал, но все же решился: смотрел-смотрел, там столько разнообразных окон,процессов и т.д., что мне трудно было определиться где какое окно, не то что кто есть чьим предком... smile Да и там какие то обозначения окон,класов недружелюбные(по крайней мере для меня smile )
Цитата

Если дело в одной-единственной дополнительной кнопке, можно обойтись без всего этого геморроя - если отказаться от кнопки HELP и заменить на ней текст. Я имею в виду, что можно не создавать свой ресурс и не страдать, где свои кнопки, а где стандартные.

Нет, мне нужно именно так сделать, так что без гемороя не обойтись...


Цитата
Ты звпутался окончательно, напиши что тебе конкретно надо сделать, и сделаем, а то со своими НЕНУЖНЫМИ GetParent() достал.
Говори-что тебе надо сделать, только опиши подробно действия..

Спасибо конечно, но я все таки желаю разобраться, не люблю когда за меня что то кто-то делает. А сделать мне всего то нужно: считать в обработчике
CSpecialFileDialog::OnBnClickedDelete() строку из Edit'a(который являеться стандартным елементом CFileDialog), в котором указываеться имя выбраного файла и отправить родительскому окну класса CView командное сообщение IDCANCEL .


PM MAIL ICQ   Вверх
Coocky
Дата 26.10.2005, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Итак вступление к твоей ошибке...
Вчера дядя Coocky пытался достучатся от родительского окна , к дочернему, которое находится в представлении, еще и в закладке. Так вот, время поджимало. и я под конец рабочего дня рещил за 5 минут достучаться до него через... GetWindow()smile Все нормально, мне возвратило указатель. Только вот указатель только то и мог, что отображать все доступные функции и переменные. Когда я пытался вызвать дочерню функцию, которая имел GetDlgItem(), то угадайте с 3 раз где я вылетал? smile Правильно, на НЕТ ТАКОГО ОКНА ASSERT(::IsWindow(m_hWnd));
Потому что поленился правильно получить указатель. Т.е получить представление, затем закладку, а уж затем , окно диалога связяное с закладкой.Теперь курю, смотрю хоккей.
Так Вот, к чему я -у тебя указатель неправильный. Посмотри , чему равно m_hWnd полученого указателя, через отладчик? Даю рубь за сто, оно равно m_hWnd=??? smile
Теперь к нашим баранам...
Цитата
CSpecialFileDialog::OnBnClickedDelete() строку из Edit'a(который являеться стандартным елементом CFileDialog), в котором указываеться имя выбраного файла и отправить родительскому окну класса CView командное сообщение IDCANCEL .


У тебя
CSpecialFileDialog -это окно ДОЧЕРНЕЕ ( имено ДОЧЕРНЕЕ), те е порождается окном CFileDialog (не путай с наследуется!)?????, так как же тогда ты делаешь GetParent() без приведения к типу указателя smile
Это только первый вопрос!


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 26.10.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата(dont @ 22.10.2005, 23:02)
Тобишь проблема врядли в этом, строчкой GetDlgItem(0x480) прога просто должна считывать значения с edit'a

Вопрос 2
Где CEdit* edit=(CEdit*)GetDlgItem(0x480) ;
edit-> GetWindowText(); smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0683 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.