在按钮单击事件中,我正在向服务器发送命令。我不希望服务器充斥着请求,因此我想阻止用户过于频繁地点击该按钮。
我已经考虑过计算点击按钮的次数,如下所示:
button.tag := button.tag + 1;
if button.Tag = 5 then
exit;
但是这没有用,因为每次我需要检测快速点击时我必须将标记设置为0,这也无济于事,因为它会每5次点击检测到标记号,而我只需要知道如果重复点击按钮。
如何在不使用按钮标签的情况下检测快速按钮点击?
答案 0 :(得分:4)
如果要限制从客户端向服务器发送命令的频率,请在每次单击后短时间禁用该按钮。这将为用户提供正在处理的反馈。我假设服务器在准备就绪时无法提供反馈。
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := false;
Timer1.Interval := 500; // Pick a suitable interval
Timer1.Enabled := true;
SendCommand(); // Make call to server
end;
procedure TForm1.Timer1Timer(Sender: TObject);
// Timer1 is disabled at startup
begin
Button1.Enabled := true;
Timer1.Enabled := false;
end;
注意:如果您尝试在服务器上进行一些负载平衡,则必须有一种方法让客户端知道如何限制呼叫。但这完全是一种倒退的方式,服务器应该能够处理这个,而不受客户端的任何限制。
答案 1 :(得分:2)
您已经正确认识到仅仅计算点击次数就不够了。您还需要考虑时间。所以使用计时器。
单击该按钮时,禁用该按钮并启用计时器。当计时器触发时,重新启用该按钮。
procedure TExampleForm.SendButtonClick(Sender: TObject);
begin
Assert(SendButton = Sender);
SendButton.Enabled := False;
SendButtonTimer.Enabled := True;
SendCommandToServer(...);
end;
procedure TExampleForm.SendButtonTimerTimer(Sender: TObject);
begin
Assert(SendButtonTimer = Sender);
SendButtonTimer.Enabled := False;
SendButton.Enabled := True;
end;
将计时器的Interval
属性设置为您希望该按钮保持禁用状态的毫秒数。
无需计算此方案中的点击次数,因为隐式限制是每个计时器间隔一次点击。
答案 2 :(得分:2)
您可以在标签中加入某种时间戳,并检查是否已经过了足够的时间。
更好的是,派生出你自己的班级,(TDontPressMeTooFastButton ;-),你可以做任何你想做的事,即:
跟踪自上次点击以来经过的时间以及有多少"快速点击次数"用户尝试
您可以让按钮包含计时器组件,而不是将此实现细节泄露到表单中
几乎任何东西,比使用.Tag或全局/表单变量更清晰......