我需要以某种方式在Delphi 2009中实现这一点:
用户点击按钮2.如果用户的最后一个动作是点击按钮1,那么我想做一件事,但如果用户的最后一个动作是其他任何事情,我想做另一件事。
显然,我设置了一个布尔变量:UserClickedOnButton1并在单击按钮1时将其设置为true,然后在Button 2的OnButtonClick事件中测试该变量。
我的问题是,在点击按钮2之前,如果用户完成其他任何操作,我该如何将其设置为false。(例如,鼠标按下,按键,箭头键,切换到另一个程序或其他任何内容)。
......或者有一种更简单的方法可以做到这一点,我忽略了。
答案 0 :(得分:10)
以下代码似乎有效(D7),但请根据您的具体情况进行检查。
type
TButton = class(StdCtrls.TButton)
private
FClickedLast: Boolean;
FNextButton: TButton;
protected
procedure WndProc(var Message: TMessage); override;
public
procedure Click; override;
property ClickedLast: Boolean read FClickedLast write FClickedLast;
property NextButton: TButton write FNextButton;
end;
TForm1 = class(TForm)
...
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.NextButton := Button2;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if Button1.ClickedLast then
Caption := Caption + ' +'
else
Caption := Caption + ' -';
Button1.ClickedLast := False;
end;
{ TButton }
procedure TButton.Click;
begin
inherited Click;
if (FNextButton <> nil) and Focused then
FClickedLast := True;
end;
procedure TButton.WndProc(var Message: TMessage);
begin
if (FNextButton <> nil) and not (csDestroying in ComponentState) then
case Message.Msg of
CM_CANCELMODE,
WM_KEYFIRST..WM_KEYLAST:
FClickedLast := False;
WM_KILLFOCUS:
if TWMKillFocus(Message).FocusedWnd <> FNextButton.Handle then
FClickedLast := False;
end;
inherited WndProc(Message);
end;
说明:
答案 1 :(得分:2)
从我的想法;除非你愿意用逻辑跟踪所有(或至少所有可能不需要的)事件,否则这是不可能的。
按键(Tab?)仍然有效,可以转到下一个按钮并单击它;一个鼠标按下事件,如果它在第二个按钮上显然是好的,否则它不是。您可能想要在执行一大堆逻辑之前检查是否“单击了第一个按钮”以减慢应用程序中的每个按键/ mousedown / lostfocus事件。
一个想法可能是使用计时器,但这并不妨碍用户“快速”做其他事情。
Edt1:如果所有其他“非法”操作实际上都在做某事,那么第一个按钮上的lostfocus事件可能是一个开始?