Дерево и подгружаемый список
От: Antonreka  
Дата: 23.09.11 11:17
Оценка:
Никогда не занимался интерфейсами, и вот понадобилось создать вполне стандартный интерфейс:
слева группы на основе CTreeCtrl, справа список на основе CListCtrl. При выборе группы в дереве, слева загружается соответствующий список.
Подскажите, как это лучше всего реализовать? Как хранить все данные? Т.е. выбираем элемент в дереве и справа заполняется список. Как всё это хранить?
Пните в нужном направлении, куда копать? Если есть то ссылку на CodeProject/CodeGuru. Спасибо.
Re: Дерево и подгружаемый список
От: Carc Россия http://www.amlpages.com/home.php
Дата: 23.09.11 12:58
Оценка:
Здравствуйте, Antonreka, Вы писали:

A>Никогда не занимался интерфейсами, и вот понадобилось создать вполне стандартный интерфейс:

A>слева группы на основе CTreeCtrl, справа список на основе CListCtrl. При выборе группы в дереве, слева загружается соответствующий список.
A>Подскажите, как это лучше всего реализовать? Как хранить все данные? Т.е. выбираем элемент в дереве и справа заполняется список. Как всё это хранить?
A>Пните в нужном направлении, куда копать? Если есть то ссылку на CodeProject/CodeGuru. Спасибо.
1) При выборе в узла дерево посылает сигнал правому списку.
2) При получении сигнала список справа обновляет свои данные.
То бишь все построено на извещение+реакция — каждый контрол сам отвечает за свои данные и манипулирование ими.

Если в понимании MFC Document-View
то как-то так
1) На выборе узла дерево записывает какой узел выбран в CDocument.
2) Дергает извещение
UpdateAllViews(this, HINT_UPDATE_TREEITEM_SELECTED);


3) Правый список получает извещение и обновляет данные

CMyListView::OnUpdate(CView* p, DWORD dwHint, CObject* p)
{
switch(dwHint) {
case HINT_UPDATE_TREEITEM_SELECTED:
//угу - узел изменился
//берем какие-то данные из CDocument
//обновляем данные в CMyListView
break;
}
}


Ну как-то примерно так. Хотя MFC Documents-View архитектура сама по себе для этого не нужна. Можно с нуля и на обычном диалоге изваять.
Aml Pages Home
Re[2]: Дерево и подгружаемый список
От: Antonreka  
Дата: 23.09.11 13:19
Оценка:
Здравствуйте, Carc, Вы писали:

C>Если в понимании MFC Document-View

C>то как-то так
C>1) На выборе узла дерево записывает какой узел выбран в CDocument.
C>2) Дергает извещение
C>
C>UpdateAllViews(this, HINT_UPDATE_TREEITEM_SELECTED);
C>

C>3) Правый список получает извещение и обновляет данные

Это всё понятно. Я спрашивал о другом. Как _хранить_ все данные? Выбрали в дереве другой item, и загрузили список для него? Как хранить все эти списки?
Re[3]: Дерево и подгружаемый список
От: Carc Россия http://www.amlpages.com/home.php
Дата: 23.09.11 13:29
Оценка:
A>Это всё понятно. Я спрашивал о другом. Как _хранить_ все данные? Выбрали в дереве другой item, и загрузили список для него? Как хранить все эти списки?
Ну это уже полностью сфера бизнес-логики... Мало ли что там и где и какие данные вдруг у нас порою... Может там дерево из БД достается, а может это файловая система, а может еще что...

В общем случае должен быть только объект-посредник, который отвечает за хранение какой именно узел выбран в дерева. В той же MFC Document-View это вполне может быть CDocument, а вообще это не суть важно что именно — главное чтобы оба CView (или попросту те же контролы CTreeCtrl и CListCtrl) имели к этому посреднику доступ. Именно он по сути и является в данном случае "моделью" (Model), на изменения которой реагируют "виды" (View — то бишь эти наши самые контролы).
Aml Pages Home
Re[4]: Дерево и подгружаемый список
От: Antonreka  
Дата: 23.09.11 13:41
Оценка:
Здравствуйте, Carc, Вы писали:

C>Ну это уже полностью сфера бизнес-логики... Мало ли что там и где и какие данные вдруг у нас порою... Может там дерево из БД достается, а может это файловая система, а может еще что...


