OnMouseDown和OnMouseUp只能成对使用吗?

时间:2014-02-03 06:39:10

标签: android delphi delphi-xe5 onmousedown onmouseup

我的应用程序有很多TRectangle充当键盘的键。单击一个时,您会听到声音。这是通过处理OnMouseDown和OnMouseUp事件来完成的。 OnMouseDown:发送声音和OnMouseUp:关闭它。一切都很好,除了一件事。

在Android上我可以用几根手指按几个键。处理完一个OnMouseDown后,在处理OnMouseUp事件之前,不会处理任何其他OnMouseDown事件。它不一定是阻止其他OnMouseDown的密钥的OnMouseUp,它可能是任何OnMouseUp事件。示例代码:

procedure TKeyBoard.note_down (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
   key: TKey;
begin
   key := Sender as TKey;
   logd ('Entering OnMouseDown event handler: %d', [key.Note]);
   PutShort ($90, key.Note, 127);
   logd ('Exiting OnMouseDown event handler: %d', [key.Note]);
end; // note_down //

procedure TKeyBoard.note_up (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
   key: TKey;
begin
   key := Sender as TKey;
   logd ('Entering OnMouseUp event handler: %d', [key.Note]);
   PutShort ($80, Key.Note, 127);
   logd ('Exiting OnMouseUp event handler: %d', [key.Note]);
end; // note_up //
...
Rectangle [i].OnMouseDown := note_down;
Rectangle [i].OnMouseUp   := note_up;

根据调试代码立即输入和退出note_down和note_up例程。是否正确地假设在处理OnMouseDown时,在处理OnMouseUp之前,不能处理OnMouseDown?如果是,是否有解决方法?

2 个答案:

答案 0 :(得分:2)

给OnMouseEnter一个移动镜头。我正在研究一个有很多矩形的项目,在我的代码中我有

{$ifdef MSWINDOWS}
lRect.OnClick := ClickEvent;
{$else}
lRect.OnMouseEnter := ClickEvent;
{$endif}

这允许我做的是将手指拖过矩形网格,并让我为我传递的每个矩形调用我的ClickEvent。

答案 1 :(得分:1)

根据逻辑,MouseDown事件必须跟随(配对)事件MouseUp。这是鼠标物理操作的方式。

按下鼠标按钮(表示它变为“向下”)。在释放并返回“向上”状态之前,不能再次按下它。 (没有“鼠标部分向下”,“鼠标稍微向下”,“鼠标向下甚至更多”状态;鼠标按钮被按下(“向下”)或未按下(“向上”) )。

唯一合理的进展是MouseDown,然后是相应的(配对)MouseUp。两个消息的Sender可能不是同一个控件 - 鼠标可以按下一个控件,按钮保持按下时移动,然后通过不同的控件释放(甚至在应用程序本身之外) - 但是顺序必须按顺序“向下,然后向上”。

这是一种快速展示行为和逻辑的方法。

  1. 创建一个新的VCL表单应用程序(或FMX应用程序 - 将TShape替换为TMemo或任何其他具有OnMouseDownOnMouseUp事件的控件在以下步骤中<) / LI>
  2. 在表单左侧放置TShape
  3. TLabel放在TShape
  4. 的右侧

    单击TShape,切换到对象检查器中的“事件”选项卡,并为Shape1.OnMouseDownShape1.OnMouseUp事件添加以下事件处理程序:

    procedure TForm1.Shape1MouseDown(Sender: TObject);
    begin
      Label1.Caption := 'Mouse down';
      Label1.Update;
    end;
    
    procedure TForm1.Shape1MouseUp(Sender: TObject);
    begin
      Label1.Caption := 'Mouse up';
      Label1.Update;
    end;
    

    运行该应用。将鼠标悬停在Shape1上,然后按按钮。注意标签的文本,显示“鼠标按下”。释放它,标签的标题变为“鼠标向上”。

    尝试在形状上按鼠标按钮将标签的标题设置为“鼠标按下”,然后将鼠标移动到不同位置并释放按钮,每次释放按钮时都会看到标签更改为“鼠标向上”无论鼠标指针的位置如何。