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

Вторичное окно программы без передачи ему фокуса


AngryOwl

Вопрос

Требуется создать окно, не главное. Отобразить его, при этом не передавая ему фокус.
Popup-окно не предлагать.
Окно должно быть стандартным или иметь свойства:
BorderStyle = None
FormStyle = Normal
Transparent = True
Собственно значение этих параметров не имеет значения. Но не Popup, так как оно исчезает сразу же как только фокус получит любой элемент программы не в данном Popup-окне.

 

Пример:

 

Допустим есть главная форма, на которой расположен элемент TMemo. Фокус на TMemo и Вы печатаете текст. В какой-то момент времени появляется вторичная форма приложения на некоторое время, но фокус не должен отвалиться из TMemo!

 

Если это будет Popup-форма, то как только Вы попытаетесь изменить размер главной формы, либо переместить ее - Popup-форма сразу пропадает.

 

Если будет стандартная форма, то при ее появлении фокус сразу "уходит" из TMemo главной формы...

 

(Существует множество вариантов, когда нужно показать новую форму, при этом чтобы текущая форма или элемент на ней не теряли фокус)

P.S. В XE5 было возможно создавать не Popup-формы без передачи им фокуса, а в XE6 - нет...

 

P.P.S. Приложил в качестве примера проект. Надеюсь что понятно объяснил проблему (не мою, а FMX).

SecondaryForm.zip

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

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

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

а почему бы не использовать TLayout?

он фокус на себя не берет

SecondaryForm.zip

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

У попап формы было свойство отвечающее за то будет ли она закрываться при смене фокусе, перемещении родительского окна и тд или нет. Что-то вроде StayOpened.

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

Может я тормоз, но нигде не наблюдаю этого свойства у окна. И вообще нигде его не наблюдаю в исходниках...

(XE7-XE8)

 

З.Ы. повторюсь - если не ошибюсь, то в более старых версиях (XE4-5) нечто такое было, и оно работало. Сейчас такого нет.

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

 

Я решал аналогичную задачу таким способом:

procedure TForm2.FormActivate(Sender: TObject);
begin
  PFormStyle(@FormStyle)^ := TFormStyle.Popup;
end;

 

PFormStyle(@FormStyle)^ := TFormStyle.Popup;

 

Нельзя ли чуть подробнее? Что есть что?

Какой у Вас стиль формы Form2 в DesignMode?

 

З.Ы. Нужна форма со свойством StayOnTop, но в тоже время не получающая фокус, в момент когда она отображается (Show или Visible := True). Просто форма со свойством Popup не подходит, так как она исчезает при получении фокуса любой другой формой приложения.

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

Нельзя ли чуть подробнее?

 

 

Идея тут следующая (если требуется именно StayOnTop):

Форма создается как StayOnTop и прячется за пределы экрана.

Приведенный мною код меняет значение соответствующего поля формы, не вызывая при этом реакции на изменение значения св-ва (пересоздание формы как Popup и т.п.).

Т.е. форма остается StayOnTop, но когда дельфийский код принимает решение об ее активации и т.п. действиях, то он "видит" ее как Popup, т.к. FormStyle = Popup.

 

Тестовый проект прилагаю (проверял на Win7 x64):

NotActiveStayOnTopForm.zip

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

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

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

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

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

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

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

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

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

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

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