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

如何將listbox中不限定階層的資料按階層轉入treeview中

尚未結案
sbt85535
一般會員


發表:4
回覆:3
積分:1
註冊:2002-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-31 00:27:06 IP:203.204.xxx.xxx 未訂閱
大家好: 在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 請大家幫幫忙吧?
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-31 05:43:35 IP:218.167.xxx.xxx 未訂閱
利用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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-01 18:38:59 IP:203.204.xxx.xxx 未訂閱
引言: 利用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
非常感謝您這麼快回應問提,我將您所寫內容完整複製執行時出現如下訊息。這是那個地方出問題呢? ....ETreeViewError with message'Invalid level(3) for item"1"'. process stopped .......
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-02 00:17:03 IP:218.167.xxx.xxx 未訂閱
請參考 給【如何將listbox中不限定階層的資料按階層轉入treeview中 】的範例程式   http://delphi.ktop.com.tw/loadfile.php?TOPICID=19626365&CC=438935
sbt85535
一般會員


發表:4
回覆:3
積分:1
註冊:2002-04-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-02 17:48:19 IP:203.204.xxx.xxx 未訂閱
引言: 大家好: 在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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-03 11:01:20 IP:218.174.xxx.xxx 未訂閱
引言: 我的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         
        
系統時間:2024-07-01 9:11:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!