OnMouseDown и OnMouseUp работают только как пара?

Мое приложение имеет много функций TRectangle в качестве клавиш клавиатуры. При нажатии вы слышите звук. Это делается путем обработки событий OnMouseDown и OnMouseUp. OnMouseDown: отправить звук, а OnMouseUp: отключить его. Все отлично работает, кроме одного.

На Android я могу использовать несколько пальцев, чтобы нажать несколько клавиш. Когда один OnMouseDown был обработан, никакие другие события OnMouseDown не будут обрабатываться, пока не будет обработано событие OnMouseUp. Это не должен быть OnMouseUp ключа, который заблокировал другой OnMouseDown, это может быть любое событие 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 никакие OnMouseDown не могут быть обработаны, пока OnMouseUp не будет обработан? Если так, есть ли обходной путь?

2 ответа

Решение

Дайте OnMouseEnter шанс для мобильных устройств. Я работаю над проектом с большим количеством прямоугольников и в моем коде у меня есть

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

Это позволяет мне перетаскивать палец по сетке прямоугольников и вызывать мой ClickEvent для каждого прямоугольника, который я передал.

По логике MouseDown событие должно сопровождаться (в паре) с MouseUp событие. Это способ, которым мышь работает физически.

Кнопка мыши нажата (что означает, что она становится "вниз"). На него нельзя нажать снова, пока он не будет отпущен и не вернется в состояние "вверх". (Не существует такой вещи, как "мышь частично опущена", "мышь чуть дальше вниз", "мышь опущена даже немного больше"); кнопка мыши либо нажата ("вниз"), либо не нажата ("вверх").).

Единственная разумная прогрессия MouseDown с последующим соответствующим (в паре) MouseUp, Sender для обоих сообщений может быть не один и тот же элемент управления - мышь можно нажимать на один элемент управления, перемещать ее, пока кнопка остается нажатой, а затем отпускать поверх другого элемента управления (или даже вне самого приложения) - но последовательность должна быть "нажата", затем вверх "в этом порядке.

Вот быстрый способ продемонстрировать это поведение и логику.

  1. Создайте новое приложение VCL Forms (или приложение FMX - замените TShape с TMemo или любой другой элемент управления с OnMouseDown а также OnMouseUp событие в следующих шагах)
  2. Оставьте TShape на левой стороне формы.
  3. Оставьте TLabel справа от этого 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", а затем с помощью перемещения мыши в разные места и отпускания кнопки, наблюдая, как метка меняется на "Mouse up" при каждом отпускании кнопки независимо от того, расположение указателя мыши.

Другие вопросы по тегам