Перейти к содержанию
Fire Monkey от А до Я
  • 0

OnButtonClick vs OnItemClick


Вопрос

  • Модераторы

Здравствуйте!

 

Вопрос в следующем:

Почему при клике на TextButton вызывается OnItemClick?

Как запретить вызов OnItemClick?

Ссылка на комментарий

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

  • 0
  • Модераторы

в итоге получилось так

 

ContentView - TListView

procedure TForm1.ContentViewItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF;
const ItemObject: TListItemObject);
var
  pMy: TPoint;
  pItem: TRect;
begin
  // вычисляем прямоугольник, где распологается кнопка
  pItem.Left := trunc(ContentView.Width - ContentView.ItemAppearanceObjects.ItemObjects.Accessory.WidthWhenVisible -
    ContentView.ItemAppearanceObjects.ItemObjects.TextButton.WidthWhenVisible) - 12;
  pItem.Right := pItem.Left + trunc(ContentView.ItemAppearanceObjects.ItemObjects.TextButton.WidthWhenVisible);
  pItem.Top := trunc((ContentView.ItemAppearance.ItemHeight / 2) -
    (ContentView.ItemAppearanceObjects.ItemObjects.TextButton.HeightWhenVisible / 2));
  pItem.Bottom := pItem.Top + trunc(ContentView.ItemAppearanceObjects.ItemObjects.TextButton.HeightWhenVisible);

{  смотрим куда тыкаем
  ShowMessage('click : ' + LocalClickPos.X.ToString + '  ' + LocalClickPos.Y.ToString + #13#10 + 'client: ' +
    ContentView.Width.ToString + #13#10 + pItem.Left.ToString + '  ' + pItem.Top.ToString + #13#10 + pItem.Right.ToString + '  ' +
    pItem.Bottom.ToString + #13#10); }

  pMy.X := trunc(LocalClickPos.X);
  pMy.Y := trunc(LocalClickPos.Y);

  if PtInRect(pItem, pMy) then
  begin
    ShowMessage('Нажалось))');
  end else
 begin
   // нажатие на Item, выполняем код тут, не в OnItemClick
 end;
end;

стиль вот такой используется

post-59-0-64016300-1438265545.png

Ссылка на комментарий
  • 0

Налетел на те-же грабли. Разные процедуры для OnItemClick и OnButtonClick

С OnItemClick никаких проблем, а при клике по кнопке (OnButtonClick) сначала срабатывает OnItemClick а уже затем кнопка.

Неужели нет никакого способа развести эти процедуры, кроме как высчитывать попадание пальца (мышки) в Rect кнопки?

Ссылка на комментарий
  • 2
33 минуты назад, walexw сказал:

Налетел на те-же грабли. Разные процедуры для OnItemClick и OnButtonClick

С OnItemClick никаких проблем, а при клике по кнопке (OnButtonClick) сначала срабатывает OnItemClick а уже затем кнопка.

Неужели нет никакого способа развести эти процедуры, кроме как высчитывать попадание пальца (мышки) в Rect кнопки?

procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: integer; const [Ref] LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
begin
  if ItemObject is TListItemTextButton then
  begin
   //Bla Bla Bla вообщем сюда перенесите OnButtonClick .
  end;

//Next Bla Bla Bla
end;

Ссылка на комментарий
  • 0

У меня вот так работает

procedure TFVisit.ListView1ButtonClick(const Sender: TObject;
  const AItem: TListItem; const AObject: TListItemSimpleControl);
begin
  if AObject.ClassName = 'TListItemTextButton' then
    begin
      ........
    end;
end;

 

Изменено пользователем beklexx
Ссылка на комментарий
  • 0
  • Модераторы
1 минуту назад, beklexx сказал:

слушайте, а как вставить в сообщение код на паскале ?

как понять?

Ссылка на комментарий
  • 0

Приложение десктопное или мобильное? Если мобильное, то все ок работает.

кидаешь на форму ListView1

задаешь ему свойства ItemAppearance=ImageListItemBottomDetailRightButton

В событиях выбираешь ListView1ButtonClick и туда пишешь код.

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

Цитата

procedure TForm1.ListView1ButtonClick(const Sender: TObject;
  const AItem: TListItem; const AObject: TListItemSimpleControl);
begin
ShowMessage('Нажатие по кнопке');
end;

procedure TForm1.ListView1Change(Sender: TObject);
begin
ShowMessage('Нажатие по элементу');
end;

 

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0

Delphi 10.1 Upd2, приложение на FM для Win32 под сенсорный экран планшета. Пишу код в OnButtonClick, код вызывается. Если создаю реакцию на события OnItemClick или OnChange, то код OnButtonClick перестает срабатывать при клике на кнопке. Если вместо них реагирую на OnItemClickEx, то выполняются и оба обработчика. Пл совету выше в OnItemClickEx придется писать так:

if not (ItemObject is TListItemTextButton) then
begin
  // реакция на клик по элементу вне кнопки
  ...
end;

Это перекрытие обработчиков событий баг или фича FM? :)

Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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