Перейти к содержанию
  • Регистрация
  • 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
11 минут назад, FREEFAR сказал:

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

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

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


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

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

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

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

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


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

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
17 часов назад, Равиль Зарипов (ZuBy) сказал:

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

 

а как это сделать?

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


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

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

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

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


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

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

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


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

И никаких координат не передается?
Т.е. длл рисует кадр тупо на все окно?

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


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

 

Только что, Barbanel сказал:

И никаких координат не передается?
Т.е. длл рисует кадр тупо на все окно?

да, именно так

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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 пользователей онлайн

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

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