全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2684
推到 Plurk!
推到 Facebook!

請問treeview如何拖曳

答題得分者是:harpist
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-12 08:20:36 IP:61.220.xxx.xxx 訂閱
請問前輩們..TreeView如何在任一節點拖曳到任一節點?
如果被拖曳的節點後還有子節點.是否一起拖曳過去?還是只拖曳選到的節點.剩下節點就向上補?

站上大多都是Delphi的範例.不是很了解.也有一個BCB的範例.但照上面寫compile時會錯..
請前輩指點
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-12 12:47:06 IP:211.21.xxx.xxx 未訂閱
<textarea class="cpp" rows="10" cols="60" name="code"> //--------------------------------------------------------------------------- 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; } } } } //--------------------------------------------------------------------------- </textarea>

大致上可以這樣,再依據你的需求去設計
------
~§~迷時師渡,悟了自渡~§~
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-13 09:47:54 IP:61.220.xxx.xxx 訂閱
感謝前輩的範例.....
想再問個問題....
如果tree中要有複製貼上的功能該怎麼做?
假設我選取某一節點..該節點的data有指到一個class.
如果要複製選取的節點所有內容.然後複製好後.點選某的節點按貼上.
就把剛剛複製的貼到選到節點的子節點...這樣該怎麼做??
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-13 19:59:35 IP:59.105.xxx.xxx 未訂閱
<textarea class="cpp" rows="10" cols="60" name="code">TTreeNode *Newnode = RzTreeView1->Items->AddChild(Targetnode,Sourcenode->Name); //新增node if(Newnode) { YourClass *NewClass = new YourClass(); //建立一個新的Object NewClass->Member = ((YourClass*)Sourcenode->Data)->Member; //複製物件內容 Newnode->Data = NewClass; } </textarea>
類似這樣子,複製內容你可以在設計 Class 時先考慮進去

===================引 用 文 章===================
感謝前輩的範例.....
想再問個問題....
如果tree中要有複製貼上的功能該怎麼做?
假設我選取某一節點..該節點的data有指到一個class.
如果要複製選取的節點所有內容.然後複製好後.點選某的節點按貼上.
就把剛剛複製的貼到選到節點的子節點...這樣該怎麼做??
------
~§~迷時師渡,悟了自渡~§~
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-17 09:37:38 IP:61.220.xxx.xxx 訂閱
感謝前輩...
系統時間:2024-05-06 2:46:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!