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

 
Treeview и DATA
desivers
Отправлено: 13.03.2007, 17:35


Дежурный стрелочник

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



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

CODE

typedef struct MyRec
{
 int id;
} TMyRec;
typedef TMyRec* PMyRec;

void __fastcall TForm1::Button2Click(TObject *Sender)
{
for (int i = 0; i <= 100000; i++)
{
PMyRec  MyRecPtr;
MyRecPtr = new TMyRec;
TTreeNode* NODA;
MyRecPtr->id = i++;
NODA = TreeView1->Items->AddObject(NULL, "NODA", MyRecPtr);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
Label1->Caption = PMyRec(TreeView1->Selected->Data)->id;
}
Admin
Отправлено: 13.03.2007, 20:20


Владимир

Группа: Администратор
Сообщений: 1190



по TreeView1->Items->AddObject() вы добавляете указатель
на объект, доступ к которому(указателю) можно получить по
TreeView1->...->Data.

А уж что вы по AddObject() в этот указатель поместите и как будете
с ним распоряжаться — целиком ваша забота.
TreeView об этом ничего не известно.
Вы просто как бы записали в его свойство Data некий
указатель на что-то(некое число) — и всё.
И когда нужно — можете этот указатель прочитать (через ->Data)
и что-то с ним сделать.

Другими словами — это как бы некая переменная типа void*
в которую можно записать значение/прочитать значение.

Нужно освободить память — получайте указатель и очищайте
самостоятельно память. Что-то типа

PMyRec MyClearRecPtr = TreeView1->Selected->Data;
delete MyClearRecPtr;
Admin
Отправлено: 13.03.2007, 20:47


Владимир

Группа: Администратор
Сообщений: 1190



Как пример:

// есть в базе данных некая таблица FTree с уникальным номером
ошибки FTreeErrNo и текстом ошибки FTreeErrMsg.
// выводим эту таблицу в дерево, формируем дерево с текстом ошибок,
// запоминаем при этом в этом свойстве уникальный номер записи в
// таблице.
[CODE]
TTreeNode* TreeNode;
TreeNode = TreeView1->Items->AddChildObject(Node ,
FTreeErrMsg->AsString, (void*)FTreeErrNo->AsInteger);

// далее — как-то меняем дерево ошибок, например изменяем
текст сообщения об ошибке
....

// теперь нам надо измененный текст записать обратно в таблицу -
// вот тут то мы и знаем — какой узел/лист дерева в какой записи
// таблицы относиться — этот номер и лежит в свойстве Data
TTreeNode* TreeNode = TreeView1->Selected;
int ID = (int)TreeNode ->Data; // получаем этот номер
// находим её в таблице и заносим значение.

это как пример использования.

Также можно туда запихнуть указатель на что либо, а потом
когда надо — извлечь его, привести к нужному типу
и что надо с ним(или на что он указывает) сделать.
desivers
Отправлено: 13.03.2007, 21:16


Дежурный стрелочник

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



класно, спасибо, щас буду практиковатся

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