我有一个搜索字段,用户搜索每个输入的字符.所以没有搜索按钮.问题是搜索速度很慢.我的想法是在每个键输入一点后延迟搜索,所以如果用户快速输入搜索字符串,则允许不搜索.然后执行搜索.我的代码到目前为止.
procedure TAgreementModuleForm.SetIsSearching(const Value: Boolean);
begin
fIsSearching := Value;
tmrDelayKey.Enabled := Value;
end;
procedure TAgreementModuleForm.tmrDelayKeyTimer(Sender: TObject);
begin
IsSearching := True;
end;
procedure TAgreementModuleForm.txtSearchAgreementCustomerExit(Sender: TObject);
begin
IsSearching := False;
end;
procedure TAgreementModuleForm.txtSearchAgreementCustomerKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
vSearchExpression: string;
begin
if IsSearching then
begin
vSearchExpression := Trim(txtSearchAgreementCustomer.Text);
IsSearching := False;
if vSearchExpression <> '' then
DoSearch(vSearchExpression);
end
else
tmrDelayKey.Enabled := True;
end;
Run Code Online (Sandbox Code Playgroud)
tmrDelayKey是一个延迟为1000毫秒的TTimer.IsSearching是一个布尔属性.
这不是工作代码,因为用户停止编写搜索.如何改进?
根本问题是您的搜索是同步的并且阻止了UI.添加延迟并没有多大帮助.用户获取反馈需要更长的时间.
您需要做的是异步执行搜索.比如把它放在另一个线程中.搜索完成后,发出主线程信号,以便显示结果.如果用户在搜索完成之前键入,则应使用更新的搜索词重新开始搜索.
此方法为您提供响应式UI,并尽快提供搜索结果.
注意:我假设您没有理由避免重复搜索.如果搜索成本很高,那么您绝对不希望在键入时实施搜索.
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |