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
|
класно, спасибо, щас буду практиковатся |
|