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

如何以Locate方式查詢TreeView的Node

答題得分者是:Justmade
mcho
初階會員


發表:57
回覆:106
積分:42
註冊:2002-11-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-17 09:57:08 IP:61.224.xxx.xxx 未訂閱
我利用TreeView設計族譜系統圖,層次很多目前已經有30層,以後還要增加 請教先進高手門!如何以類似locate方式,直接跳到我要找尋的節點(node)! 何明昌
------
何明昌
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-17 10:15:09 IP:147.8.xxx.xxx 未訂閱
I think you need to iterate through the treeview yourself or implment some kind of external indexing since there is no search function in the standard treeview.
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-17 11:00:54 IP:218.16.xxx.xxx 未訂閱
你可以用一個 TClientDataSet 來記住你要 locate 的欄位和相對TreeNode 的 Absolute index,這樣你就可以用 TClientDataSet 來locate 然後用得出的 absolute index 直接去到相對的 Node 了。 不連結數量庫而使用 TClientDataSet 1. 雙擊 該 ClientDataSet 2. 右擊,選 New Field 來加入欄位 3. 加入所有欄位後右擊該 ClientDataSet, 選 Create DataSet 即可 你可於每次開該 Form 時動態 insert 入 該 ClientDataSet 中,或在 Filename 輸入檔案名讓該 ClientDataSet 自動存取資料到該檔案中。
mcho
初階會員


發表:57
回覆:106
積分:42
註冊:2002-11-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-17 15:31:04 IP:61.224.xxx.xxx 未訂閱
Hi! Justmade:你好!謝謝你! 你指ClientDataSet是Midas page 的ClientDataSet嗎? 因為我用ADOQuery利用下列函式讀入的: procedure TForm1.ConStruct_Tree(Parent_Node:TTreeNode; Parent_Text:String); //建立動態TreeViewvar Tmp_Query:TAdoQuery; Tmp_Str:String; Tmp_Node:TTreeNode; begin //下SQL指令找資料 Tmp_Query:=QueryCreate; Tmp_Str:='SELECT * FROM TREES ' ' WHERE PARENT="' Parent_Text '"' ' Order By PARENT, Child'; OpenSQL(Tmp_Query,Tmp_str); //再將資料一個個塞入Treeview中 while not Tmp_Query.Eof do begin Tmp_Node:=trvmain.items.AddChild(Parent_Node,Tmp_Query.FieldByName('child').AsString); Try //遞迴... ConStruct_Tree(Tmp_Node,Tmp_Query.FieldByName('child').AsString); except messagebox(Form1.handle,'資料庫有問題,請先檢查資料庫','檢查資料庫',mb_ok); end; Tmp_Query.Next; end; Tmp_Query.Free; //TrvMain.Focused() end; 要如何利用ClientDataSet可否做一範例? 何明昌
------
何明昌
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-17 15:58:46 IP:218.16.xxx.xxx 未訂閱
你是用 Delphi 5 的哦,就是 MIDAS 那個啦。    實作:
1. 加入 1 個 TClientDataSet (CDS)
2. 雙擊 CDS
3. 右擊 Editor,選 New Field 來加入你會用來 Locate 的欄位。
   例如 :
   Field : Parent
   Type : String
   Size : 20
   Field Type : Data
4. 加入其他你會用來 locate 的field
5. 加入存 absolute index 的 field
   Field : NodeIDX
   Type : Integer
   Field Type : Data
6. 右擊該 ClientDataSet, 選 Create DataSet
7. 在你動讀入TreeView 的程式碼每加入一個 Node 同時將相關資料 insert 入 CDS
   CDS.Insert;
   CDSParent.Value := Tmp_Query.FieldByName('parent').AsString
   ....
   CDSNodeIDX.Value := TempNode.AbsoluteIndex;
   CDS.Post;
8. 要 locate 時
   if CDS.Locate('Parent',*parent value*,[*options*]) then
     TreeView.selected := TreeView.Items[CDSNodeIDX.Value];  
差不多就這樣,因為我的腦袋 complier 的 debugger 功能不強,可能有些錯都不定,試試看罷。
mcho
初階會員


發表:57
回覆:106
積分:42
註冊:2002-11-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-17 19:34:41 IP:61.224.xxx.xxx 未訂閱
Hi! Justmade:謝謝你! 我做好了! 何明昌
------
何明昌
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-17 20:04:50 IP:218.16.xxx.xxx 未訂閱
謝謝你證明了我憑空想像的方法可行喔    因我也從來沒這樣做過,只是想這樣應該可以罷 
系統時間:2024-05-17 3:02:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!