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

Как сделать чтобы форму нельзя было активировать?


des80

Вопрос

У меня есть форма AlwaysOnTop, я пытаюсь сделать чтобы она не активировалась, не забирала фокус у другой формы при клике на нее, а просто висела поверх всех окон. Процедура Activate у ее предка TCommonCustomForm не виртуальная, поэтому я не могу ее переопределить. Я пробовал через helper

  TVideoFormHelper = class helper for TCommonCustomForm
  public
    procedure Activate;
  end;

procedure TVideoFormHelper.Activate;
begin
   showmessage('123');
end;

Но все равно почему то не срабатывает. Сообщение 123 не показывается, а вызывается обычный Activate класса. Что я делаю не так в хелпере? Есть ли какой то другой способ? И если все таки можно через хелпер то как мне сделать чтобы функция ничего не делала только если класс TVideoForm, а в остальных случаях работала как обычно

if self is TVideoForm then 

exit

else

// тут вызываем нормальный activate класса TCommonCustomForm

 

 

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

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

  • 0

Вы не можете через хелпер переопределить процедуры родителей. Хелперы лишь расширяют функционал, насколько я знаю.
Чтобы переопределить поведение класса, нужно наследовать от него дочерний класс и уже в нем переопределять.

Я не знаю, можно ли переопределить конкретно процедуру Activate, на вскидку есть еще два решения:

-не труъ: при OnClick на дочернюю форму, программно возвращать фокус нужной форме.
-чуть более труъ: прописать стили формы, при которых она не реагирует на щелчки мыши, т.е. становится "прозрачной" для мыши. Это работает только на VCL приложениях (насколько я знаю)

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

OnClick не вариант, потому что на событии OnDeactivate основной формы происходят некоторые вещи, которые не должны происходить при клике конкретно на эту форму.

У меня именно FMX форма. На VCL я бы просто переопределил процедуру которая отлавливает события и при WM_ACTIVATE поставил заглушку, а в FMX я так сделать не могу

Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, des80 сказал:

OnClick не вариант, потому что на событии OnDeactivate основной формы происходят некоторые вещи, которые не должны происходить при клике конкретно на эту форму.

У меня именно FMX форма. На VCL я бы просто переопределил процедуру которая отлавливает события и при WM_ACTIVATE поставил заглушку, а в FMX я так сделать не могу

кто вам мешает это сделать на фмх?

 

Ссылка на комментарий
  • 0
4 часа назад, Barbanel сказал:

А можно подробнее? Что именно имеется в виду?

ну если я правильно понял задача разместить неактивируемый контент поверх какого-то фрейма или формы.

ну создаем фрейм вешаем на него все что надо и всем HitTest := False

Ссылка на комментарий
  • 0
15 часов назад, FREEFAR сказал:

а почему вариант с Frame не рассмотреть?

потому что у меня с видеорегистратора воспроизводится поток видео на форме. Мне нужно чтобы объект имел handle окна, а фрейм handle не имеет

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

потому что у меня с видеорегистратора воспроизводится поток видео на форме. Мне нужно чтобы объект имел handle окна, а фрейм handle не имеет

Это под виндовс или мобильные?
Код воспроизведения в студию!

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

виндовс, видео воспроизводится через dll регистратора. Я там дергаю 3-4 функции из этой dll, в функцию Play мне нужно передать handle окна, чтобы на него воспроизводилось видео

Ссылка на комментарий
  • 0
1 минуту назад, Barbanel сказал:

Именно это окно с видео и есть в данный момент второстепенное? То, на которое не нужно реагировать.

да,  я могу воспроизводить видео только на форме, потому что все остальное в fmx хэндлов не имеет то эта форма у меня висит alwaysontop. Чтобы она не перекрывала окна других приложений, которые могут быть открыты на компе эта форма просто пропадает когда главная форма деактивируется. Поэтому мне нежелетаельно, чтобы она активировалась при клике, потому что срабатывает Deactivate у главного окна и она пропадает. Если сделать через OnClick и возвращать фокус, то будет мерцание некрасивое, ну и другие причины есть, которые долго расписывать.

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

Посмотрите пример, о таком поведении я говорил в самом начале.

В нем есть две формы, главная и второстепенная. На второстепенной я для наглядности отображаю гиф (по рецепту нашего китайского коллеги, да)))
В главной форме я динамически создаю второстепенную и отключаю в ней реакцию на мышь, при этом гиф продолжает нормально крутиться во второй форме.
Вы должны сами заботиться о координатах и видимости второстепенной формы.

процедура SetMouse_Unsenitive - отключает реакцию на мышь,
процедура SetMouse_Senitive- включает обратно реакцию на мышь.

TransparentWindow.zip

Ссылка на комментарий
  • 0
51 минуту назад, Barbanel сказал:

Посмотрите пример, о таком поведении я говорил в самом начале.

В нем есть две формы, главная и второстепенная. На второстепенной я для наглядности отображаю гиф (по рецепту нашего китайского коллеги, да)))
В главной форме я динамически создаю второстепенную и отключаю в ней реакцию на мышь, при этом гиф продолжает нормально крутиться во второй форме.
Вы должны сами заботиться о координатах и видимости второстепенной формы.

процедура SetMouse_Unsenitive - отключает реакцию на мышь,
процедура SetMouse_Senitive- включает обратно реакцию на мышь.

TransparentWindow.zip

Спасибо большое! Это именно то что нужно, а я уже тут начал менять стандартный модуль FMX.Platform.Win, но ваш способ проще и красивей

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

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

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

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

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

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

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

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

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

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

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