如果完成任何操作,如何设置变量(在Delphi中)?

时间:2011-07-27 04:50:50

标签: delphi

我需要以某种方式在Delphi 2009中实现这一点:

用户点击按钮2.如果用户的最后一个动作是点击按钮1,那么我想做一件事,但如果用户的最后一个动作是其他任何事情,我想做另一件事。

显然,我设置了一个布尔变量:UserClickedOnButton1并在单击按钮1时将其设置为true,然后在Button 2的OnButtonClick事件中测试该变量。

我的问题是,在点击按钮2之前,如果用户完成其他任何操作,我该如何将其设置为false。(例如,鼠标按下,按键,箭头键,切换到另一个程序或其他任何内容)。

......或者有一种更简单的方法可以做到这一点,我忽略了。

2 个答案:

答案 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;

说明:

  • CM_CANCELMODE可在任何地方处理鼠标点击而不会导致焦点变化,
  • WM_KEY *处理所有关键事件,但也切换到另一个应用程序(有一个WM_SYSKEYDOWN,否则WM_KILLFOCUS需要注意),
  • WM_KILLFOCUS处理其他所有事情。

答案 1 :(得分:2)

从我的想法;除非你愿意用逻辑跟踪所有(或至少所有可能不需要的)事件,否则这是不可能的。

按键(Tab?)仍然有效,可以转到下一个按钮并单击它;一个鼠标按下事件,如果它在第二个按钮上显然是好的,否则它不是。您可能想要在执行一大堆逻辑之前检查是否“单击了第一个按钮”以减慢应用程序中的每个按键/ mousedown / lostfocus事件。

一个想法可能是使用计时器,但这并不妨碍用户“快速”做其他事情。

Edt1:如果所有其他“非法”操作实际上都在做某事,那么第一个按钮上的lostfocus事件可能是一个开始?