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