C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Объекты в TreeView, Получить объект выбранного узла
sprinter
Отправлено: 10.07.2003, 09:26


Ученик-кочегар

Группа: Участник
Сообщений: 14



Дамы++Господа,
Поделитесь опытом покорения TreeView.

Постановка задачи
- Получить объект который связан с выбранным узлом. Объект является структурой с int, double и строковой переменными:
typedef struct gor{
int idreg;
double a;
AnsiString Name;
} var_gor;
typedef var_gor* var_g;
var_gor *vv=new var_gor;
Последняя идет в значения узлов второго уровня, которые, собственно, и представляют интерес. Узлы добавляются из таблицы примерно так
vv->a=Table2->FieldByName("Amp")->AsFloat;
vv->idreg=Table2->FieldByName("IdReg")->AsFloat;
...
TV1->Items->AddChildObjectFirst(TV1->Items->
Item[Table2->FieldByName("IdReg")->AsInteger],
Table2->FieldByName("Name")->AsString,vv);
Предпосылки
- Судя по Хелпу и другим источникам с помощью строк типа
int idr=var_g(TV1->Selected->Data)->idreg;
AnsiString n=var_g(TV1->Selected->Data)->Name;
можно получить элементы структуры, связанной с выбранным узлом.
Результаты
- Как ни крути и какой элемент ни выбирай получаешь элементы
структуры от первого узла!!!
Как и/или Что имеет TreeView особенного? Напишите кто встречался с ентим.
Если есть рабочие примеры — буду премного благодарен.
Asher
Отправлено: 10.07.2003, 10:44


Мастер участка

Группа: Модератор
Сообщений: 550



В узел записываются не данные, а указатель на объект, он у тебя всего один, соответственно что в нем последнее в полях записанно, то он и возвращает.
Тебе надо свой vv=new var_gor; перед каждым
vv->a=Table2->FieldByName("Amp")->AsFloat;
vv->idreg=Table2->FieldByName("IdReg")->AsFloat;
...
TV1->Items->AddChildObjectFirst(TV1->Items->
Item[Table2->FieldByName("IdReg")->AsInteger],
Table2->FieldByName("Name")->AsString,vv);

только потом не забыть их всех delete biggrin.gif
sprinter
  Отправлено: 10.07.2003, 13:56


Ученик-кочегар

Группа: Участник
Сообщений: 14



Да, очень на то похоже.
Но если в узле расположен не объект, а указатель на него, то не понятно, в чем выгода подхода по сравнению с организацией параллельного списку TreeView массива объектов? Ссылаться-то надо все равно по "глобальному" индексу (AbsoluteIndex) — когда есть Child индексы пунктов имеют сквозную нумерацию. И с delete меньше проблем...

Благодарю за внимание
Asher
Отправлено: 10.07.2003, 14:59


Мастер участка

Группа: Модератор
Сообщений: 550



Если есть глобальный список объектов — то засовывай в дерево указатель на этот элемент списка.
С delete в общем никакой разницы вроде не видно cool.gif
а все преимущество сводится к — в Selected + по индексу не искать, сразу указатель на требуемого (ссылаться по глобальному индексу только один раз, в момент генерации дерева)

Вернуться в Вопросы программирования в C++Builder