delphi的treeview(收集)

00 1
0001 2
000101 3
0002 4
0003 5

例一

//刷新Tree 1
procedure TMainForm.RefTree();
var
Tags:string ;
RootNode0,RootNode1,RootNode2,RootNode3,RootNode4,RootNode5:TtreeNode;
i:integer;
begin
TreeView1.Items.Clear;

RootNode0:=TreeView1.Items.Add(nil,'全部');
RootNode1:=TreeView1.Items.Add(nil,'資分類');
RootNode2:=TreeView1.Items.Add(nil,'部門');
RootNode3:=TreeView1.Items.Add(nil,'情況');
RootNode4:=TreeView1.Items.Add(nil,'位置');
RootNode5:=TreeView1.Items.Add(nil,'方式');
TreeView1.Items[0].ImageIndex:=11;
TreeView1.Items[1].ImageIndex:=54;
TreeView1.Items[2].ImageIndex:=54;
TreeView1.Items[3].ImageIndex:=54;
TreeView1.Items[4].ImageIndex:=54;
TreeView1.Items[5].ImageIndex:=54;
RootNode0.SelectedIndex:=RootNode0.ImageIndex;
RootNode1.SelectedIndex:=RootNode1.ImageIndex;
RootNode2.SelectedIndex:=RootNode2.ImageIndex;
RootNode3.SelectedIndex:=RootNode3.ImageIndex;
RootNode4.SelectedIndex:=RootNode4.ImageIndex;
RootNode5.SelectedIndex:=RootNode5.ImageIndex;

//分類
with DataM.q1 do
begin
SQL.Clear;
SQL.Add('Select Name1 from Navtree where tag=''分類'' ');
Open;
while not eof do
begin
TreeView1.Items.AddChild(RootNode1,FieldValues['Name1']);
next;
end;
end;
(此處省略365個字.....呵呵)

end; 

例二

procedure TForm1.showtree; //showtree自定義的
var
mynode:ttreenode;
begin
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('select * from aa where value = ''1''');
open;
if recordcount <> 0 then
begin
treeview1.Items.Add(treeview1.TopItem,fieldbyname('name').AsString);
end;
end;

