如何將listbox中不限定階層的資料按階層轉入treeview中 |
尚未結案
|
sbt85535
一般會員 發表:4 回覆:3 積分:1 註冊:2002-04-16 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
利用TStringList解析後 存成TreeView 的格式 再讓TreeView 載入
//利用TStringList解析後 存成TreeView 的格式 再讓TreeView 載入 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) ListBox1: TListBox; TreeView1: TTreeView; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var slNode,slRoot, slTmp:TStringList; i,j, idx:integer; ts:TStringStream; begin ListBox1.Sorted:=True; slRoot:=TStringList.Create; slTmp:=TStringList.Create; for i := 0 to ListBox1.Items.Count-1 do begin slTmp.Clear; slTmp.CommaText:=StringReplace(ListBox1.Items[i],'-',',',[rfReplaceAll, rfIgnoreCase]); for j := 0 to slTmp.Count-1 do begin if j=0 then begin idx:=slRoot.IndexOf(slTmp[j]); if idx>-1 then slNode:=TStringList(slRoot.Objects[idx]) else begin slNode:=TStringList.Create; slNode.Add(slTmp[j]); slRoot.AddObject(slTmp[j], slNode); end; end else begin if slNode.IndexOf(StringOfChar(#9, j) slTmp[j])=-1 then slNode.Add(StringOfChar(#9, j) slTmp[j]); end; end; end; ts:=TStringStream.Create(''); for i := 0 to slRoot.Count-1 do begin ts.Seek(0, soFromEnd); ts.WriteString(TStringList(slRoot.Objects[i]).Text); end; ts.Seek(0, soFromBeginning); TreeView1.LoadFromStream(ts); ts.Free; slTmp.Free; slRoot.Free; end; end.發表人 - Chris_Shieh 於 2004/12/31 05:56:53 |
sbt85535
一般會員 發表:4 回覆:3 積分:1 註冊:2002-04-16 發送簡訊給我 |
引言: 利用TStringList解析後 存成TreeView 的格式 再讓TreeView 載入非常感謝您這麼快回應問提,我將您所寫內容完整複製執行時出現如下訊息。這是那個地方出問題呢? ....ETreeViewError with message'Invalid level(3) for item"1"'. process stopped .......//利用TStringList解析後 存成TreeView 的格式 再讓TreeView 載入 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) ListBox1: TListBox; TreeView1: TTreeView; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var slNode,slRoot, slTmp:TStringList; i,j, idx:integer; ts:TStringStream; begin ListBox1.Sorted:=True; slRoot:=TStringList.Create; slTmp:=TStringList.Create; for i := 0 to ListBox1.Items.Count-1 do begin slTmp.Clear; slTmp.CommaText:=StringReplace(ListBox1.Items[i],'-',',',[rfReplaceAll, rfIgnoreCase]); for j := 0 to slTmp.Count-1 do begin if j=0 then begin idx:=slRoot.IndexOf(slTmp[j]); if idx>-1 then slNode:=TStringList(slRoot.Objects[idx]) else begin slNode:=TStringList.Create; slNode.Add(slTmp[j]); slRoot.AddObject(slTmp[j], slNode); end; end else begin if slNode.IndexOf(StringOfChar(#9, j) slTmp[j])=-1 then slNode.Add(StringOfChar(#9, j) slTmp[j]); end; end; end; ts:=TStringStream.Create(''); for i := 0 to slRoot.Count-1 do begin ts.Seek(0, soFromEnd); ts.WriteString(TStringList(slRoot.Objects[i]).Text); end; ts.Seek(0, soFromBeginning); TreeView1.LoadFromStream(ts); ts.Free; slTmp.Free; slRoot.Free; end; end.發表人 - Chris_Shieh 於 2004/12/31 05:56:53 |
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
請參考 給【如何將listbox中不限定階層的資料按階層轉入treeview中 】的範例程式
http://delphi.ktop.com.tw/loadfile.php?TOPICID=19626365&CC=438935
|
sbt85535
一般會員 發表:4 回覆:3 積分:1 註冊:2002-04-16 發送簡訊給我 |
引言: 大家好: 在listbox 中有如下資料 1-1 1-2 1-3-1 1-3-2-1 1-3-2-2 2 3-1 3-2 如何將它們轉入treeview中,其中第一碼須為rootnode,因此第一階應該 只有 1 2 3 請大家幫幫忙吧? 我的listbox內容如下 1-1 1-2-1 1-2-2-1 1-2-2-2 1-2-2-3 1-3-1 1-3-2-1 1-3-2-2 2 3-1 3-2 用您的程式跑出結果 其中 1-3-1 1-3-2-1 1-3-2-2 跑不出 1-3以下的節點 這是啥原因呢? |
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
引言: 我的listbox內容如下 1-1 1-2-1 1-2-2-1 1-2-2-2 1-2-2-3 1-3-1 1-3-2-1 1-3-2-2 2 3-1 3-2 用您的程式跑出結果 其中 1-3-1 1-3-2-1 1-3-2-2 跑不出 1-3以下的節點 這是啥原因呢?這只是提供一個可行的原理範例 不是百分之百的解答 至於為什麼會這樣改就留給您自己想一想囉 procedure TForm1.Button1Click(Sender: TObject); var slNode,slRoot, slTmp:TStringList; i,j, idx, L1_idx:integer; ts:TStringStream; begin ListBox1.Sorted:=True; slRoot:=TStringList.Create; slTmp:=TStringList.Create; for i := 0 to ListBox1.Items.Count-1 do begin slTmp.Clear; slTmp.CommaText:=StringReplace(ListBox1.Items[i],'-',',',[rfReplaceAll, rfIgnoreCase]); slNode:=nil; for j := 0 to slTmp.Count-1 do begin if j=0 then begin idx:=slRoot.IndexOf(slTmp[j]); if idx>-1 then begin slNode:=TStringList(slRoot.Objects[idx]); end else begin slNode:=TStringList.Create; slNode.Add(slTmp[j]); slRoot.AddObject(slTmp[j], slNode); end; end else begin idx:=slNode.IndexOf(StringOfChar(#9, j) slTmp[j]); if (idx=-1) or (idx |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |