Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / вскользь о CTreeCtrl в VC / 25 сообщений из 59, страница 1 из 3
15.06.2006, 18:30
    #33793989
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
хочу добавлять узлы примерно так:
Код: plaintext
HTREEITEM  usel=m_tree.InsertItem(m_edit, parent);
где usel, parent в настоящее время типа CString. как сделать приведение типов от CString к HTREEITEM ?
...
Рейтинг: 0 / 0
16.06.2006, 08:06
    #33794431
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Дьякхочу добавлять узлы примерно так:
Код: plaintext
HTREEITEM  usel=m_tree.InsertItem(m_edit, parent);
где usel, parent в настоящее время типа CString. как сделать приведение типов от CString к HTREEITEM ?
HTREEITEM - это структура, а CString - это класс, причем не содержащий в себе необходимых данных для сохранения информации о узле, как Вы себе это представляете?
...
Рейтинг: 0 / 0
16.06.2006, 08:15
    #33794438
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
а каких типов должны быть usel и parent?
...
Рейтинг: 0 / 0
16.06.2006, 08:23
    #33794446
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
я исходил из чего:
код типа этого отлично работает:
Код: plaintext
1.
2.
3.
4.
5.
HTREEITEM  a1=m_tree.InsertItem("b");
HTREEITEM  a2=m_tree.InsertItem("b1",a1);
HTREEITEM  a3=m_tree.InsertItem("b2",a1);
HTREEITEM  a4=m_tree.InsertItem("b12",a2);
HTREEITEM  a5=m_tree.InsertItem("b13",a2);
вот я и решил формировать самостоятельно a1, а2 и т.д.
сформировал в виде типа CString, а оно не работает
...
Рейтинг: 0 / 0
16.06.2006, 08:28
    #33794454
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Дьяка каких типов должны быть usel и parent?
HTREEITEM - описатель узла дерева, MSDN рулит
...
Рейтинг: 0 / 0
16.06.2006, 08:29
    #33794456
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Дьякя исходил из чего:
код типа этого отлично работает:
Код: plaintext
1.
2.
3.
4.
5.
HTREEITEM  a1=m_tree.InsertItem("b");
HTREEITEM  a2=m_tree.InsertItem("b1",a1);
HTREEITEM  a3=m_tree.InsertItem("b2",a1);
HTREEITEM  a4=m_tree.InsertItem("b12",a2);
HTREEITEM  a5=m_tree.InsertItem("b13",a2);
вот я и решил формировать самостоятельно a1, а2 и т.д.
сформировал в виде типа CString, а оно не работает
логично
...
Рейтинг: 0 / 0
16.06.2006, 15:00
    #33795873
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
В том примере, который я приводил, аналогично и в этом, делается так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
TVINSERTSTRUCT tvInsert;
HTREEITEM hPA;
HTREEITEM hWA;
tvInsert.hParent = NULL;
tvInsert.hInsertAfter = NULL;
tvInsert.item.mask = TVIF_TEXT;
tvInsert.item.pszText = _T("Задача");

HTREEITEM hCountry = m_tree.InsertItem(&tvInsert);

hPA = m_tree.InsertItem(TVIF_TEXT,_T("Справочники"),  0 ,  0 ,  0 ,  0 ,  0 , hCountry, NULL);
hWA = m_tree.InsertItem(_T("Документы"), 0 ,  0 , hCountry, hPA);

m_tree.InsertItem(_T("Контрагенты"), hPA, TVI_SORT);
m_tree.InsertItem(_T("Номенклатура"), hPA, TVI_SORT);

m_tree.InsertItem(_T("Счет"), hWA, TVI_SORT);
m_tree.InsertItem(_T("Реализация"), hWA, TVI_SORT);
Все это конечно замечательно, но здесь заранее установлено, что из первого узла будет исходить ещё 2, а из каждого из них ещё по 2 узла.

