Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятно как ведет себя CTreeCtrl 
:(
    Опции темы
Fazil6
Дата 22.12.2007, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Жизнь заставила рисовать GUI с MFC. Столкнулся с такой проблемой. 
Имею класс 
Код

class TestView : public CFormView
{
// bla-bla
};

на этой фигне у меня есть констрол CTreeCtrl . Назначил ему переменную 
Код

CTreeCtrl sys_tree;

заполняю я этот контрол такой функцией
Код


void TestView::SysTreeInit()
{
    SysTreeClear();
    UpdateData(FALSE);

    CString sys_n;
    HTREEITEM root = sys_tree.InsertItem("Системы", NULL,NULL);
    
    for( int i = 1; i <= CONVERTER::Str2Int(xml_test->SystemCount())  ; ++i)
    {
        sys_n.Format("%d", i);
        HTREEITEM r = sys_tree.InsertItem(sys_n.GetBuffer(),root, NULL);
        sys_tree.SetItemData(r, i);
    }
}
//----------------------------------------------------------------------------------
void TestView::SysTreeClear()
{
    VERIFY(sys_tree.DeleteItem(TVI_ROOT));    
}

запускаю и как казалось бы работает правильно, но если вызываю SysTreeInit() еще раз, то получаю пустой контрол, т.е. в этом дереве нет ничего. Пробовал в разных местах этой функции дергать UpdateData(FALSE) , но ничего не меняется... Даже не знаю в каком напрвлении ковырять.
Вообще в рисовании GUI с помощью MFC я откровенно говоря ламер и по большому счету в первый раз в жизни такой работой занимаюсь так что приму любые идеи и советы.
PM MAIL   Вверх
zkv
Дата 23.12.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Fazil6 @  22.12.2007,  02:48 Найти цитируемый пост)
UpdateData(FALSE);

в данном примере вообще не нужна, это из другой оперы (DDX_Control она не касается).

Цитата(Fazil6 @  22.12.2007,  02:48 Найти цитируемый пост)
"Системы"

типа прогрессивное человечество на юникод переходит smile 
тут собирал про это инфу, но ты, наверное, в курсе, так на всякий случай.

Цитата(Fazil6 @  22.12.2007,  02:48 Найти цитируемый пост)
sys_n.GetBuffer(),

можно просто: InsertItem(sys_n, ... );
CString умеет сам к LPCTSTR (const TCHAR *) преобразовываться.

но это все мелочи, работать все равно должно, потому пример прикладываю.

PS
Цитата(Fazil6 @  22.12.2007,  02:48 Найти цитируемый пост)
Жизнь заставила рисовать GUI с MFC.

Удачи! smile

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  testMFCTree.rar 21,31 Kb
PM MAIL   Вверх
Fazil6
Дата 23.12.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(zkv @  23.12.2007,  12:29 Найти цитируемый пост)
но это все мелочи, работать все равно должно, потому пример прикладываю.

посмотрел пример... Честно говоря принципиальных отличий от моего проекта в этом вопросе не заметил. 
Я вобщем так и использую как ты показал (по большому счету ты просто мои функции как есть скопировал). Главная причина моего удивления состоит в том, что это дерево у меня не единственное в интерфейсе. Вобщем история такая : я имею диалог (главное окно программы), на нем тоже есть такой контрол (в него выводится другая инфа, но не в этом суть). С ним я работаю в общем по тому же принципу и там все нормально работает. И есть этот клас наследник CFormView, который используется как фрейм в этом главном диалоге. Короче в классе главного окна работает как надо, а тут глюк какой-то. Я думал, что может для CFormView нужно дополнительно чего-нибудь дергать или вроде того... Дебагером смотрел и в функции SysTreeInit() все нормально, узлы вроде создаются, данные есть, строками узлы инициализируются... Вобщем не знаю чего и думать. У меня, правда, студия 7.1, хотя не представляю какое это может иметь значение.

