這個FilterRecord的寫法還有加速的可能嗎? |
尚未結案
|
Sanyuan
一般會員 ![]() ![]() 發表:24 回覆:32 積分:11 註冊:2002-06-23 發送簡訊給我 |
小弟的需求是將select後的query,使用filterrecord的event比對存在 a,b兩個欄位中的字串是否有使用者keyin的字串,使用者每keyin一個字元就filter一次 所以在 query 中的 FilterRecord 裡寫了下面的程式
----------------------------------------------------
procedure TFormB.HintQFilterRecord(DataSet: TDataSet; var Accept: Boolean);
Var QStr:String;
begin
QStr:= UpperCase(Query.FieldByName('A').asString Query.FieldByName('B').asString);
Accept:=Pos(UpperCase(Trim(Grid1.Cells[Grid1.Col,Grid1.Row])),QStr)>0 ;
end;
-------------------------------------------------------------
這程式在P4的機器上跑沒問題,完全不會delay,但在PIII上跑.
每keyin一個字元,就要等一秒鐘,推測是資料量(大概一兩千筆)與CPU速度的問題
請問各位是否有更有效率的解決方式
|
Justmade
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
你可試用個 TTimer Interval 設 500 (半秒,或你喜歡的值)
onTimer 時 SetFilter 在 Edit 的 onChange :
Timer1.Enabled := false;
Timer1.Enabled := true; 重新計時 這樣做若使用者 Key 一串字時中間不會浪費時間 filter 記錄,只有最後一宇元停半秒後才 filter 對只輸入一個字元或輸入很慢每一下超過半秒的人來說,這樣做會更慢(因多等半秒) 但對一般人輸入一串字來說這會加快速度 若半秒太多也可減少數字
|
Mickey
版主 ![]() ![]() ![]() ![]() ![]() 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
1. 拿來過濾的 DataSet 改用 ClientDataSet DataSet -> DataSetProvider -> ClientDataSet (但記憶體需求會變大). 2. 盡量減少不必要的 function 使用, 如 Trim. 3. 用 不分大小寫的字串比對 Function 如 AnsiContainsText(const AText, ASubText: string): Boolean;發表人 - Mickey 於 2003/06/12 21:17:30 |
Sanyuan
一般會員 ![]() ![]() 發表:24 回覆:32 積分:11 註冊:2002-06-23 發送簡訊給我 |
|
Mickey
版主 ![]() ![]() ![]() ![]() ![]() 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |