2

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

添加一个TApplicationEvents并实现OnMessage设置HandledWM_LBUTTONDBLCLKon TButtonto True

像这样的东西:

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;

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

4

1 回答 1

4

为避免在 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 事件的 de 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;
于 2013-05-01T13:13:25.423 回答