Если необходимо считать из файла все данные, то в каком виде их хранить в памяти? Ну с деревом понятно — считали и заполнили контрол CTreeList, а списки для каждого его элементы как лучше всего хранить?
Re[5]: Дерево и подгружаемый список
От: Carc Россия http://www.amlpages.com/home.php
Дата: 23.09.11 14:13
Оценка:
Здравствуйте, Antonreka, Вы писали:

A>Здравствуйте, Carc, Вы писали:


C>>Ну это уже полностью сфера бизнес-логики... Мало ли что там и где и какие данные вдруг у нас порою... Может там дерево из БД достается, а может это файловая система, а может еще что...


A>Если необходимо считать из файла все данные, то в каком виде их хранить в памяти? Ну с деревом понятно — считали и заполнили контрол CTreeList, а списки для каждого его элементы как лучше всего хранить?

"лучше" для чего именно?
Вот в телефонной книжке "лучшее" хранить по алфавиту, а для бабы Мани завхозной лучше когда "список на бумаге". Все зависит от задачи.
Aml Pages Home
Re[6]: Дерево и подгружаемый список
От: Antonreka  
Дата: 28.09.11 10:27
Оценка:
Здравствуйте, Carc, Вы писали:

C>"лучше" для чего именно?


Главный вопрос темы — как item'у назначить родителя? При выборе из списка слева, должны заполниться item'ы в правом списке, соответственно, для каждого item'а должен быть указан родитель. Неужели это непонятно?
Re[7]: Дерево и подгружаемый список
От: Carc Россия http://www.amlpages.com/home.php
Дата: 28.09.11 10:41
Оценка:
Здравствуйте, Antonreka, Вы писали:

A>Здравствуйте, Carc, Вы писали:


C>>"лучше" для чего именно?


A>Главный вопрос темы — как item'у назначить родителя? При выборе из списка слева, должны заполниться item'ы в правом списке, соответственно, для каждого item'а должен быть указан родитель. Неужели это непонятно?

Нет, непонятно. Какому айтему? Какой родитель? В списках у айтемов не бывает родителей...
Aml Pages Home
Re[8]: Дерево и подгружаемый список
От: Timonn24 Россия  
Дата: 15.10.11 18:48
Оценка:
Для каждого item-а в CTreeCtrl можно задать user-specific data. BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData). Может это имеется ввиду?

Здравствуйте, Carc, Вы писали:

C>Здравствуйте, Antonreka, Вы писали:


A>>Здравствуйте, Carc, Вы писали:


C>>>"лучше" для чего именно?


A>>Главный вопрос темы — как item'у назначить родителя? При выборе из списка слева, должны заполниться item'ы в правом списке, соответственно, для каждого item'а должен быть указан родитель. Неужели это непонятно?

C>Нет, непонятно. Какому айтему? Какой родитель? В списках у айтемов не бывает родителей...
Re[9]: Дерево и подгружаемый список
От: Antonreka  
Дата: 21.10.11 15:57
Оценка:
Здравствуйте, Timonn24, Вы писали:

T>Для каждого item-а в CTreeCtrl можно задать user-specific data. BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData). Может это имеется ввиду?


Да, это то что нужно. Вопрос: как получить у списка категорий (CTreeCtrl или CListBox) некий уникальный номер (вроде дескриптора) чтобы привязать элементы к своему родителю? То есть через SetItemData я привяжу категорию (родителя). Как получить у элемента некий уникальный дескрпитор?
Re[10]: Дерево и подгружаемый список
От: Hawk Россия  
Дата: 21.10.11 16:51
Оценка:
Здравствуйте, Antonreka, Вы писали:

A>Как получить у элемента некий уникальный дескрпитор?


Используй указатели:

CList<Data> lstData;
...
SetItemData (hItem, (DWORD)&lstData);

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

Когда пользователь выбирает элемент дерева, в обработчике этого события из item data берется указатель на список объектов, с помощью которого будет заполняться list view, связанный с деревом.

Еще лучше — использовать указатели на т.н. "активные" объекты, которые сами умеют отображать данные. Тогда при получении указателей из эл-тов дерева не нужно будет думать, куда передавать их (указатели) дальше. Достаточно будет вызвать метод навроде Display():

Псевдокод:
OnSelectItem(HTREEITEM hItem)
{
    DWORD dwData = tree.GetItemData(hItem);
    Displayer* pDisplayer = (Displayer*)dwData;
    pDisplayer->Display();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.