Перейти к содержанию
  • Регистрация
  • 0
Шамсуддин

Не происходит событие отжатия кнопки мыши

Вопрос

Добрый день! Возникла, довольно-таки, интересная проблема. Если по нажатию на элемент listbox мышью, реализовать всплывающее окно типа ShowMessage, то событие отжатия кнопки на контроле, в котором мы нажали не произойдет. Это заметно, по тому, как после закрытия ShowMessage, навести на listbox, то он продолжит выбирать элемент, также как, если мы это сделали бы удержав кнопку мыши на нем и начали бы проводить курсором по ней. Можно ли как-нибудь исправить это?

Изменено пользователем Шамсуддин

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 1

Можно. Используйте события не OnClick или OnItemClick и т.д., а событие OnMouseUp у самого TListBox.

Типа так:

procedure TfmMain.lbxMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
  LI : TListBoxItem;
  p : TPointF;
begin
  if Assigned(Sender as TListBox) then
  begin
    LI := TListBox(Sender).ItemByPoint(X, Y);

    if Assigned(LI as TListBoxItem) then
    begin
      LI.IsSelected := True;

      TTask.Run(procedure
      begin
        if Button = TMouseButton.mbLeft then
          Do_какая-то_процедура(LI.Index) // просто пример
          else
          if Button = TMouseButton.mbRight then
            TThread.Synchronize(nil, procedure
            begin
              p := MessageEvent.GetMousePos;
              PopupMenu1.Popup(p.X, p.Y); // для вызова контекстного меню выделенного ListBoxItem
            end);
      end);
    end;
  end;
end;

P.S. Отмечу, что использовал TTask и TThread.Synchronize далеко не случайно!

Во-первых TTask.Run запустит ваш обработчик нажатия на выделенный элемент в отдельном потоке, что не будет "тормозить" "выделение" самого ListBoxItem и вообще), а во-вторых - "внутри" вызванного потока сделал синхронизацию с основным потоком, при выводе контекстного меню для ListBoxItem, так как это гарантирует корректную работу с GUI в FMX.

Изменено пользователем AlexG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
7 часов назад, AlexG сказал:

Во-первых TTask.Run запустит ваш обработчик нажатия на выделенный элемент в отдельном потоке

А переменная Button будет видна в этом отдельном потоке в случае завершения процедуры lbxMouseUp?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, GASCHE сказал:

А переменная Button будет видна в этом отдельном потоке в случае завершения процедуры lbxMouseUp?

Да

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...