線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1622
推到 Plurk!
推到 Facebook!

ADOQUERY中的資料讀入TreeView的效率問題!

答題得分者是:Chance36
ucdesign2
一般會員


發表:24
回覆:33
積分:11
註冊:2002-10-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-10 16:59:55 IP:211.23.xxx.xxx 未訂閱
請教前輩: 在下想將ADOQUERY中的資料讀入TreeView中, 約35000筆資料耗時約7秒!請問有更有效率的方法? 或是我的程式要如何修正?煩請前輩指正!謝謝!!    ADOQUERY中的三個欄位:(資料表已完成排序) 縣市名稱 鄉鎮名稱 路段名稱 ======== ======== ======== AA AA1 AA1_1 AA AA1 AA1_2 AA AA1 AA1_3 AA AA2 AA2_1 AA AA3 AA3_1 AA AA3 AA3_2 BB BB1 BB1_1 BB BB1 BB1_2 BB BB2 BB2_1 BB BB2 BB2_2 BB BB2 BB2_3 CC CC1 CC1_1 CC CC2 CC2_1 CC CC2 CC2_2 CC CC3 CC3_1 TReeVIEW中的內容: AA .. --AA1 ....... --AA1_1 ....... --AA1_2 ....... --AA1_3 .. --AA2 ....... --AA2_1 .. --AA3 ....... --AA3_1 ....... --AA3_2 BB .. --BB1 ....... --BB1_1 ....... --BB1_2 .. --BB2 ....... --BB2_1 ....... --BB2_2 ....... --BB2_3 : : var lvl1,lvl2:string; St, En : TDateTime ; begin lvl1:=''; lvl2:=''; ADOQuery1.First; ADOQuery1.DisableControls; TreeView1.Items.BeginUpdate; st:=now; while not ADOQuery1.Eof do begin if ADOQuery1.FieldByName('縣市名稱').AsString<>lvl1 then //新的縣市 begin lvl1:=ADOQuery1.FieldByName('縣市名稱').AsString; TreeView1.Items.AddChild(nil,lvl1); lvl2:=ADOQuery1.FieldByName('鄉鎮名稱').AsString; if TreeView1.Items.Count=1 then treeview1.items.item[0].selected:=true else treeview1.items.Item[TreeView1.Items.Count-1].Selected:=true; TreeView1.Items.AddChild(TreeView1.Selected,lvl2); TreeView1.Selected:=TreeView1.Selected.getlastChild; TreeView1.Items.AddChild(TreeView1.Selected,ADOQuery1.FieldByName('路段名稱').AsString); end else if ADOQuery1.FieldByName('鄉鎮名稱').AsString=lvl2 then //新的路段 TreeView1.Items.AddChild(TreeView1.Selected,ADOQuery1.FieldByName('路段名稱').AsString) else begin //新的鄉鎮 if TreeView1.Selected.Level=2 then TreeView1.Selected:=(TreeView1.Selected.Parent).Parent else TreeView1.Selected:=TreeView1.Selected.Parent; lvl2:=ADOQuery1.FieldByName('鄉鎮名稱').AsString; TreeView1.Items.AddChild(TreeView1.Selected,lvl2); TreeView1.Selected:=TreeView1.Selected.getlastChild; TreeView1.Items.AddChild(TreeView1.Selected,ADOQuery1.FieldByName('路段名稱').AsString); end; ADOQuery1.Next; end; en:=now; Label1.Caption := FormatDateTime('hh:mm:ss.zz', En - St) ; TreeView1.Items.EndUpdate; ADOQuery1.enableControls; 發表人 - ucdesign2 於 2004/09/10 17:08:28
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-10 20:48:43 IP:211.20.xxx.xxx 未訂閱
ucdesign2 你好
  在不改用別的TreeView的元件的情況下,程式碼改成如下看看:
1.使用With 讓物件的參考減少一些
2.TreeView.Selected 減少設定的次數
3.程式流程的精簡    var
  lvl1,lvl2:string;
  St, En : TDateTime ;
  Node0,Node1,Node3 : TTreeNode ;
begin
  lvl1:='';
  lvl2:='';
  st:=now;
  Node1 := nil ;
  Node2 := Nil ;
  Node3 := Nil ;
  With ADOQuery1 Do Begin
    First;
    DisableControls;
    TreeView1.Items.BeginUpdate;
    while not Eof do begin
      if FieldByName('縣市名稱').AsString<>lvl1 then begin//新的縣市
        lvl1:=FieldByName('縣市名稱').AsString;
        Node1 := TreeView1.Items.AddChild(nil,lvl1);
        lvl2 := '' ;
      End;
      if FieldByName('鄉鎮名稱').AsString=lvl2 then Begin //新的路段
        lvl2:=FieldByName('鄉鎮名稱').AsString;
        Node2 := TreeView1.Items.AddChild(Node1,lvl2);
      End;
      lvl2:=FieldByName('路段名稱').AsString;
      Next;
    end;
  End;
  en:=now;
  Label1.Caption := FormatDateTime('hh:mm:ss.zz', En - St) ;
  TreeView1.Items.EndUpdate;
  ADOQuery1.enableControls;
end;
若要有更快的速度表現,可能要改用別的元件了(在本站搜尋一下,也有很多TreeView相關的元件)。 _______________________________________ 深藍的魚,祝您好運..........連連
ucdesign2
一般會員


發表:24
回覆:33
積分:11
註冊:2002-10-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-11 09:13:49 IP:211.23.xxx.xxx 未訂閱
謝謝Chance36版主的指教,真是藥到病除!! 尤其是用 Node2 := TreeView1.Items.AddChild(Node1,lvl2); 替代TreeView.Selected; 使效率大幅提升
系統時間:2024-09-10 9:40:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!