2

私のアプリケーションには、キーボードのキーとして機能する多くの TRectangle があります。クリックすると音が鳴ります。これは、OnMouseDown および OnMouseUp イベントを処理することによって行われます。OnMouseDown: サウンドを送信し、OnMouseUp: スイッチをオフにします。1つのことを除いて、すべて正常に動作します。

Android では、複数の指を使って複数のキーを押すことができます。1 つの 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

1

論理的には、イベントのMouseDown後にイベントが続く (ペアになる) 必要がありMouseUpます。これは、マウスが物理的に動作する方法です。

マウス ボタンが押された (「下」になったことを意味します)。離して「アップ」状態に戻るまで、再度押すことはできません。(「マウスを部分的に下げた」、「マウスを少し下げた」、「もう少しマウスを下げた」状態というものはなく、マウス ボタンが押されている (「下」) か、押されていない (「上」) )。

唯一の合理的な進行のMouseDown後に、対応する (対になった)が続きMouseUpます。両方のメッセージのSenderfor は同じコントロールではない可能性があります - マウスは 1 つのコントロール上で押され、ボタンが押されたまま移動し、別のコントロール上で (またはアプリケーション自体の外部でさえも) 解放される可能性がありますが、シーケンスは「ダウン」でなければなりません。 、次に上」の順で。

その動作とロジックを示す簡単な方法を次に示します。

  1. 新しい VCL フォーム アプリケーション (または FMX アプリケーション -以下の手順では、またはその他のコントロールをTShapeandイベントに置き換えます) を作成します。TMemoOnMouseDownOnMouseUp
  2. TShapeフォームの左側にa をドロップします。
  3. TLabelその右側にa をドロップしますTShape

をクリックし、[TShapeオブジェクト インスペクタ] の [イベント] タブに切り替えて、Shape1.OnMouseDownおよびShape1.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ボタンを押します。「Mouse down」と表示されているラベルのテキストに注意してください。離すと、ラベルのキャプションが「マウスアップ」に変わります。

図形の上でマウス ボタンを押して、ラベルのキャプションを「マウス ダウン」に設定してから、マウスをさまざまな場所に移動してボタンを離し、ボタンを離すたびにラベルが「マウス アップ」に変化するのを確認します。マウスポインタの位置。

于 2014-02-05T23:36:17.923 に答える