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

如何用TTreeView顯示統計資料?

尚未結案
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-10 09:19:17 IP:61.150.xxx.xxx 未訂閱
各位先進好! 一個學生出勤表,有以下幾Columns:     學生姓名   缺勤   時間     學院 (系)     例如: 張科奇 遲到 2004.2.5  建築系  周昌理 曠課 2004.2.10 醫學院  鄭督魁 病假 2004.2.10 熱能學院     希望到月底統計時用TTreeView顯示為如下圖的形式:     Q:請問該如何考慮這個問題,或請指引一下方向? 謝謝!
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-10 10:03:20 IP:211.21.xxx.xxx 未訂閱
mathewzhao您好    由判斷每一筆的資料欄位裡含有日期欄位的, 對應到TreeView的TTreeNode 然後新增節點, 填入系別    程式片段, 給您參考
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
  function FindItem(caption:string):TTreeNode;
  var I: Integer;
  begin
    Result:=nil;
    for I := 0 to TreeView1.Items.Count  - 1 do    // Iterate
    begin
      if TreeView1.Items.Item[i].Text=caption then
      begin
        Result:=TreeView1.Items.Item[i];
        exit;
      end;
    end;    // for
    Result:=nil;
  end;
var
  tn:TTreeNode;
begin
  if Field.FieldName='日期' then
  begin
    tn:=FindItem(Field.Value);
    if assigned(tn) then
       TreeView1.Items.AddChild(tn,
        DBGrid1.DataSource.DataSet.fieldByName('系別').AsString)
  end;
end;
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-10 10:17:19 IP:61.220.xxx.xxx 未訂閱
照這樣子看 你的日期就是第一層結點的位置囉 先設一個 TTreeNode 的變數 然後FOR LOOP 判斷 如果日期不一樣 那麼日期就放進第一層結點的位置   NodeRoot := TreeView1.Items.Add(nil, '日期的值') 如果日期一樣 就 TreeView1.Items.AddChild (加到子結點)    應該就可以了 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-11 14:20:03 IP:61.150.xxx.xxx 未訂閱
感謝兩位前輩指點!   pedro前輩的方法當DBGrid1中的Records較多時,會出現2個問題:     Q1:TreeView1隻會出現對應DBGrid1最初幾個Records的Nodes,將DBGrid1的卷軸向下滾動到最後一個Record,TreeView1才會增加所有的Nodes.      Q2:如果在DBGrid1的卷軸向下滾動後再向上滾動,則TreeView1會增加重復的Node.     我依T.J.B前輩的建議,將pedro前輩的程式稍作改變將這2個問題解決(Code 如下),但有一個疑問:如果程式是C/S架構,當Table1中的Records較多時,應該如何考慮?     謝謝! 
procedure TForm1.FormCreate(Sender: TObject);
var
  tn,NodeRoot:TTreeNode;
  temp:string;
begin
  NodeRoot:=TreeView1.Items.Add(nil,'本月紀錄');      if Table1.Fields[1].DisplayLabel='日期' then
  begin
     Table1.First;
     while not Table1.Eof do
     begin
       if temp<>Table1.Fields[1].AsString  then
          begin
           tn:=TreeView1.Items.AddChild(NodeRoot,Table1.Fields[1].AsString);
           TreeView1.Items.AddChild(tn,Table1.Fields[2].AsString);
           temp:=tn.Text;
          end
       else
           TreeView1.Items.AddChild(tn,Table1.Fields[2].AsString);           Table1.Next;
     end;
  end;
end;    
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-12 08:58:34 IP:210.61.xxx.xxx 未訂閱
用sql statement先把後端調出來的資料 group by
系統時間:2024-08-07 22:56:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!