2

我的应用程序有很多 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 是否正确?如果是这样,是否有解决方法?

4

2 回答 2

2

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

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

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

于 2014-02-05T23:53:05.877 回答
1

从逻辑上讲,一个MouseDown事件必须跟随(配对)一个MouseUp事件。这是鼠标物理操作的方式。

按下鼠标按钮(这意味着它变为“向下”)。在释放并返回“向上”状态之前,它不能再次按下。(没有“鼠标部分向下”、“鼠标向下一点”、“鼠标向下一点”状态;鼠标按钮被按下(“向下”)或未按下(“向上” )。

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

这是演示该行为和逻辑的快速方法。

  1. 创建一个新的 VCL Forms 应用程序(或 FMX 应用程序 -在以下步骤中用和事件TShape替换TMemo或任何其他控件)OnMouseDownOnMouseUp
  2. 将 aTShape放在表单的左侧。
  3. TLabel在它的右边放一个TShape

单击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并按下按钮。注意标签的文本,它显示“鼠标按下”。释放它,标签的标题变为“鼠标上移”。

尝试在形状上按下鼠标按钮以将标签的标题设置为“鼠标按下”,然后将鼠标移动到各个位置并释放按钮,每次释放按钮时观察标签变为“鼠标向上”,而不管鼠标指针的位置。

于 2014-02-05T23:36:17.923 回答