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

Всплывающее сообщение при его закрытии разворачивает приложение


striker

Вопрос

Всем привет!
Delphi XE6 FMX
Есть приложение, главная форма на весь экран.
Пользователь сворачивает его.
Появляется всплывающее сообщение по таймеру - маленькая форма (Form1.Show).
Проблема:
При свернутом приложении когда появляется сообщение, закрываешь эту маленькую форму и разворачивается главное окно программы, а нужно просто закрыть уведомление и дальше работать с другими программами.

Как можно решить? Спасибо!

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

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

  • 0

Как понял вопрос не в закрытии всплывающего окна, а в том что показывается основное окно.

Каким образом у вас вообще показывается всплывающее окно если приложение свернуто (минимизировано) ?

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

...

SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);

Form1.Show;

...

 

 

Ссылка на комментарий
  • 0
В 28.01.2019 в 10:20, striker сказал:

Проблема:
При свернутом приложении когда появляется сообщение, закрываешь эту маленькую форму и разворачивается главное окно программы, а нужно просто закрыть уведомление и дальше работать с другими программами.
Как можно решить? Спасибо!

Используйте механизм уведомлений, которые всплывают внизу, в трее.

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

Используйте механизм уведомлений, которые всплывают внизу, в трее.

Да, очень удобно. Но есть ограничения :( Не все платформы поддерживаются.

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

SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);

ээээ... прррр... всем успокоиться... сейчас не 90-е... так уже не делают...

вопрос был "показывается основное окно при закрытии всплывающего"...  тут все дело в том что при закрытии любого окна ищется другое подходящее окно и активируется...  смотрите исходники FMX (unit FMX.Forms; procedure TCommonCustomForm.Close;)

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

Хотя бы один пример, где такое видели приведите.... просто интересно...

Система оповещений Telegram... там можно использовать систему оповещения Windows или собственные окна оповещений...

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

slav_z,

спасибо, но не получилось.

Всё так же, либо я как-то не так применяю.

Создал процедуру, объявил её.

Она вызывается в OnClose? Или как?

 

7 часов назад, #WAMACO сказал:

Используйте механизм уведомлений, которые всплывают внизу, в трее.

Не подскажете какой именно? TnTRayIcon?

 

7 часов назад, dmokrushin123 сказал:

Как понял вопрос не в закрытии всплывающего окна, а в том что показывается основное окно.

Каким образом у вас вообще показывается всплывающее окно если приложение свернуто (минимизировано) ?

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

У меня сразу раскрывается главное окно, принудительно я его не разворачиваю.

 

И да, кстати... как бы это странно не звучало, но приложение используется только под виндой.

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

спасибо, но не получилось.

ну блиииииин...  создайте событие OnCloseQuery у всплывающего окна и вставьте туда код. у всплывающего окна сделайте "поверх всех окон" и "по центру экрана". пример во вложении.

Project.zip

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

пример во вложении.

Project.zip

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

При последующих срабатываниях уже всё хорошо, главная форма не разворачивается.

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

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

странно... у меня windows 10   нормально работает и в XE8 и в 10.2.3...

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

программа при запуске должна быть сразу свернута?

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

Я бы рекомендовал, как вам уже подсказывали, использовать готовые механизмы уведомлений.

Или вариант с TNotificationCenter - над треем будет появляться окошко с вашим уведомлением, клик по окошку вы можете произвольно обработать в приложении. Этот механизм "написан по быстрому" через пень-колоду, просто создает окно, не пытаясь взаимодействовать с платформой.

image.png.c04347e531dc3bf8d5c555e4dc432c7d.png

Или использовать родной механизм Windows  - winapi Shell_NotifyIcon, тогда вы получите еще и уведомления в центре уведомлений Windows

image.thumb.png.f3f61902120803fce43b68b2a83233e9.png

Второй способ можно использовать с помощью многочисленных компонентов TTrayIcon:

procedure TForm1.SetNotification(const ATitle, AMessage : String);
begin
  FTrayIcon.BalloonTitle:=ATitle;
  FTrayIcon.BalloonHint:=AMessage;
  FTrayIcon.ShowBalloonHint;
end;

 

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

успел проверить правда на XP и XE6

попробуйте запустить exe-шник на Win 7 или 10...  если там будет работать, то дело в XP... скорее всего так и будет... я чета сомневаюсь что XE6 сильно отличается от XE8....

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

Опять пошли в какие-то обходные маневры...
Решение для винды:

uses
  FMX.Platform.Win,
  Winapi.Windows;

procedure TForm5.FormCreate(Sender: TObject); // Form5 - это окно-"всплывашка". Не забываем выставить в инспекторе объектов stayOnTop, стиль border-а и т.п.
var
  myHWND: THandle;
  ExStyle: NativeInt;
begin
  myHWND:=  WindowHandleToPlatform(Handle).Wnd;
  Winapi.Windows.SetParent(myHWND, 0); 
  ExStyle := GetWindowLong(myHWND, GWL_EXSTYLE);
  SetWindowLong(myHWND, GWL_EXSTYLE, ExStyle or WS_EX_TOOLWINDOW or WS_EX_NOACTIVATE); 

Возможно, этот код будет актуальнее смотреться в OnShow, а не в onCreate.

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

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

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

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

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

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

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

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

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

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

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