Никогда не занимался интерфейсами, и вот понадобилось создать вполне стандартный интерфейс:
слева группы на основе CTreeCtrl, справа список на основе CListCtrl. При выборе группы в дереве, слева загружается соответствующий список.
Подскажите, как это лучше всего реализовать? Как хранить все данные? Т.е. выбираем элемент в дереве и справа заполняется список. Как всё это хранить?
Пните в нужном направлении, куда копать? Если есть то ссылку на CodeProject/CodeGuru. Спасибо.
Здравствуйте, Antonreka, Вы писали:
A>Никогда не занимался интерфейсами, и вот понадобилось создать вполне стандартный интерфейс: A>слева группы на основе CTreeCtrl, справа список на основе CListCtrl. При выборе группы в дереве, слева загружается соответствующий список. A>Подскажите, как это лучше всего реализовать? Как хранить все данные? Т.е. выбираем элемент в дереве и справа заполняется список. Как всё это хранить? A>Пните в нужном направлении, куда копать? Если есть то ссылку на CodeProject/CodeGuru. Спасибо.
1) При выборе в узла дерево посылает сигнал правому списку.
2) При получении сигнала список справа обновляет свои данные.
То бишь все построено на извещение+реакция — каждый контрол сам отвечает за свои данные и манипулирование ими.
Если в понимании MFC Document-View
то как-то так
1) На выборе узла дерево записывает какой узел выбран в CDocument.
2) Дергает извещение
Здравствуйте, Carc, Вы писали:
C>Если в понимании MFC Document-View C>то как-то так C>1) На выборе узла дерево записывает какой узел выбран в CDocument. C>2) Дергает извещение C>
C>3) Правый список получает извещение и обновляет данные
Это всё понятно. Я спрашивал о другом. Как _хранить_ все данные? Выбрали в дереве другой item, и загрузили список для него? Как хранить все эти списки?
A>Это всё понятно. Я спрашивал о другом. Как _хранить_ все данные? Выбрали в дереве другой item, и загрузили список для него? Как хранить все эти списки?
Ну это уже полностью сфера бизнес-логики... Мало ли что там и где и какие данные вдруг у нас порою... Может там дерево из БД достается, а может это файловая система, а может еще что...
В общем случае должен быть только объект-посредник, который отвечает за хранение какой именно узел выбран в дерева. В той же MFC Document-View это вполне может быть CDocument, а вообще это не суть важно что именно — главное чтобы оба CView (или попросту те же контролы CTreeCtrl и CListCtrl) имели к этому посреднику доступ. Именно он по сути и является в данном случае "моделью" (Model), на изменения которой реагируют "виды" (View — то бишь эти наши самые контролы).
Здравствуйте, Carc, Вы писали:
C>Ну это уже полностью сфера бизнес-логики... Мало ли что там и где и какие данные вдруг у нас порою... Может там дерево из БД достается, а может это файловая система, а может еще что...
Если необходимо считать из файла все данные, то в каком виде их хранить в памяти? Ну с деревом понятно — считали и заполнили контрол CTreeList, а списки для каждого его элементы как лучше всего хранить?
Здравствуйте, Antonreka, Вы писали:
A>Здравствуйте, Carc, Вы писали:
C>>Ну это уже полностью сфера бизнес-логики... Мало ли что там и где и какие данные вдруг у нас порою... Может там дерево из БД достается, а может это файловая система, а может еще что...
A>Если необходимо считать из файла все данные, то в каком виде их хранить в памяти? Ну с деревом понятно — считали и заполнили контрол CTreeList, а списки для каждого его элементы как лучше всего хранить?
"лучше" для чего именно?
Вот в телефонной книжке "лучшее" хранить по алфавиту, а для бабы Мани завхозной лучше когда "список на бумаге". Все зависит от задачи.
Здравствуйте, Carc, Вы писали:
C>"лучше" для чего именно?
Главный вопрос темы — как item'у назначить родителя? При выборе из списка слева, должны заполниться item'ы в правом списке, соответственно, для каждого item'а должен быть указан родитель. Неужели это непонятно?
Здравствуйте, Antonreka, Вы писали:
A>Здравствуйте, Carc, Вы писали:
C>>"лучше" для чего именно?
A>Главный вопрос темы — как item'у назначить родителя? При выборе из списка слева, должны заполниться item'ы в правом списке, соответственно, для каждого item'а должен быть указан родитель. Неужели это непонятно?
Нет, непонятно. Какому айтему? Какой родитель? В списках у айтемов не бывает родителей...
Для каждого item-а в CTreeCtrl можно задать user-specific data. BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData). Может это имеется ввиду?
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, Antonreka, Вы писали:
A>>Здравствуйте, Carc, Вы писали:
C>>>"лучше" для чего именно?
A>>Главный вопрос темы — как item'у назначить родителя? При выборе из списка слева, должны заполниться item'ы в правом списке, соответственно, для каждого item'а должен быть указан родитель. Неужели это непонятно? C>Нет, непонятно. Какому айтему? Какой родитель? В списках у айтемов не бывает родителей...
Здравствуйте, Timonn24, Вы писали:
T>Для каждого item-а в CTreeCtrl можно задать user-specific data. BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData). Может это имеется ввиду?
Да, это то что нужно. Вопрос: как получить у списка категорий (CTreeCtrl или CListBox) некий уникальный номер (вроде дескриптора) чтобы привязать элементы к своему родителю? То есть через SetItemData я привяжу категорию (родителя). Как получить у элемента некий уникальный дескрпитор?
Разумеется, надо следить, чтобы время жизни указателей совпадало со временем жизни элементов дерева.
Когда пользователь выбирает элемент дерева, в обработчике этого события из item data берется указатель на список объектов, с помощью которого будет заполняться list view, связанный с деревом.
Еще лучше — использовать указатели на т.н. "активные" объекты, которые сами умеют отображать данные. Тогда при получении указателей из эл-тов дерева не нужно будет думать, куда передавать их (указатели) дальше. Достаточно будет вызвать метод навроде Display():