у меня то заранее неизвестно СКОЛЬКО будет узлов и по сколько узлов из них ещё будет исходить. то есть каждый раз мне нужно вместо hPA и hWA формировать свои уникальные значения. напрашивается сделать безразмерный массив. подскажите если знаете как его объявить? (если можно конкретный пример)
...
Рейтинг: 0 / 0
16.06.2006, 15:24
    #33795968
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
не вижу смысла.
Есть конкретные не изменяемые (Root) узлы, формирование которых возложено на программу?
Если да, то достаточно просто иметь их описатели (HTREEITEM) и рулить child-узлами через них.
Если же нет, то придется создавать класс (или не класс) для хранения информации о дереве. Но я бы посоветовал класс-контейнер от CObject, т.к. это удобно и можно записывать на диск через Serialize.
--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
16.06.2006, 15:29
    #33795982
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Да, есть один узел корневой. вложенность то может быть разной.
а как рулить child-узлами через корневой узел?
...
Рейтинг: 0 / 0
16.06.2006, 15:32
    #33796000
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
ДьякДа, есть один узел корневой. вложенность то может быть разной.
а как рулить child-узлами через корневой узел?
здесь все завист от логики программы, например можно посчитать их, найти последний или первый из них, узнать если у них свои child-ы, много всего....
...
Рейтинг: 0 / 0
16.06.2006, 15:33
    #33796005
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
вот возьмем например первый пример.
Код: plaintext
1.
2.
3.
4.
5.
HTREEITEM  a1=m_tree.InsertItem("b");
HTREEITEM  a2=m_tree.InsertItem("b1",a1);
HTREEITEM  a3=m_tree.InsertItem("b2",a1);
HTREEITEM  a4=m_tree.InsertItem("b12",a2);
HTREEITEM  a5=m_tree.InsertItem("b13",a2);
Код: plaintext
HTREEITEM  a1=m_tree.InsertItem("b");
- это корень. мы знаем его HTREEITEM. если мы не знаем a2, a3 и т.д., то как мы добавим "b12", "b13"?
...
Рейтинг: 0 / 0
16.06.2006, 15:41
    #33796038
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Дьяквот возьмем например первый пример.
Код: plaintext
1.
2.
3.
4.
5.
HTREEITEM  a1=m_tree.InsertItem("b");
HTREEITEM  a2=m_tree.InsertItem("b1",a1);
HTREEITEM  a3=m_tree.InsertItem("b2",a1);
HTREEITEM  a4=m_tree.InsertItem("b12",a2);
HTREEITEM  a5=m_tree.InsertItem("b13",a2);
Код: plaintext
HTREEITEM  a1=m_tree.InsertItem("b");
- это корень. мы знаем его HTREEITEM. если мы не знаем a2, a3 и т.д., то как мы добавим "b12", "b13"?
ты же не собираешся добавлять хаотично и куда бог пошлет, у программы должна быть логик, а иначе ты не сможешь управлять деревом. Эти описатели носят временный характер, они нужны, чтобы вставить узел и все, солить их не надо, а дальше управление child-узлами логично переложить на их parent-узел, который будет, в силу логики программы, опять же, их контроллировать.
...
Рейтинг: 0 / 0
16.06.2006, 15:51
    #33796087
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
теперь о логике программы.... логика такая.
есть CComboBox, CEdit, CTreeCtrl.
сделаем так:
b
|_ b1
|_b12

в TreeCtrl на первоначальном этапе есть только корневой узел ("b"). (в комбобокс этот "b" тоже есть) в комбобокс будем выбирать узел ИЗ которого исходит добавляемый.
вобщем вводим в эдит какую-то запись (b1). выбираем пока единственный возможный выриант в комбо:"b". жмем кнопку ДОБАВИТЬ, и строка из эдита ("b1") добавляется в комбо и в дерево (из корневого узла "b").
Далее нам надо добавить узел, исходящий уже из b1.
вводим "b12", выбираем в комбо "b1", жмем ДОБАВИТЬ и b12 встает на нужное место и добавляется в комбо..... вот и вся логика.
что бы добавить b12, надо знать это самое а2:
Код: plaintext
HTREEITEM  a2=m_tree.InsertItem("b1",a1);
как это сделать зная только корень?
...
Рейтинг: 0 / 0
16.06.2006, 15:53
    #33796097
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
некрасиво сместился рисунок...
нарисую так: b - b1 - b12 (b12 исходит не из b, а из b1)
...
Рейтинг: 0 / 0
16.06.2006, 15:59
    #33796119
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Дьяктеперь о логике программы.... логика такая.
есть CComboBox, CEdit, CTreeCtrl.
сделаем так:
b
|_ b1
|_b12

