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;
      }
    }
    }
}
//--------------------------------------------------------------------

大致上可以這樣,再依據需求去設計。

  • harpist 發表於樂多引用(0)程式設計編輯本文
    樂多分類:網路/3C │昨日人次:0 │累計人次:353
    Ads by Roodo! 

    引用URL

    http://cgi.blog.roodo.com/trackback/4451829