2007年04月13日 05:18
[BCB]實現Treeview拖曳效果
這是在Delphi K.Top討論區回覆關於TreeView元件實現拖曳效果的方法。
//--------------------------------------------------------------------
void __fastcall TEMForm::RzTreeView1DragDrop(TObject *Sender,TObject *Source, int X, int Y)
{
if(Source==NULL)
return;
TTreeNode *Sourcenode = RzTreeView1->Selected;
TTreeNode *Targetnode = RzTreeView1->DropTarget;
TTreeNode *node;
if(Targetnode == NULL)
return;
//搬移
TNodeAttachMode AttachMode;
if(Source == RzTreeView1)
{
if(Targetnode->Level > 0)
{
switch(Sourcenode->Level)
{
case 0: //不處理根結點
break;
case 1: //群組搬移
if(Sourcenode->AbsoluteIndex < Targetnode->AbsoluteIndex) //下移
{
//是否有下一個群組
if(Targetnode != Targetnode->GetNext() && Targetnode->GetNext()!=NULL)
{
Targetnode = Targetnode->GetNext();
bool flag = false; //while迴圈結束旗標
if(Targetnode->Level==2)
{
flag = true;
}
while(flag) //找下一個群組
{
//是否有下一個群組
if(Targetnode != Targetnode->GetNext() && Targetnode->GetNext()!=NULL)
{
Targetnode = Targetnode->GetNext();
if(Targetnode->Level==1)
{
flag = false;
}
}
else
{
flag = false;
}
}
if(Targetnode->GetNext()!=NULL) //是否有下一個群組
{
AttachMode = naInsert;
}
else
{
AttachMode = naAdd;
}
}
else
{
AttachMode = naAdd;
}
}
else //上移
{
if(Targetnode != Targetnode->GetPrev()) //是否有上一個群組
{
AttachMode = naInsert;
}
else
{
AttachMode = naAddFirst;
}
}
if(Targetnode->Level==2)
{
Targetnode = Targetnode->Parent;
}
Sourcenode->MoveTo(Targetnode, AttachMode); //搬移
Sourcenode->Expand(true); //展開
break;
case 2: //裝置搬移
if(Targetnode->Level== 1) //搬移至群組移動到最後
{
node = RzTreeView1->Items->AddChild(Targetnode,Sourcenode->Text);
Targetnode->Expand(true);
RzTreeView1->Items->Delete(Sourcenode);
}
if(Targetnode->Level== 2)
{
if(Sourcenode->AbsoluteIndex < Targetnode->AbsoluteIndex) //下移
{
if(Targetnode->GetNext()!=NULL && Targetnode->GetNext()->Level==2)
{
Targetnode = Targetnode->GetNext();
AttachMode = naInsert;
}
else
{
AttachMode = naAdd;
}
}
else //上移
{
AttachMode = naInsert;
}
Sourcenode->MoveTo(Targetnode, AttachMode); //搬移
}
break;
default:
break;
}
}
}
}
//--------------------------------------------------------------------
大致上可以這樣,再依據需求去設計。
引用URL
http://cgi.blog.roodo.com/trackback/4451829






