Форум — Ответы ( К темам )
? | 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(); } } //--------------------------------------------------------------------------- Но это же ненормально! В чем может быть причина? | |
Ответов нет. | |