ADOQUERY中的資料讀入TreeView的效率問題! |
答題得分者是:Chance36
|
ucdesign2
一般會員 發表:24 回覆:33 積分:11 註冊:2002-10-23 發送簡訊給我 |
請教前輩:
在下想將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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |