請教如何新增node到TreeView中指定的位置呢? |
答題得分者是:gemi0305
|
hwtaiya
一般會員 發表:3 回覆:7 積分:2 註冊:2003-07-19 發送簡訊給我 |
比如說原本TreeView為:
Root--
|--child1
|--child2
|--child4 現在想在child2與child4間塞一個child3,請問該如何做?
小弟在TreeView的function中有找到AddChild,AddChildFirst,AddChildObject,...等
但是小弟只會用AddChild及Add()等只需給(TTreeNode *,AnsiString)的,至於一些像AddChildObject(TTreeNode *,AnsiString,void *)最後一項參數不知道要給什麼,順便也請高手們指導一下,謝啦! 我是新手,如果問的會回答的太可笑,請多包涵
------
**** 我是新手,如果問的會回答的太可笑,請多包涵 **** |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
|
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
我來解釋一下AddObject(或AddChildObject)這個function,
其實他前面兩個參數和Add(或AddChild)一樣,
你應該會用,至於後面的void*參數,就是說,
這個node裡,可以存一些資料,存結構好像比較多...
再上篇文章中,部份程式
PMyRec MyRecPtr; pItems->AddObject(pItems->Item[TreeViewIndex], "Item" IntToStr(TreeViewIndex), MyRecPtr); 的MyRecPtr就是上篇文章連結的.h檔中的結構 typedef struct MyRec { AnsiString FName, LName; } TMyRec; typedef TMyRec* PMyRec;所以只要加入這個node之後,這個node就存有這個結構的資料, 可以讓你做更進階的功能。 國泰平安 |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
|
hwtaiya
一般會員 發表:3 回覆:7 積分:2 註冊:2003-07-19 發送簡訊給我 |
先感謝gemi0305的回答,我初步用您提到的Insert方式,已可成功地插入一個結點,但是插入的位置我還是覺得拿不準,依據小弟的試驗,好像child4的index好像是2(而不是您所說的3),因此加入的位置變成在child1與child2間了,還是說它的index是指同層級的來算(我亂猜的),還請gemi0305或是版上的高手們再指點一下,謝謝!
另外,關於您提到最後void *的引數是否可以做為儲存結點相關資訊,比如說此結點屬於此層級的編號,然後可以利用此編號來指定到此一結點,不知道您是否有看懂我寫的意思…
若
PMyRec MyRecPtr;
TTreeNode *mynode;
mynode=TreeView1->Insert(TreeView1->Items->Item[3],"child3",MyRecPtr);
MyRecPtr->Name = mynode->Text;//這樣用對嗎?
MyRecPtr->num = mynode->Index; 然後可能以num為關鍵字來找到mynode或其它特定node嗎?
其中
typedef struct MyRec
{
AnsiString Name;
int num;
} TMyRec;
typedef TMyRec* PMyRec; 我是新手,如果問的會回答的太可笑,請多包涵 發表人 - hwtaiya 於 2003/07/20 22:20:27
------
**** 我是新手,如果問的會回答的太可笑,請多包涵 **** |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
hwtaiya你好,
請注意一下這幾個地方,
PMyRec MyRecPtr; TTreeNode *mynode; MyRecPtr = new TMyRec; //要new才有地方可以放 mynode=TreeView1->Items->InsertObject(TreeView1->Items->Item[3],"child3",MyRecPtr); //綠色是你少加的東西 MyRecPtr->Name = mynode->Text;//這樣用對嗎? MyRecPtr->num = mynode->Index; 此外,你可加一個button和一個memo,再加上以下的的code void __fastcall TForm1::Button1Click(TObject *Sender) { Memo1->Lines->Add("Name: " ((TMyRec*)(TreeView1->Selected->Data))->Name); Memo1->Lines->Add("num: " (AnsiString)((TMyRec*)(TreeView1->Selected->Data))->num); } 然後你先選那個child3,再按這個button,meno就會顯示這個node,就是child3所存的值, 但別選的別的node哦,如child1,因為它們裡面沒存東西, 會出現顯示錯誤, 參考看看~國泰平安 |
hwtaiya
一般會員 發表:3 回覆:7 積分:2 註冊:2003-07-19 發送簡訊給我 |
再次感謝gemi0305,在星期假日的深夜還這麼熱心的幫助我,太感謝您了… 不過我還是不懂,這樣子多給一個pointer有增加效率或什麼幫助嗎?
因為我要加的資訊還是得自己寫程式加進去(如
MyRecPtr->Name = mynode->Text;
MyRecPtr->num = mynode->Index;
},不給pointer的話好像也沒有影響,那麼到底好處在那兒呢?再次麻煩您了… **** 我是新手,如果問的會回答的太可笑,請多包涵 ****
------
**** 我是新手,如果問的會回答的太可笑,請多包涵 **** |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
hwtaiya你好, 如果你直接拿這個結構來用的話...呵
那如果這個結構有別人要用,別人不就改了你原來的資料... 當然是要用的人,就用pointer"複製"一份去用,
就像是新增一個button,
你會在.h檔裡看到 TButton *Button1;
你總不能直接拿 TButton 來用吧,他只是個元件, 也就像是說,沒有人直接拿int來用,
都要先 int i; 再拿i來用, 不管結構是不是元件之類的東西,但要使用這種"會被大家同時用到"的東西,
當然是用一個pointer來做輔助,程式才會嚴謹~ 國泰平安
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |