執行效率的問題! |
尚未結案
|
ucdesign2
一般會員 發表:24 回覆:33 積分:11 註冊:2002-10-23 發送簡訊給我 |
請教前輩:
在下把經過排序的ADOQuery1的內容取入TreeView中,
我的問題是下面紅色部份程式在FormActivate中執行
約耗時3秒(35000筆資料),但把紅色部份程式
加入自製元件中,執行時卻要26秒(放在元件procedure TAddrPanel1.Loaded;中)
這是為什麼?請前輩指教! 謝謝!!
procedure TForm1.FormActivate(Sender: TObject);
var
lvl1,lvl2:string;
St, En : TDateTime ;
Nod1,Nod2: TTreeNode;
begin
lvl1:='';
lvl2:='';
TreeView1.Items.BeginUpdate;
st:=now; //計時開始
With ADOQuery1 Do
Begin
Nod1 :=nil;
Nod2 :=Nil;
First;
DisableControls;
while not Eof do
begin
if FieldByName('縣市名稱').AsString<>lvl1 then
begin
lvl1:=FieldByName('縣市名稱').AsString;
nod1:=TreeView1.Items.AddChild(nil,lvl1);
lvl2:=FieldByName('鄉鎮名稱').AsString;
nod2:=TreeView1.Items.AddChild(nod1,lvl2);
TreeView1.Items.AddChild(nod2,FieldByName('路段名稱').AsString);
end
else
if FieldByName('鄉鎮名稱').AsString=lvl2 then
TreeView1.Items.AddChild(nod2,FieldByName('路段名稱').AsString)
else
begin
lvl2:=FieldByName('鄉鎮名稱').AsString;
nod2:=TreeView1.Items.AddChild(nod1,lvl2);
TreeView1.Items.AddChild(nod2,FieldByName('路段名稱').AsString);
end;
Next;
end;
enableControls;
end;
en:=now; //計時結束
Label1.Caption := FormatDateTime('hh:mm:ss.zz', En - St) ; //顯示耗時
TreeView1.Items.EndUpdate;
showmessage(inttostr(TreeView1.Items.Count));
end;
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
ucdesign2
一般會員 發表:24 回覆:33 積分:11 註冊:2002-10-23 發送簡訊給我 |
change.jian版主
這是自製元件中的寫法(這是一個輸入地址的元件)
請幫我查一下為何速度會差這麼多! 謝謝!!
unit AddrPanel1; interface uses
SysUtils, Classes, Controls, ExtCtrls,ComCtrls,DB,ADODB,Dialogs,StdCtrls,
Fashionpanel,Suibutton; type
TAddrPanel1 = class(TCustomPanel)
private
FTreeview:TTreeView;
FFPanel:TFashionPanel;
FBtn_expand,FBtn_close,FBtn_getaddr:TsuiButton;
FB: array[1..36] of TsuiButton;
Edit1:TEdit;
qry1:TADOQuery;
FAddrString:String;
FConnection:TADOConnection;
procedure FTreeViewClick(Sender: TObject);
procedure FBClick(Sender: TObject);
procedure FBtn_expandClick(Sender: TObject);
procedure FBtn_closeClick(Sender: TObject);
procedure FBtn_getaddrClick(Sender: TObject);
procedure SetAddrString(const Value:String);
procedure SetConnection(const Value: TADOConnection);
protected
procedure Loaded; override;
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
procedure SetParent(AParent: TWinControl); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property AddrString:String read FAddrString write SetAddrString;
property Connection:TADOConnection read FConnection write SetConnection;
end; procedure Register; implementation Const
addrstr='縣市鄉鎮區路147壹肆柒街段巷弄樓號258貳伍捌之鄰村里零0369參陸玖'; procedure Register;
begin
RegisterComponents('Custom', [TAddrPanel1]);
end; { TAddrPanel1 } constructor TAddrPanel1.Create(AOwner: TComponent);
var
i,fbleft,fbtop:Integer;
begin
inherited Create(AOwner);
parent:=TWinControl(AOwner);
Align:=alLeft;
Left:=0;
Top:=0;
Width:=475;
Height:=488;
//------------------------
Edit1:=TEdit.Create(Self);
Edit1.Parent:=Self;
Edit1.Left:=8;
Edit1.Width:=457;
Edit1.Top:=448;
Edit1.Height:=28;
Edit1.Font.Size:=12;
//-------------------------
FTreeview:=TTreeView.Create(Self);
FTreeview.Parent:=Self;
FTreeview.Height:=433;
FTreeview.Width:=257;
FTreeview.Left:=8;
FTreeview.Top:=8;
FTreeview.Font.Size:=10;
FTreeview.OnClick:=FTreeViewClick;
//--------------------------------
FFPanel:=TFashionPanel.Create(Self);
FFPanel.Parent:=Self;
FFPanel.Top:=8;
FFPanel.Left:=272;
FFPanel.Height:=433;
FFPanel.Width:=129;
FFPanel.Title:='地址字串表';
fbleft:=16;
fbtop:=29;
for i := 1 to 36 do
begin
FB[i] := TsuiButton.Create(Self);
FB[i].Parent := FFPanel; // 要設 Parent, 不然不會顯示
FB[i].Font.Size := 10;
FB[i].Caption:=copy(AddrStr,2*i-1,2);
FB[i].Width := 30;
FB[i].Height := 30;
FB[i].Top :=fbtop;
FB[i].Left:=fbleft;
FB[i].OnClick:=fbclick;
fbtop:=fbtop+29;
if Trunc(i div 12)*12=i then
begin
fbleft:=fbleft+29;
fbtop:=29;
end;
end;
//--------------------------------
FBtn_expand:=TsuiButton.Create(Self);
FBtn_expand.Parent:=Self;
FBtn_expand.Caption:='展開';
FBtn_expand.Left:=408;
FBtn_expand.Height:=27;
FBtn_expand.Width:=57;
FBtn_expand.Top:=303;
FBtn_expand.OnClick:=FBtn_expandClick;
//------------------------------------
FBtn_close:=TsuiButton.Create(Self);
FBtn_close.Parent:=Self;
FBtn_close.Caption:='收起';
FBtn_close.Left:=408;
FBtn_close.Height:=27;
FBtn_close.Width:=57;
FBtn_close.Top:=343;
FBtn_close.OnClick:=FBtn_closeClick;
//------------------------------------
FBtn_getaddr:=TsuiButton.Create(Self);
FBtn_getaddr.Parent:=Self;
FBtn_getaddr.Caption:='取出';
FBtn_getaddr.Left:=408;
FBtn_getaddr.Height:=27;
FBtn_getaddr.Width:=57;
FBtn_getaddr.Top:=400;
FBtn_getaddr.OnClick:=FBtn_getaddrClick;
//------------------------------------
qry1:=TADOQuery.Create(Self);
end; destructor TAddrPanel1.Destroy;
begin
FTreeview:=nil;
FTreeview.Free;
FFPanel:=nil;
FFPanel.Free;
FBtn_expand:=nil;
FBtn_expand.Free;
FBtn_close:=nil;
FBtn_close.Free;
FBtn_getaddr:=nil;
FBtn_getaddr.Free;
FConnection:=nil;
FConnection.Free;
Edit1:=nil;
Edit1.Free;
inherited;
end; procedure TAddrPanel1.FTreeViewClick(Sender: TObject);
begin
if FTreeView.Selected.Level=0 then
Edit1.Text:=FTreeView.Selected.Text
else
if FTreeView.Selected.Level=1 then
Edit1.Text:=FTreeView.Selected.Parent.Text+FTreeView.Selected.Text
else
Edit1.Text:=(FTreeView.Selected.Parent).Parent.Text+FTreeView.Selected.Parent.Text+FTreeView.Selected.Text;
end; procedure TAddrPanel1.FBtn_closeClick(Sender: TObject);
begin
FTreeView.FullCollapse;
end; procedure TAddrPanel1.FBtn_expandClick(Sender: TObject);
begin
FTreeView.FullExpand;
end; procedure TAddrPanel1.SetAddrString(const Value: String);
begin
FAddrString:=Value;
end; procedure TAddrPanel1.FBtn_getaddrClick(Sender: TObject);
begin
FAddrString:=Edit1.Text;
ShowMessage(FAddrString);
end; procedure TAddrPanel1.FBClick(Sender: TObject);
begin
Edit1.Text:=Edit1.Text+TsuiButton(Sender).Caption;
end; procedure TAddrPanel1.SetConnection(const Value: TADOConnection);
begin
if Value<>nil then
Value.FreeNotification(self);
FConnection:=Value;
qry1.Connection:=Value;
end; procedure TAddrPanel1.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FConnection) and (Operation = opremove) then
FConnection := nil;
end; procedure TAddrPanel1.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
if AParent <> nil then
AParent.SetBounds(126,192,483,530);
end; procedure TAddrPanel1.Loaded;
var
lvl1,lvl2:string;
St, En : TDateTime ;
Nod1,Nod2: TTreeNode;
begin
inherited;
qry1.SQL.Clear;
qry1.SQL.Add('select a.縣市名稱,b.鄉鎮名稱,d.路段名稱 ');
qry1.SQL.Add('from (select * from 縣市資料 a,鄉鎮資料 b where a.縣市編號=b.縣市編號) c,路段資料 d ');
qry1.SQL.Add('where c.鄉鎮名稱=d.鄉鎮編號 order by a.縣市編號,b.鄉鎮編號,d.路段編號');
qry1.Open;
lvl1:='';
lvl2:='';
FTreeView.Items.BeginUpdate;
st:=now;
With Qry1 Do
Begin
Nod1 :=nil;
Nod2 :=Nil;
while not Eof do
begin
if FieldByName('縣市名稱').AsString<>lvl1 then
begin
lvl1:=FieldByName('縣市名稱').AsString;
nod1:=FTreeView.Items.AddChild(nil,lvl1);
lvl2:=FieldByName('鄉鎮名稱').AsString;
nod2:=FTreeView.Items.AddChild(nod1,lvl2);
FTreeView.Items.AddChild(nod2,FieldByName('路段名稱').AsString);
end
else
if FieldByName('鄉鎮名稱').AsString=lvl2 then
FTreeView.Items.AddChild(nod2,FieldByName('路段名稱').AsString)
else
begin
lvl2:=FieldByName('鄉鎮名稱').AsString;
nod2:=FTreeView.Items.AddChild(nod1,lvl2);
FTreeView.Items.AddChild(nod2,FieldByName('路段名稱').AsString);
end;
Next;
end;
end;
en:=now;
showmessage(FormatDateTime('hh:mm:ss.zz', En - St));
FTreeView.Items.EndUpdate;
end; initialization
RegisterClass(TTreeView); end. 發表人 - ucdesign2 於 2004/09/13 09:20:23
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
hi,ucdesign2: 這個部分我沒有用這種方式做過,所以也無法給你很明確的答案.只能提供幾個想法給你: 1.按照你的說法,在TForm上更新時速度很快,但在你的物件上更新很慢.我猜想大概是TreeView.Items.BeginUpdate等方法只能針對Parent或Owner為TForm的才有效.所以,試著把在TForm上的BeginUpdate沒EndUpdate拿掉,看是變得跟你自製的元件一樣慢,或者把元件改成從TForm繼承下來,其餘都不變,看看速度有沒有變快 2.對於像這樣的功能,我很少做成自製元件,放到元件盤上.尤其是這個部分還連著後端資料庫,我不是指TADOConnect這個元件,而是顯示的內容與後端資料庫的欄位有很大的相依性,一但Rule改了,欄位變了,這個元件也就必需跟著變.但因為已包裝到元件盤上了,所以在修改及版本控制上不見的來的方便.
其實換個角度想,你直接在TForm上佈置元件(就是你post上來的圖),這個Form就已經是另外一個元件了.建議你倒不如把TAddrPanel上Public的功能直接移到那個Form上就好了.這樣往後修改及版本控管也來的方便.
我的做法,您可以參考這裡
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=54788
|
ucdesign2
一般會員 發表:24 回覆:33 積分:11 註冊:2002-10-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |