如何防止用户经常点击按钮?

时间:2014-11-05 20:43:10

标签: delphi

在按钮单击事件中,我正在向服务器发送命令。我不希望服务器充斥着请求,因此我想阻止用户过于频繁地点击该按钮。

我已经考虑过计算点击按钮的次数,如下所示:

button.tag := button.tag + 1;
if button.Tag = 5 then
  exit;

但是这没有用,因为每次我需要检测快速点击时我必须将标记设置为0,这也无济于事,因为它会每5次点击检测到标记号,而我只需要知道如果重复点击按钮。

如何在不使用按钮标签的情况下检测快速按钮点击?

3 个答案:

答案 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或全局/表单变量更清晰......