в TreeCtrl на первоначальном этапе есть только корневой узел ("b"). (в комбобокс этот "b" тоже есть) в комбобокс будем выбирать узел ИЗ которого исходит добавляемый.
вобщем вводим в эдит какую-то запись (b1). выбираем пока единственный возможный выриант в комбо:"b". жмем кнопку ДОБАВИТЬ, и строка из эдита ("b1") добавляется в комбо и в дерево (из корневого узла "b").
Далее нам надо добавить узел, исходящий уже из b1.
вводим "b12", выбираем в комбо "b1", жмем ДОБАВИТЬ и b12 встает на нужное место и добавляется в комбо..... вот и вся логика.
что бы добавить b12, надо знать это самое а2:
Код: plaintext
HTREEITEM  a2=m_tree.InsertItem("b1",a1);
как это сделать зная только корень?
не корень, а родительский root, а их перечень у тебя в CComboBox'e (если я правильно понял), судя по тому что они все содержат child-item'ы, можно простым перебором пройти все узлы у которых есть child'ы и имена (+ последовательность, как вариант, если нет сортировки) совпадают с item'ом из CComboBox'а - это достаточное условие что бы считать item дерева - root item'ом его child'ов. Так же можно придумать и вносить в ItemData для каждого из узлов и не-узлов спец. коды которые будут определять их принадлежность к тому или иному виду или используюя картинки, как вариант.
...
Рейтинг: 0 / 0
16.06.2006, 16:17
    #33796198
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
вначале мы указываем а1 явно:
Код: plaintext
HTREEITEM  a1=m_tree.InsertItem("b");
.
а как в остальных случаях быть? например когда вводим b1, в ComboBox добавляем это b1, строку из эдита тоже без проблемм переносим в дерево, но как нам а2 то получить??? как я напишу подобную строку, где вместо usel подставлю a2 ???
Код: plaintext
HTREEITEM  usel=m_tree.InsertItem("b1",a1);
как указать это
Код: plaintext
HTREEITEM  a2
??? я могу получить "а2", а указать что оно является HTREEITEM не мсогу потому что не знаю как... вот и подошли к первоначальному вопросу :-)
...
Рейтинг: 0 / 0
16.06.2006, 16:29
    #33796259
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Cerebrumне корень, а родительский root, а их перечень у тебя в CComboBox'e (если я правильно понял), судя по тому что они все содержат child-item'ы, можно простым перебором пройти все узлы у которых есть child'ы и имена (+ последовательность, как вариант, если нет сортировки) совпадают с item'ом из CComboBox'а - это достаточное условие что бы считать item дерева - root item'ом его child'ов. Так же можно придумать и вносить в ItemData для каждого из узлов и не-узлов спец. коды которые будут определять их принадлежность к тому или иному виду или используюя картинки, как вариант это всё так и есть, но эти уникальные значения то всё равно нужны! (я про а2, а2 и т.д.) может хранить в комбо 2 столбца?.....
...
Рейтинг: 0 / 0
16.06.2006, 16:33
    #33796274
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Дьяк Cerebrumне корень, а родительский root, а их перечень у тебя в CComboBox'e (если я правильно понял), судя по тому что они все содержат child-item'ы, можно простым перебором пройти все узлы у которых есть child'ы и имена (+ последовательность, как вариант, если нет сортировки) совпадают с item'ом из CComboBox'а - это достаточное условие что бы считать item дерева - root item'ом его child'ов. Так же можно придумать и вносить в ItemData для каждого из узлов и не-узлов спец. коды которые будут определять их принадлежность к тому или иному виду или используюя картинки, как вариант это всё так и есть, но эти уникальные значения то всё равно нужны! (я про а2, а2 и т.д.) может хранить в комбо 2 столбца?.....
не вижу смысла, лишняя нагрузка на графику, уж лучше класс-контейнер описателей
...
Рейтинг: 0 / 0
16.06.2006, 16:38
    #33796300
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
то есть создать контейнер, в который бросать эти уникальные значения? а как ещё это можно сделать? (в смысле без контейнера)
...
Рейтинг: 0 / 0
16.06.2006, 16:41
    #33796311
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
кстати сказать, а как создать контейнер со значениями типа HTREEITEM ?
...
Рейтинг: 0 / 0
16.06.2006, 16:54
    #33796369
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Дьяккстати сказать, а как создать контейнер со значениями типа HTREEITEM ?
класс-контейнер производить лучше от СObject, например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
clas CMyTreeItemHolder :: public CObject
{
	DECLARE_SERIAL(CMyTreeItemHolder)
public://-------------------------------------структура данных CMyTreeItemHolder
        HTREEITEM ht;
        int             nIndex; - номер записи в комбобоксе связаной с этим описателем
  /*и т.д. все что тебе нужно, не забудь про конструкторы копирования и 
   лучше переопределить такие операторы как new и delete*/
};

//--------псевдо класс-шаблон указателей на класс CMyTreeItemHolder
typedef CTypedPtrList<CObList, CMyTreeItemHolder*> CMyItems;
Все, а дальше используя СMyItems можно добавлять и уничтожать, подсчитывать, сохранять на диск и восстанавливать с диска использую сериализацию и прочая с элементарными объектами CMyTreeItemHolder, которые входят все в массив CMyItems
...
Рейтинг: 0 / 0
16.06.2006, 17:02
    #33796398
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
ааааа, а точно эта проблемма проще не решается?
...
Рейтинг: 0 / 0
16.06.2006, 17:08
    #33796423
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
в смысле только через контейнер?
...
Рейтинг: 0 / 0
16.06.2006, 17:08
    #33796424
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
Дьякааааа, а точно эта проблемма проще не решается?
я не настаиваю, но столько преимуществ в обмен на немного кода, имхо, нет
...
Рейтинг: 0 / 0
16.06.2006, 17:09
    #33796426
Дьяк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вскользь о CTreeCtrl в VC
а я вот тут хитрую вещь видел:
Код: plaintext
HTREEITEM AddString ( LPCTSTR lpszString);
Что вы об этом думаете? это не то что мне нужно?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / вскользь о CTreeCtrl в VC / 25 сообщений из 59, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]