Delphi 如何防止用户过于频繁地单击按钮?

Delphi 如何防止用户过于频繁地单击按钮?,delphi,Delphi,在按钮单击事件中,我向服务器发送命令。我不希望服务器上充斥着请求,因此我希望防止用户过于频繁地单击按钮 我考虑过计算按钮被点击的次数,如下所示: button.tag := button.tag + 1; if button.Tag = 5 then exit; 但这不会有帮助,因为每次我需要检测快速点击时,我都必须将标签设置为0,这也不会有帮助,因为它会每5次点击检测一次标签号,而我只需要知道按钮是否被重复点击 如何在不使用按钮标签的情况下检测快速按钮单击?如果要限制从客户端向服务器发送

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

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

button.tag := button.tag + 1;
if button.Tag = 5 then
  exit;
但这不会有帮助,因为每次我需要检测快速点击时,我都必须将标签设置为0,这也不会有帮助,因为它会每5次点击检测一次标签号,而我只需要知道按钮是否被重复点击


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

如果要限制从客户端向服务器发送命令的频率,请在每次单击后短时间禁用按钮。这将向用户反馈正在处理的内容。我假设服务器在准备就绪时无法提供反馈

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;

注意:如果您试图在服务器上进行一些负载平衡,那么客户端必须知道如何限制调用。但这完全是一种倒退的方式,服务器应该能够在不限制客户端的情况下处理此问题

您已经正确认识到,仅仅计算点击次数是不够的。你也需要说明时间。所以使用定时器

单击按钮时,禁用该按钮并启用计时器。计时器启动时,重新启用按钮

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
属性设置为希望按钮保持禁用状态的毫秒数


在这种情况下,不需要计算点击次数,因为隐式限制是每个计时器间隔点击一次。

您可以在标记中添加某种时间戳,然后检查是否经过了足够的时间

更好的是,派生您自己的类(t不按MetoofAstButton;-),您可以做任何您想做的事情,例如:

  • 跟踪上次单击后经过的时间以及用户尝试的“快速单击”次数

  • 您可以使按钮包含计时器组件,而不将此实现细节泄漏到表单中


与使用.Tag或global/form变量相比,任何方法都更简洁…

有很多方法可以做到这一点。用定时器短时间禁用按钮是否足够?您的意思是在程序完成时,我启用按钮?是的,这是一种正常的方式。否则禁用按钮,启动计时器,当计时器启动时,启用按钮。这完全取决于您想要完成的任务。iam使用按钮将命令从客户端发送到服务器我希望在重复单击发送命令的同时防止洪水。发送命令的速度非常快。那么,如果有100个用户呢?您接受了一个建议使用基于计时器的块的答案。你如何选择时间间隔?如果有1000个用户呢?你需要等多久?如果有100个用户,并且每个用户同时点击怎么办?你问问题的方式可能会给出答案,但在回答问题时,却无法帮助你很好地解决问题。这就是当您提前决定解决方案时发生的情况。你应该提出问题,而不是解决方案。如果有代码来描述,它会更有帮助。