




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、DELPHI中利用TreeView控件建立目錄樹(shù)2000-06-26 00:00:00· ·中國(guó)計(jì)算機(jī)報(bào)社p>Rainbow的話:關(guān)于TreeView的使用,還可以參看:聯(lián)合使用TreeView 組件TreeView是一個(gè)顯示樹(shù)型結(jié)構(gòu)的控件,通過(guò)它能夠方便地管理和顯示具有層次結(jié)構(gòu)的信息,是Windows應(yīng)用程序的基本控件之一。DELPHI雖然具有比較強(qiáng)大的文件管理功能,提供了多個(gè)用于文件管理的標(biāo)準(zhǔn)控件,如DriveComboBox、DirectoryListBox、FileListBox等,通過(guò)設(shè)置它們的屬性,使其建立起聯(lián)系,甚至不用編寫(xiě)一行程序,我們就可以實(shí)現(xiàn)在不同
2、的目錄之間進(jìn)行切換,然而這樣的目錄切換只適用于進(jìn)行文件的查找定位,而不能方便地進(jìn)行目錄的瀏覽,例如我們要從c:windows目錄轉(zhuǎn)到c:program files目錄,就必須返回到根目錄才能進(jìn)行切換,而不能象Windows資源管理器那樣任意地在不同的目錄之間進(jìn)行瀏覽與切換。 要實(shí)現(xiàn)在不同目錄之間任意切換和瀏覽,還是需要使用TreeView控件,以下程序就利用DELPHI的TreeView控件來(lái)建立目錄樹(shù)。 在該程序中采用的各部件以及界面設(shè)計(jì)如下圖所示: 各部件的主要屬性設(shè)置如下: 部件 屬性屬性值formname captionform1 目錄瀏覽drivecommbobox name vis
3、ibledrivecommbobox1 falsefilelistboxname visiblefiletype filelistbox1falsefddirectoryimagelist name imagelist1treeview name images 該程序利用DriveCommboBox控件來(lái)獲得系統(tǒng)具有的驅(qū)動(dòng)器,并以此作為目錄樹(shù)的最上層,利用FileListBox控件,通過(guò)設(shè)置其Filetype屬性為fdDirectory,可以獲得所需的子目錄,在TreeView控件的OnExpanding事件中將得到的子目錄加到該控件的某一節(jié)點(diǎn)下。 整個(gè)程序的源代碼如下: unit main;
4、 interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, FileCtrl, ComCtrls, ImgList; type TForm1 = class(TForm) DirTreeView: TTreeView; FileListBox1: TFileListBox; DriveComboBox1: TDriveComboBox; ImageList1: TImageList; procedure FormCreate(Sender: TObject)
5、; procedure DirTreeViewExpanding(Sender: TObject; Node: TTreeNode;var AllowExpansion: Boolean); private Private declarations public Public declarations end; var Form1: TForm1; implementation $R *.DFM procedure TForm1.FormCreate(Sender: TObject); var FirstNode,DirNode : TTreeNode; ItemCount,Index:int
6、eger; Itemstr:string; begin ItemCount:= DriveComboBox1.Items.Count; /所有驅(qū)動(dòng)器的個(gè)數(shù) FirstNode := DirTreeView.Items.GetFirstNode; for index := 0 to ItemCount -1 do begin ItemStr:= DriveComboBox1.Itemsindex; ItemStr:= copy(ItemStr,1,pos(:,ItemStr) ; /獲得驅(qū)動(dòng)器的名稱(比如C/D) DirNode := DirTreeView.Items.AddChild(Fir
7、stNode, ItemStr ); DirNode.HasChildren := true; DirNode.ImageIndex := 0; DirNode.SelectedIndex := 1; end; end;/響應(yīng)擴(kuò)展事件 procedure TForm1.DirTreeViewExpanding(Sender: TObject; Node: TTreeNode;Var AllowExpansion: Boolean); var DirNode : TTreeNode; ItemCount,Index,level,icount:integer; Itemstr,strPath:st
8、ring; begin if node.Count = 0 then begin icount:=0; level:=node.Level ; dirnode:=node; strPath:=node.Text+ ; while level 0 do begin strPath:=dirnode.Parent.Text+strpath; dirnode:=dirnode.parent; level :=level -1; end; FileListBox1.Clear ; FileListBox1.Directory := strpath; ItemCount:= FileListBox1.I
9、tems.Count; for index:=0 to ItemCount -1 do begin itemstr:=filelistbox1.itemsindex; itemstr:= copy(ItemStr,2,pos(,ItemStr)-2) ; if (itemstr.) and (itemstr .) then begin DirNode := DirTreeView.Items.AddChild(Node,itemstr ); DirNode.HasChildren :=true; DirNode.ImageIndex := 0; DirNode.SelectedIndex :=
10、 1; icount:=icount+1; end; if icount = 0 then Node.HasChildren := false; end; end; end; end. 程序的運(yùn)行效果如圖所示:我們可以展開(kāi)目錄樹(shù)中的任何一個(gè)節(jié)點(diǎn),并且可以在任意節(jié)點(diǎn)之間切換,就象我們?cè)赪indows資源管理器中所作的那樣,而不需要逐級(jí)回退之后才能進(jìn)行切換。· 我的DBTreeView-TreeView直接連接數(shù)據(jù)表 · 獲取其他程序中TreeView的內(nèi)容 · 在ASP.NET中使用Treeview控件和XML · 利用Treeview實(shí)現(xiàn)樹(shù)形列表
11、83; 控件treeview的使用 · TreeView使用筆記 · 取得的Outlook目錄并在TTreeView里顯示出來(lái) · Object TreeView簡(jiǎn)要說(shuō)明 · TreeView的使用Delphi中根據(jù)分類(lèi)數(shù)據(jù)生成樹(shù)形結(jié)構(gòu)的最優(yōu)方法很多系統(tǒng)都有類(lèi)似于如下的表結(jié)構(gòu)(table1):ID Name &
12、#160; ParentID-001 電子類(lèi)
13、160; 0002 金屬類(lèi) &
14、#160; 0003 電容電子 001004
15、160; 電阻電子 001005
16、160; 有色金屬 002而且大家都習(xí)慣于用樹(shù)(TreeView)來(lái)顯示,這樣就可以很好的顯示整個(gè)表的分類(lèi)情況。但如果數(shù)據(jù)量多時(shí)會(huì)造成樹(shù)的生成比較慢,特別是用遞歸來(lái)實(shí)現(xiàn)時(shí)要訪問(wèn)數(shù)據(jù)庫(kù)的次數(shù)很多(根據(jù)層數(shù)),用在三層中效果更加顯。在此提供一個(gè)好的方法來(lái)生成樹(shù)形結(jié)構(gòu)。這個(gè)算法只訪問(wèn)一次數(shù)據(jù)庫(kù),
17、具體的實(shí)現(xiàn)如下:1、一次性從數(shù)據(jù)庫(kù)中取出所有的數(shù)據(jù),并按照ParentID字段進(jìn)行排序,這樣就保證每一條數(shù)據(jù)的父節(jié)點(diǎn)都在它的前面。2、取出第一條數(shù)據(jù)畫(huà)到樹(shù)中,在添加到樹(shù)中時(shí)先找到這條數(shù)據(jù)的父節(jié)點(diǎn),如果沒(méi)有 則將此記錄直接作為樹(shù)的第一級(jí)節(jié)點(diǎn)3、如果還有數(shù)據(jù),則取出來(lái)執(zhí)行第2步,直到?jīng)]有數(shù)據(jù)為止。程序?qū)崿F(xiàn): 本程序?qū)⒂靡粋€(gè)stlID的TStringList變量來(lái)存放對(duì)應(yīng)樹(shù)中每一個(gè)節(jié)點(diǎn)的ID值,用FindParent函數(shù)來(lái)父節(jié)點(diǎn)。function FindParent(ID:String):TTreeNode;var i:Integer;begin r
18、esult:=nil; for i:=TreeView1.Items.Count-1 downto 0 do if stlID.Stringsi=ID then begin result:=TreeView1.Itemsi; break; end;end;/生成樹(shù)procedure CreateTree;var tmpNode:TTre
19、eNode;begin Query1.close; Query1.SQL.Text:='select * from table1 order by ParentID' Query1.Open; Query1.First; while not Query1.Eof do begin tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Que
20、ry1.FieldByName('Name').AsString); stlID.Add(Query1.FieldByName('ID').AsString);/記錄ID Query1.Next; end;end;一. 如何初始化一個(gè)TreeView? 弄一個(gè)窗口,放上一個(gè)TreeView和一個(gè)Button,分別取名為T(mén)V1和Btn1。如果需要 在每個(gè)節(jié)點(diǎn)前有個(gè)圖,請(qǐng)?jiān)诖翱谏戏派弦粋€(gè)ImageList,取名為ImageList1,雙擊 它,加入六個(gè)圖標(biāo)。還要記得記得將TV1的Im
21、ages屬性改為ImageList1噢。雙擊按 鈕Btn1,在里面填入以下代碼,然后按F9運(yùn)行,點(diǎn)擊Btn1就可以看到效果了。 procedure TForm1.Btn1Click(Sender: TObject); Const MyDocDir = 'C:My Documents' PersonDir = '3hSoft' Var Var I : Word; SubNodeName : array 1.5 of ShortString; RootNode, SubNode : TTreeNode; P : PString; begin SubNodeName1
22、 := '便箋' SubNodeName2 := '發(fā)件箱' SubNodeName3 := '聯(lián)系人' SubNodeName4 := '任務(wù)' SubNodeName5 := '日記' TV1.Items.Clear; TV1.Items.BeginUpdate; New(P); P := MyDocDir + '' + PersonDir; RootNode := TV1.Items.AddObject(Nil, '個(gè)人文件夾', P); / 此 Node 的圖標(biāo)已對(duì) Imag
23、es 屬性中取第 0 個(gè)了。 For I := 1 to 5 do begin New(P); P := MyDocDir + '' + PersonDir + '' + SubNodeNameI; SubNode := TV1.Items.AddChildObject(RootNode, SubNodeNameI, P) ; ; / 如果不想使用圖標(biāo)的話請(qǐng)刪除以下兩行 SubNode.ImageIndex := I; SubNode.SelectedIndex := I; end; TV1.Items.EndUpdate; end; 二.在Tree
24、View中如何設(shè)置選中結(jié)點(diǎn) var i:integer; i為設(shè)置的選中結(jié)點(diǎn)的索引值 begin if i>treeview1.items.count then treeview1.itemsi.selected:=true; 或 treeview1.selected:=treeview1.itemsi; 三。設(shè)置TreeView結(jié)點(diǎn)的圖形 1. 設(shè)置TreeView的images屬性為已存在的images對(duì)象 treeview1.images:=imagelist1; 2. 在加入結(jié)點(diǎn)后執(zhí)行: var anode:TTreeNode; begein anode:=Treeview1.a
25、dd(nil,'item1'); anode.imageindex:=0; 結(jié)點(diǎn)未選中時(shí)顯示的圖標(biāo) anode.selectedindex:=1; 結(jié)點(diǎn)選中時(shí)顯示的圖標(biāo) end 3. 如果結(jié)點(diǎn)圖形在改變后未發(fā)生變化,可以執(zhí)行: treeview1.refresh; 四。如何批量處理TreeView結(jié)點(diǎn) 使用TreeView的items屬性的BeginUpdate和EndUpdate方法,例: TreeView1.items.BeginUpdate; for i:=0 to TreeView1.items.count-1 do begin file :/將每個(gè)結(jié)點(diǎn)的文
26、字改成為小寫(xiě)字母 TreeView1.itemsi.text:=lowercase(TreeView1.itemsi.text); end; TreeView1.items.EndUpdate; 五。實(shí)現(xiàn)TreeView結(jié)點(diǎn)拖拽的實(shí)例 下面的程序片段演示了如何實(shí)現(xiàn)拖拽treeview構(gòu)件結(jié)點(diǎn)的例子 鼠標(biāo)按下時(shí)執(zhí)行的語(yǔ)句 procedure TForm1.Treeview1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin 判斷左鍵按下并且鼠標(biāo)點(diǎn)在一個(gè)結(jié)點(diǎn)上開(kāi)始實(shí)現(xiàn)拖
27、拽 if ( Button = mbLeft ) and ( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then begin Treeview1.BeginDrag( False ); end; end; 鼠標(biāo)拖動(dòng)執(zhí)行語(yǔ)句 procedure TForm1.Treeview1DragOver( Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var Node : TTreeNode; begin if Source = Tre
28、eview1 then begin Node := Treeview1.GetNodeAt( X, Y ); 取當(dāng)前結(jié)點(diǎn) if Node <> nil then 當(dāng)前結(jié)點(diǎn)不為空才能實(shí)現(xiàn)拖拽,accept:=true Accept := true; end; end; 鼠標(biāo)釋放時(shí)執(zhí)行的語(yǔ)句 procedure TForm1.Treeview1DragDrop( Sender, Source: TObject; X, Y : Integer ); var TempNode : TTreeNode; AttachMode : TNodeAttachMode; begin if Treev
29、iew1.Selected = nil then Exit; AttachMode := naAddChild; 設(shè)置結(jié)點(diǎn)移動(dòng)模式,設(shè)移動(dòng)結(jié)點(diǎn)為子結(jié)點(diǎn) 注意在這里存在一個(gè)bug,當(dāng)移動(dòng)結(jié)點(diǎn)時(shí),如果目標(biāo)結(jié)點(diǎn)沒(méi)有子結(jié)點(diǎn), 則加入的新的子結(jié)點(diǎn)會(huì)失敗,所以先在當(dāng)前目標(biāo)結(jié)點(diǎn)的下面 加入一個(gè)臨時(shí)子結(jié)點(diǎn),移動(dòng)完畢后,再將臨時(shí)結(jié)點(diǎn)刪除 Treeview1.Items.BeginUpdate; try TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget, 'Temp' ); try 移動(dòng)選中的結(jié)點(diǎn)到目標(biāo)結(jié)點(diǎn) Treeview1.S
30、elected.MoveTo( Treeview1.DropTarget, AttachMode ); finally TempNode.Free; 不要忘了釋放臨時(shí)結(jié)點(diǎn) end; finally Treeview1.Items.EndUpdate; end; end; 今天上午到現(xiàn)在的心得想從以下的一段代碼來(lái)說(shuō)明。代碼很簡(jiǎn)單(當(dāng)我搞完后才覺(jué)得簡(jiǎn)單,搞了半天,哎,沒(méi)辦法,資質(zhì)有限呀),主要是要完成當(dāng)雙擊TreeView中的一項(xiàng)的時(shí)候?qū)?shù)據(jù)庫(kù)中符合條件的數(shù)據(jù)顯示在一個(gè)DBGird中。 procedure TmainForm.TreeviewDblClick(Sender: TObject); v
31、ar i:Integer;node:TTreeNode;beginnode:=Treeview1.Selected;if node.Text<>'father'thenbeginLoadGDDBGrid(node.Text);end;end;procedure TmainForm.LoadGDDBGrid(username:String);varnode1,node2:TTreeNode;SearchOptions:TLocateOptions;strSQL:String;begin strSQL := 'select * from user_informa
32、tion where user_information.USERNAME = ''%s''' ;strSQL:=Format(strSQL,username);showmessage(strSql);with ADODataSet1 dobeginClose;CommandText:=strSQL;Open;end;end;先說(shuō)明第一個(gè)procedure的功能吧,TreeviewDblClick()主要就是雙擊后能觸發(fā)DBGrid中的事件而已。這里面主要要說(shuō)明的是node := Treeview1.Selected,這句話的意思就是獲得目前被選中的節(jié)點(diǎn),
33、然后就可以根據(jù)node.Text來(lái)獲得此時(shí)選中的節(jié)點(diǎn)的內(nèi)容是什么了。這樣的做法和我以前學(xué)習(xí)的語(yǔ)言有比較大的出入。這里其實(shí)也弄了好久,因?yàn)橐婚_(kāi)始是以以前自己學(xué)習(xí)的語(yǔ)言程序的經(jīng)驗(yàn)來(lái)考慮,認(rèn)為要獲得目前選中的內(nèi)容的話,應(yīng)該使用的是Treeview中的item,當(dāng)然,也可以通過(guò)這個(gè)來(lái)獲得,但它卻需要告訴程序是哪個(gè)item(itemi),這顯然就不符合現(xiàn)在需要做的效果了。目前需要做的應(yīng)該是先找到一種方法能夠讓程序知道我目前選擇的是哪個(gè)節(jié)點(diǎn),然后就找了一下Treeview1中有哪些方法,發(fā)現(xiàn)了Selected,但看到它的返回值是一個(gè)note,這就讓我有點(diǎn)迷惑了,為什么返回的不是一個(gè)item呢(這主要是因?yàn)?/p>
34、對(duì)delphi的體系仍然沒(méi)有一個(gè)很好的了解和總結(jié)),后來(lái)發(fā)覺(jué)在note里面也有一種方法是text的,然后試了一下,就獲得了我所需用的效果了?,F(xiàn)在想了想,其實(shí)以前已經(jīng)知道Treeview是由一個(gè)個(gè)的note組成的,想到這個(gè),就覺(jué)得note.text是很理所當(dāng)然的了。 花時(shí)間最多的可能是第二段代碼吧,LoadGDDBGrid()主要是把符合條件的數(shù)據(jù)顯示到DBGrid中去。首先,我需要解決的是如何能讓數(shù)據(jù)顯示出來(lái),我想到了在設(shè)計(jì)界面上DBGrid有一個(gè)DataSet的屬性選擇,那里選擇的是ADODataSet1(ADODataSet類(lèi)型)
35、,然后想起前兩天連接數(shù)據(jù)庫(kù)的時(shí)候只要將ADODataSet1中的Active設(shè)置成True的話,Grid就會(huì)自動(dòng)顯示相應(yīng)的數(shù)據(jù)。那么,我只要把ADODataSet1激活的話,就應(yīng)該可以把數(shù)據(jù)顯示出來(lái)了,于是就使用了ADODataSet1.Active := True,確實(shí),可以把它顯示出來(lái)了。但這種顯示是把所有數(shù)據(jù)都顯示出來(lái),那么,下一步需要解決的就是如何變?yōu)榭梢愿鶕?jù)條件顯示了。在ADODataSet1中有一個(gè)CommandText,是用來(lái)保存該ADODataSet所運(yùn)行的sql語(yǔ)句的,那么又從這里開(kāi)始入手。到了這里,遇到的困難竟然是一個(gè)以前不算是困難的問(wèn)題。以前在使用java的時(shí)候,由于ja
36、va的String是使用雙引號(hào)來(lái)包括的,比如A="a",但現(xiàn)在的delphi卻是使用單引,郁悶呀,因?yàn)槲业膚here后面的field是varchard類(lèi)型的,如果在java中就可以表示為"A='a'",但在delphi中就讓我困惑了,這里搞了一陣子,最后才發(fā)覺(jué)只要在其中加多兩個(gè)單引就可以了,如'A=''a''',呵呵,讓我哭笑不得。 在寫(xiě)這個(gè)功能的時(shí)候遇到的問(wèn)題大概就是這些。但我還想講一下幾個(gè)地方,首先是with ADODataSe
37、t1 do的使用,其實(shí)也就是對(duì)ADODataSet1進(jìn)行了引用,那么,在這個(gè)引用中就不需要再ADODataSet1.Close這樣的寫(xiě)關(guān)閉命令了,只需要加close就可以了。其次是Format的使用。Format()函數(shù)是用來(lái)定義字符串。它的基本格式是S := Format('My name is %s and I'm %d years old.'', 'jag',26),得到的S的結(jié)果就是My name is jag and I'm 26 years old.從這里可以看出了吧,F(xiàn)ormat的左右其實(shí)就是把符合條件的值放入相應(yīng)的位置。%
38、s這種就是格式化指示符。c代表字符類(lèi)型,d代表整數(shù)類(lèi)型,f代表浮點(diǎn)類(lèi)型,p代表指針類(lèi)型,s代表字符串類(lèi)型。Delphi中樹(shù)型控件的使用技巧我們都知道,開(kāi)發(fā)者主要用Delphi來(lái)開(kāi)發(fā)數(shù)據(jù)庫(kù)管理軟件,正因如此,樹(shù)型控件的使用最好與數(shù)據(jù)庫(kù)聯(lián)系起來(lái)。Delphi提供了一個(gè)樹(shù)型控件TTreeView,可以用來(lái)描述復(fù)雜的層次關(guān)系。 樹(shù)節(jié)點(diǎn)信息的存儲(chǔ)和加載 常用的方法是用樹(shù)控件的 LoadFromFile和SavetoFile方法,來(lái)實(shí)現(xiàn)樹(shù)控件和文件之間的交互;或用Assign方法實(shí)現(xiàn)樹(shù)控件和DBMemo,也就是和數(shù)據(jù)庫(kù)間的交互。該方法的優(yōu)點(diǎn)是編程相對(duì)簡(jiǎn)單,缺點(diǎn)是樹(shù)控件的實(shí)際節(jié)點(diǎn)數(shù)可能會(huì)很大,對(duì)于“大樹(shù)”,
39、每次加載和存儲(chǔ)的數(shù)據(jù)量會(huì)加大,將降低速度,增大系統(tǒng)開(kāi)銷(xiāo),造成數(shù)據(jù)冗余。另一種方法,就是只在樹(shù)上產(chǎn)生“看得見(jiàn)”的節(jié)點(diǎn),沒(méi)有專(zhuān)門(mén)記錄全部樹(shù)節(jié)點(diǎn)結(jié)構(gòu)的文件或數(shù)據(jù)庫(kù)字段,而將樹(shù)節(jié)點(diǎn)結(jié)構(gòu)分散在數(shù)據(jù)庫(kù)的每一個(gè)記錄中。 具體方法是:創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),字段根據(jù)實(shí)際業(yè)務(wù)而定,其中必然有一個(gè)字段的信息將在樹(shù)型控件的節(jié)點(diǎn)上顯示,另外還要一個(gè)字段來(lái)保存節(jié)點(diǎn)的惟一標(biāo)識(shí)號(hào),該標(biāo)識(shí)號(hào)由長(zhǎng)度相等的兩部分組成,前段表示當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)號(hào),后段表示當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)號(hào),此標(biāo)識(shí)號(hào)相當(dāng)于一個(gè)“鏈表”,記錄了樹(shù)上節(jié)點(diǎn)的結(jié)構(gòu)。該方法的優(yōu)點(diǎn):用戶操作“大樹(shù)”時(shí),一般不會(huì)展開(kāi)所有的節(jié)點(diǎn),而只用到有限的一部分,同時(shí)只能從樹(shù)根一層一層地展開(kāi),該法只在
40、樹(shù)上產(chǎn)生“看得見(jiàn)”的節(jié)點(diǎn),所以,存儲(chǔ)和加載“大樹(shù)”的速度快,數(shù)據(jù)量小,系統(tǒng)開(kāi)銷(xiāo)和數(shù)據(jù)冗余較小。缺點(diǎn):編程較復(fù)雜,但可以結(jié)合該方法編成一個(gè)新的樹(shù)控件,將大大提高編程效率。值得注意的是,ID號(hào)必須惟一,所以在編程中如何合理產(chǎn)生ID尤為重要。 數(shù)據(jù)庫(kù)結(jié)構(gòu)示例 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),為簡(jiǎn)化程序,我只創(chuàng)建兩個(gè)數(shù)據(jù)庫(kù)字段,定義如下:字段名類(lèi)型長(zhǎng)度textc10longidc6 LongID字段實(shí)際上由兩段組成,每一段3位,LongID只能表示1000條記錄。將LongID定義為索引字段,存為c:testtreetree.dbf。編輯該DBF文件,新建一條記錄,Text字段設(shè)為T(mén)OP,LongID字段設(shè)為“000
41、”(3個(gè)“0”前為三個(gè)空格)。 創(chuàng)建演示程序 在Form1上放置TreeView1、Table1、PopupMenu1、Edit1、Edit2。TreeView1的PopupMenu屬性設(shè)為PopupMenu1;Table1的DataBaseName屬性設(shè)為c:testtree,TableName屬性設(shè)為tree.dbf,IndexFieldNames屬性設(shè)為L(zhǎng)ongID;為PopupMenu1加選單項(xiàng)Add1和Del1,Caption分別為Add和Del;Edit1用來(lái)輸入新節(jié)點(diǎn)的Text屬性值,Edit2用來(lái)輸入新節(jié)點(diǎn)的3位ID號(hào)。存為c:testtreetreeunit.pas和c:te
42、sttreetesttree.dpr。 在treeunit.pas的Type關(guān)鍵字后加入一行:Pstr:string;Pstr為字符串指針 為Form1的OnCreate事件添加代碼: procedure TForm1.FormCreate(Sender: TObject); var p:Pstr;Node:TTreeNode; begin with Table1,Treeview1 do begin open; first; new(p);為指針p分配內(nèi)存 p:=FieldByName(LongID).AsString; Node:=Items.AddChildObject(nil,Fiel
43、dByName(Text).AsString,p); if HasSubInDbf(Node) then Items.AddChildObject(Node, ,nil);有子節(jié)點(diǎn)則加一個(gè)空子節(jié)點(diǎn) end; end; HasSubInDbf為自定義函數(shù),自變量為Node,檢查節(jié)點(diǎn)Node有無(wú)子節(jié)點(diǎn),有則返回True,反之返回False,并在TForm1的類(lèi)定義里加入原型聲明(其它自定義函數(shù)的原型也在TForm1的類(lèi)定義里聲明,不另作解釋),函數(shù)代碼如下: function TForm1.HasSubInDbf(Node:TTreeNode):Boolean; begin with Table1
44、 do begin Table1.FindNearest(copy(Pstr(Node.Data),4,3)000); result:=copy(FieldByName(LongID).AsString,1,3)=copy(Pstr(Node.Data),4,3);如數(shù)據(jù)庫(kù)里當(dāng)前記錄的LongID字段內(nèi)容的前3位和節(jié)點(diǎn)Node的Data的后3位相同,則Node應(yīng)該有子節(jié)點(diǎn) end; end; 為T(mén)reeView1控件的OnDeletion事件添加代碼,需要指出的是,不僅調(diào)用Delete方法可以觸發(fā)OnDeletion事件,而且當(dāng)樹(shù)控件本身被釋放前,也觸發(fā)OnDeletion事件,所以,在此處加
45、入dispose(node.data)會(huì)很“安全”: procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode); begin Dispose(Node.Data);釋放節(jié)點(diǎn)數(shù)據(jù)內(nèi)存 end; 為Add1選單項(xiàng)的OnClick事件添加代碼如下: procedure TForm1.Add1Click(Sender: TObject); var p:pstr;Tmpstr:string;i:integer; begin try StrToInt(Edit2.Text); Tmpstr:=Edit2.Text;注:在實(shí)用中
46、,必須用更好的方法來(lái)產(chǎn)生ID except; ShowMessage(重新輸入Edit2的內(nèi)容); abort; end; with TreeView1 do begin new(p); p:=copy(Pstr(Selected.Data),4,3)TmpStr; Items.AddChildObject(Selected,Edit1.Text,p); end; with Table1 do 在數(shù)據(jù)庫(kù)里添加記錄 begin Append; FieldByName(Text).AsString:=Edit1.text; FieldByName(LongID).AsString:=p; Post
47、; end; TmpStr:=inttostr(strtoint(TmpStr)1); for i:=length(TmpStr) to 2 do TmpStr:=0TmpStr; Edit2.Text:=TmpStr; end; 為Del1菜單項(xiàng)的OnClick事件添加代碼如下: procedure TForm1.Del1Click(Sender: TObject); var DelList:TStringList;LongID,NSubLongID:string; begin DelList:=TStringList.create; DelList.Sorted:=True; DelList.Add(Pstr(TreeView1.Selec
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(xué)物理考試不可逆過(guò)程理解試題及答案
- 2025屆新疆烏魯木齊市高三下學(xué)期三模英語(yǔ)試題(原卷版+解析版)
- 2025年大學(xué)化學(xué)講座回顧試題及答案
- 2025年精準(zhǔn)醫(yī)學(xué)課程考試試卷及答案
- 2022年全國(guó)中學(xué)生數(shù)學(xué)奧林匹克競(jìng)賽(預(yù)賽)暨 2022年全國(guó)高中數(shù)學(xué)聯(lián)合競(jìng)賽一試(A2 卷)參考答案及評(píng)分標(biāo)準(zhǔn)
- 2018年全國(guó)數(shù)學(xué)高聯(lián)A卷-試題
- 樓盤(pán)抵押貸款合同協(xié)議
- 微信租車(chē)庫(kù)合同協(xié)議
- 品質(zhì)面料采購(gòu)合同協(xié)議
- 比亞迪換車(chē)合同協(xié)議
- ??低曅U性诰€測(cè)評(píng)題庫(kù)
- 電網(wǎng)兩票培訓(xùn)課件
- 《土地集約利用》課件
- 小學(xué)英語(yǔ)(完整版)現(xiàn)在進(jìn)行時(shí)練習(xí)題附答案
- 無(wú)違法犯罪記錄證明申請(qǐng)表(個(gè)人)
- 衡水介紹-衡水簡(jiǎn)介PPT(經(jīng)典版)
- 性激素六項(xiàng)的解讀 課件
- 模具設(shè)計(jì)與制造畢業(yè)設(shè)計(jì)
- 2023年福建三明市初中畢業(yè)班數(shù)學(xué)質(zhì)量檢測(cè)卷(附答案)
- 金蝶固定資產(chǎn)管理系統(tǒng)
- LY/T 2457-2015西南樺培育技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論