• 0
striker

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

Вопросы

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

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

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


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

16 ответов на этот вопрос

  • 0
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=False;
  Release;
end;

Попробуйте закрывать всплывающее окно так.

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


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

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

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


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

 вы успеваете его свернуть до первого срабатывания таймера?

да

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

 

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


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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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