我们在应用程序中遇到问题,用户双击几乎所有内容(包括按钮)。在某些情况下,这会导致用户不希望出现的情况,因为它会触发按钮上的 OnClick 事件两次。有人提出了一个想法来防止整个应用程序出现这种情况,我想知道使用它是否存在任何陷阱。
添加TApplicationEvents
并实现OnMessage
设置Handled
对于 WM_LBUTTONDBLCLK
上TButton
至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;
一个明显的缺点是,如果您遇到用户实际上想要匆忙单击同一按钮的情况。在此特定应用中是否存在这种情况还有待调查。
最佳答案
为了避免这种情况,请在 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/