Форум — Ответы     (  К темам )
 ?  Vadim Ch.: Об объекте TTreeView (06-04-2003 12:05:35) http://v-ch.h1.ru
Имеется объект TTreeView. В нем элементы выводятся
с картинками с использованием StateImages.
И осуществлена поддержка Drag&Drop для перетаскивания
узлов по дереву, так же, как в примере от BCB:

//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1DragDrop(TObject *Sender,
TObject *Source, int X, int Y)
{
TTreeView *pSender = dynamic_cast<TTreeView*>(Sender); // получим указатель на объект, пославший узел
TTreeView *pSource = dynamic_cast<TTreeView*>(Source); // получим указатель на объект, принявший узел
if(pSender && pSource) // если источник и приемник существуют, то
{
TTreeNode *pNodeSender = pSender->GetNodeAt(X, Y); // получить узел-приемник по координатам
THitTests ht = pSender->GetHitTestInfoAt(X, Y); // получить состояние положения отпускания перетаскиваемого узла
TNodeAttachMode attach_mode;

if(ht.Contains(htOnItem) || ht.Contains(htOnIcon)) // если на картинке или метке узла, то
attach_mode = naAddChild; // тип перемещения — добавление потомка
else if(ht.Contains(htNowhere)) // иначе, если ниже всех узлов, то
attach_mode = naAdd; // тип перемещения — добавить узел в корень
else if(ht.Contains(htOnIndent)) // иначе, если на выступе, соответствующему узлу, то
attach_mode = naInsert; // тип перемещения — вставка
else // иначе,
return; // выход из процедуры
pSender->Selected->MoveTo(pNodeSender, attach_mode); // переместить узел
}
}
//---------------------------------------------------------------------------

Так вот, когда все это компилируется в BCB 4, то никаких проблем.
А когда я все это откомпилировал в BCB 6.0 (никаких ошибок при
компиляции), то при перетаскивании узла (все перетаскивается),
у него и его деток перестают отображаться соответствующие им
картинки, причем свойство StateIndex при этом не меняется.
А если теперь у данного узла поменять его StateIndex, то
картинка меняется соответственно.
Теперь приходится вызывать рекурсивную п./п. , которая
сохраняет текущий StateIndex во временную переменную,
StateIndex приравнивает, например, (-1), а затем,
обратно присваивает StateIndex из временной переменной.

//---------------------------------------------------------------------------
void __fastcall ResetStateNode(TTreeNode *__pNode)
{
if(__pNode)
{
int tmp;
tmp = __pNode->StateIndex;
__pNode->StateIndex = -1;
__pNode->StateIndex = tmp;
TTreeNode *pNode = __pNode->getFirstChild();
while(pNode)
{
ResetStateNode(pNode);
pNode = __pNode->GetNextChild(pNode);
}
}
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// на перемещение узла
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1DragDrop(TObject *Sender,
TObject *Source, int X, int Y)
{
TTreeView *pSender = dynamic_cast<TTreeView*>(Sender); // получим указатель на объект, пославший узел
TTreeView *pSource = dynamic_cast<TTreeView*>(Source); // получим указатель на объект, принявший узел
if(pSender && pSource) // если источник и приемник существуют, то
{
TTreeNode *pNodeSender = pSender->GetNodeAt(X, Y); // получить узел-приемник по координатам
THitTests ht = pSender->GetHitTestInfoAt(X, Y); // получить состояние положения отпускания перетаскиваемого узла
TNodeAttachMode attach_mode;

if(ht.Contains(htOnItem) || ht.Contains(htOnIcon)) // если на картинке или метке узла, то
attach_mode = naAddChild; // тип перемещения — добавление потомка
else if(ht.Contains(htNowhere)) // иначе, если ниже всех узлов, то
attach_mode = naAdd; // тип перемещения — добавить узел в корень
else if(ht.Contains(htOnIndent)) // иначе, если на выступе, соответствующему узлу, то
attach_mode = naInsert; // тип перемещения — вставка
else // иначе,
return; // выход из процедуры
pSender->Selected->MoveTo(pNodeSender, attach_mode); // переместить узел
pSender->Items->BeginUpdate();
ResetStateNode(pSender->Selected);
pSender->Items->EndUpdate();
}
}
//---------------------------------------------------------------------------


Но это же ненормально! В чем может быть причина?
Ответов нет.