Добавлено через 6 минут и 42 секунды
причем алгоритм такой : при выделении узла определенного в дереве главного окна у меня на этом фрейме выводится некая инфа. Так вот после запуска первый раз выделив нужный узел все строится правильно и дальше щелкая по контролам в этом фрейме все работает как надо. Но если в главном дереве выделить другой узел контролы на фрейме обновляются кроме дерева, в дереве просто ничего нет и дальше куда ни кликай в главном дереве дерево на фрейме пустое, хоть тресни. Причем в дебагере вижу, что функция заполнения его вызывается, узлы в этой функции удаляются после первого удачного заполнения удаляются, но новые не отображаются
PM MAIL   Вверх
zkv
Дата 23.12.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



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

Добавлено через 1 минуту и 15 секунд
Цитата(Fazil6 @  23.12.2007,  13:47 Найти цитируемый пост)
У меня, правда, студия 7.1, хотя не представляю какое это может иметь значение.

думаю тут никакого.
PM MAIL   Вверх
Fazil6
Дата 23.12.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



вобщем имею такую функцию по нажатию кнопки.
Код

void TestView::OnBnClickedButton1()
{
    SysTreeClear();

    HTREEITEM root = sys_tree.InsertItem(_T("Системы"), NULL,NULL);

    AfxMessageBox(sys_tree.GetItemText(root)) ;
}

void TestView::SysTreeClear()
{
    VERIFY(sys_tree.DeleteItem(TVI_ROOT));
    UpdateData(FALSE);
}

нажав первый раз вижу в контроле рут узел "Системы". МессаджБокс выводит Системы.
нажав второй раз в контроле ничего нет (точнее там вроде в руте есть прбел какой-то) и  МессаджБокс выводит Системы.
Ничего не понимаю...  Сейчас попробую отдельным проектом смоделировать
PM MAIL   Вверх
zkv
Дата 23.12.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Fazil6, а мой проект компилировал? Работает правильно?
Проблема с версией решается просто: нужно открыть файл .vcproj текстовым редактором, найти строку:
 <VisualStudioProject ProjectType="Visual C++" Version="8,00" ...
заменить 8,00 на 7,1 
сохранить, затем открыть в студии.

Цитата(Fazil6 @  23.12.2007,  15:03 Найти цитируемый пост)
UpdateData(FALSE);

это лишнее
PM MAIL   Вверх
Fazil6
Дата 23.12.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(zkv @  23.12.2007,  15:12 Найти цитируемый пост)
это лишнее

вот тут маленький нюанс. Вообще я предполагал, что это лишнее, но если убрать этот вызов, то все еще хуже.
короче попробовал без лишней пыли сделать отдельный проект с данной проблемой. Вышло еще хуже. 

Я создаю консольное приложение с поддержкой MFC и добавляю в него диалог. Нажав OK инициализируется CFormView с деревом. Дальше все совсем интересно - при обращении к переменной связанной с CTreeCtrl получаю маловразумительный Assert Failed

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  qSat2.zip 33,03 Kb
PM MAIL   Вверх
Fazil6
Дата 23.12.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



имеем следующую картину. Вроде с эксепшеном втыркнул причину (хотя кто бы мог подумать...) Вобщем в прикрепленном проекте имею проблему описаную выше.
Если запустить приложение и нажать OK загрузится мой фрейм. Если на нем нажимать Load, то добавляются узла, но если нажать Clear, то все - жопа и новые узлы в дереве не отображаются сколько не тискай Load.



Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  qSat2.zip 18,51 Kb
PM MAIL   Вверх
zkv
Дата 23.12.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Посмотрел проект. 
Цитата(Fazil6 @  23.12.2007,  16:01 Найти цитируемый пост)
вот тут маленький нюанс. Вообще я предполагал, что это лишнее, но если убрать этот вызов, то все еще хуже.

ну если ни так ни так не работает, трудно судить что хуже. 
Ассерт вылетал потому что при обращении к контролам они еще не были созданы. 
Не были созданы, потому что FormView неправильно создавался. 
Стал вспоминать как правильно, и видимо в диалог его вставить не получиться так просто. 
Я считал что можно, потому что держал пару примеров на примете (один из них), но они из другой степи немного.

Теперь по делу. Наверное сразу надо было советовать делать все через диалоги. 
Вообщем пример прилагаю.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  qSat2.rar 13,01 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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