delphi - 防止双击 TButton

标签 delphi user-interface delphi-xe vcl

我们在应用程序中遇到问题,用户双击几乎所有内容(包括按钮)。在某些情况下,这会导致用户不希望出现的情况,因为它会触发按钮上的 OnClick 事件两次。有人提出了一个想法来防止整个应用程序出现这种情况,我想知道使用它是否存在任何陷阱。

添加TApplicationEvents并实现OnMessage设置Handled对于 WM_LBUTTONDBLCLKTButtonTrue .

类似这样的事情:

function GetWindowClassName(Handle: HWND): String;
var
  Buffer: array[0..255] of Char;
begin
  if GetClassName(Handle, @Buffer, 255) = 0 then
    RaiseLastOSError;
  Result := Buffer;
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  if Msg.message = WM_LBUTTONDBLCLK then
    Handled := (GetWindowClassName(msg.hwnd) = 'TButton');
end;

一个明显的缺点是,如果您遇到用户实际上想要匆忙单击同一按钮的情况。在此特定应用中是否存在这种情况还有待调查。

最佳答案

为了避免这种情况,请在 OnClickEvent 中使用常量:

 procedure TMyForm.Button1OnClick(sender:TObject);
 const
    {$J+}
    IsInside:Boolean=False;
    {$J-}
 begin
     if IsInSide then Exit;
     IsInside:=True;
     try
         do your code;
     finally
         IsInside:=False;
     end;
 end;

如果您有很多按钮,我建议对这些按钮使用 TActionList 并捕获 ActionList 事件的 OnActionExecute。未经测试,请参阅 TActionList 获取帮助。我以前用过它。

procedure TMyForm.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
const
    {$J+}
    IsInside:Boolean=False;
    {$J-}
begin
    if IsInSide then Exit;
    IsInside:=True;
    try
       ActionList1.ExecuteAction(Action);
    finally
       IsInside:=False;
    end;
end;

关于delphi - 防止双击 TButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16293618/

相关文章:

delphi - 如何在 Delphi 中生成 GUID 版本 1?

delphi - 为什么 Delphi 不清楚增加接口(interface)列表中最后一个元素的引用计数?

python - 如何仅在Python Tkinter中关闭TopLevel窗口?

java - 在 Java 中创建 GUI 时出现编译错误

delphi - 条件表达式在包内是否被破坏?

delphi - 自定义绘制 TAction 下拉菜单

delphi - 从本地客户端连接中检索带有路径的服务器数据的SQL SELECT

delphi - Windows 缩略图/框架 View

Java JFrame gui - 为什么按钮不显示?

带接口(interface)的观察者模式中的 delphi AV