with adoquery2 do
begin
close;
sql.Clear;
sql.Add('select * from aa where len(name) = 4');
open;
while not eof do
begin
mynode:= treeview1.Items.AddChild(treeview1.TopItem,fieldbyname('name').AsString);
with adoquery3 do
begin
close;
sql.Clear;
sql.Add('select * from aa where name like '''+ '%'+ mynode.Text+ ''' and len(name) = 6');
open;
if recordcount <> 0 then
begin
first;
begin
treeview1.Items.AddChild(mynode,fieldbyname('name').AsString);
next;
end;
end;
end;
next;
end;
end;
end

例三

一、指標樹的建立

具體方法是:創建一個數據庫,設計指標表t_pub_index,包含index_id、parent_id、index_name字段,其它字段根據實際業務而定,指標名稱index_name將在樹型控件的節點上顯示,index_id字段保存節點的唯一標識號,parent_id表示當前節點的父節點號,標識號組成了一個“鏈表”,記錄了樹上節點的結構。設計一窗體Frm_sys_index,其上放置TreeView控件tv_zb、Query控件Query1及其它指標屬性編輯顯示控件。一個樹的節點又包含文本(Text)和數據(Data)。Text爲String類,用來顯示指標或指標目錄名稱。Data則爲無定形指針(Untyped Pointer),可以指向一個與節點相聯繫的數據結構,該結構與數據庫指標表相應域關聯,如指標ID、上級節點ID。

Query控件的表達式爲:

select index_id, parent_id, index_name from t_pub_index

start with index_id=0 connect by prior index_id=parent_id

其中start with 和connect by 是Oracle的SQL語句的保留字,使一條記錄的parent_id列的值等於前一記錄的index_id列的值,並以parent_id等於0的記錄開始。

建樹的基本思路是:

procedure TFrm_sys_index.createtree;

var

curValue: indexPointer; //指向與節點相聯繫的數據結構的指針

curNode : TTreeNode; //當前節點

curid : integer; //當前節點標識號

begin

curNode := nil;

curid := -1;

Query_index.Open;

Query_index.first;

while not Query_index.Eof do

begin

new(curValue);

With curValue^ do

將數據庫指標表t_pub_index各字段值賦curValue 所指數據結構

while(curid <> curValue.parent_id) do //當前節點的標識號不等於當前記錄的父節點號

begin

curNode := curNode.parent;

curid:= indexPointer(curNode.data).index_id;

end;

curNode := tv_zb.Items.AddChildObject(curNode,

curValue^.index_name,curValue); //在當前節點上添加子節點,顯示節點指標名稱,所帶指針指向一個與指標數據相聯繫的數據結構

curid := indexPointer(curNode.data).index_id;

Query_index.next;

end;

Query_index.close;

end;

二、增加、刪除、修改樹節點

單純在Treeview 上增加、刪除、修改節點只需用它本身提供的Treeview.Items. AddChildObject、 Treeview.Selected.Delete、Treeview.Selected.EditText等方法即可,但要相應修改數據庫中的數據,必須通過遞歸調用同一個函數(用於刪除一個選項)來遍歷所選節點下的所有子節點。下面以刪除節點爲例介紹具體實現流程:

function TFrm_sys_index.delnode(node1:TTreenode):TTreenode;

var

childnode:TTreenode;

begin

childnode:=node1.GetLastChild; //按倒序獲得子項,因爲刪除選項時,列表會發生變化

while childnode<>nil do

childnode:=delnode(childnode); //如子項不爲空,進行遞歸調用

index_id:=inttostr(indexpointer(node1.data).index_id);//獲得該節點對應指標

在數據庫刪除相應指標;

result:=node1.parent.GetPrevChild(node1); //定位到該節點的上一節點

node1.delete; //刪除樹節點

end;

三、拖動樹節點

拖動樹節點基本上是通過建立目標項的新子項、向它複製源項、刪除原項來移動選項。與上述刪除操作相似,也是通過遞歸調用同一個函數(用於移動一個選項),按倒序移動所選節點下的所有子節點。下面是遞歸過程的代碼:

procedure TFrm_sys_index.CopyNodeUnder(treeview:TTreeview;

sourcenode,targetnode:ttreenode);

var

newnode:ttreenode;

i:integer;

begin

newnode:=treeview.items.addchildfirst(targetnode,''); //建立目標項

newnode.assign(sourcenode); //複製源項屬性

for i:=sourcenode.count-1 downto 0 do //遞歸調用,按倒序移動其所有子項

CopyNodeUnder (treeview,sourcenode.item[i],newnode);

treeview.items.delete(sourcenode); //刪除源項

end;

Treeview對拖動操作提供支持,我們將組件的DragKind屬性設置爲dkDrag,DragMode屬性設置爲dmAutomatic,併爲OnDragOver與OnDragDrop事件編寫了處理程序。OnDragOver事件處理程序對允許移動的條件進行判斷,排除需要避免的特殊情況。代碼如下:

procedure TFrm_sys_index.tv_zbDragOver(Sender, Source: TObject; X,

Y: Integer; State: TDragState; var Accept: Boolean);

var

targetnode,sourcenode:TTreenode;

begin

targetnode:=tv_zb.getnodeat(x,y);

if (Source=Sender) and (targetnode<>nil) then //保證移動在TreeView上,且目標節點不爲空

begin

Accept:=true;

sourcenode:=tv_zb.selected;

//以下代碼防止用戶將一個選項拖到其子項上(它會隨着選項一起移動,導致死循環)

while (targetnode.parent<>nil) and (targetnode <> sourcenode) do

targetnode:=targetnode.parent;

if (targetnode = sourcenode) then Accept:=false;

end

else Accept:=false;

end;

OnDragDrop事件處理程序啓動前述移動過程CopyNodeUnder,修改數據庫數據。此外,在大批量添加數據到Treeview中時最好使用TreeView.Items.BeginUpdate和  TreeView.Items.EndUpdate,這樣能加快顯示速度。大致流程如下:

procedure TFrm_sys_index.tv_zbDragDrop(Sender, Source: TObject; X,

Y: Integer);

var

targetnode,sourcenode:TTreenode;

begin

targetnode:=tv_zb.getnodeat(x,y); //獲得源節點

sourcenode:=tv_zb.selected; //獲得目標節點

修改數據庫中當前節點的父節點號parent_id,使其等目標節點標識號;

tv_zb.items.beginupdate; //禁用TreeView重繪操作

try

copynodeunder(tv_zb,sourcenode,targetnode); //啓動移動過程

tv_zb.selected:=targetnode;

finally

tv_zb.items.endupdate; //重新設置

end;

end;

例四

給你一段超級短的代碼,caption字段就是你的value字段,因value是保留字,所以我改成這個了。

procedure TForm1.Button1Click(Sender: TObject);
var
ss: TStrings;
begin
AdoQuery1.SQL.Text := 'SELECT name,caption FROM test8 ORDER BY name';
AdoQuery1.Open;

ss := TStringList.Create;
while not AdoQuery1.Eof do
begin
ss.Add(StringOfChar(#9,(Length(Trim(AdoQuery1.FieldValues['name'])) div 2)-1)
+ AdoQuery1.FieldValues['caption']);
AdoQuery1.Next;
end;

ShowMessage(ss.Text);
ss.SaveToFile('d:/test8.txt');
ss.Free;

TreeView1.LoadFromFile('d:/test8.txt');
end;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章