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

執行效率的問題!

尚未結案
ucdesign2
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-11 11:51:23 IP:211.23.xxx.xxx 未訂閱
請教前輩: 在下把經過排序的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-11 15:54:43 IP:218.169.xxx.xxx 未訂閱
請問您加入自製元件中是如何寫法?可以把程式post上來看看嗎?
ucdesign2
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-13 08:58:52 IP:211.23.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-13 17:17:01 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-14 09:16:40 IP:211.23.xxx.xxx 未訂閱
謝謝change.jian版主費心詳盡的解說! 讓我了解可以從不同的角度來看問題, 從其中找到一個最適合的解決之道! 您說的方法我會去試試看,感謝!!
系統時間:2024-11-23 4:09:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!