Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Рабочий стол
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.12.2022, 10:46
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 38
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Как сделать всплывающее окно?

Есть Form1 и Form2. Как сделать так, чтобы Form2 появлялась по таймеру, даже если Form1 свернуто? Трэй и всякие костыли вроде AlphaBlend не рассматриваю. Может есть какое-то простое решение?
Ответить с цитированием
  #2  
Старый 03.12.2022, 12:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

CreateParented(0) - создаст форму со своей кнопкой на таскбаре. Соотв, можно будет показывать ее вне зависимости от состояния главной формы. Если этот метод не доступен (для старых версий), то надо перекрыть вот этот метод:
Код:
procedure TCustomNotificationForm.CreateParams(var Params: TCreateParams);
begin
  Params.ExStyle := Params.ExStyle Or WS_EX_TOPMOST Or WS_EX_TOOLWINDOW Or WS_EX_NOACTIVATE And (Not WS_EX_APPWINDOW);
  Params.WndParent := GetDesktopWindow;
  inherited CreateParams(Params);
end;
Ответить с цитированием
  #3  
Старый 03.12.2022, 20:15
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 38
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Пробовал первым способом вот так
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var form3:TForm;
begin
  try
    begin
      form3 := form2.CreateParented(form2.Handle);
      form3.Show;
    end;
  finally

  end;
end;
Ничего не вышло: кнопку на панели задач не создает, при сворачивании первой формы вторая (Form3 в нашем случае) не выскакивает.
Пробовал вторым способом и добавил во второй модуль код
Код:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  Params.ExStyle := Params.ExStyle Or WS_EX_TOPMOST Or WS_EX_TOOLWINDOW Or WS_EX_NOACTIVATE And (Not WS_EX_APPWINDOW);
  Params.WndParent := GetDesktopWindow;
  inherited CreateParams(Params);
end;
В спецификации написано, что он выполняется перед тем, как создать форму (в нашем случае Form2). Однако на точку останова не реагирует, следовательно, не выполняется. В чем ошибка?
Ответить с цитированием
  #4  
Старый 04.12.2022, 00:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Для первого случая. Я не случайно указал там в параметрах "0". Лучше, конечно, поставить "GetDesktopWindow", хотя обычно эта функция и возращает 0 - это handle десктопа.

Для второго случая. При декларации в классе формы ты укзал ключевое слово override?

PS. Второй вариант точно работает. Есть проект на D7, проверена работа на Win7 и Win10 лично.
Ответить с цитированием
  #5  
Старый 04.12.2022, 13:58
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 38
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Первым способом указал и 0 и GetDesktopWindow - никаких изменений - окно каждый раз пересоздается, но при сворачивании главного окна ничего не происходит.
Второй способ: добавил override и в главной форме написал такой код:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var form2:TForm2;
begin
  try
    begin
      Application.CreateForm(Tform2, form2);
      form2.Show;
    end;
  finally

  end;
end;
В этом случае у меня каждый раз создается новое окно. При сворачивании главного окна также сворачиваются все остальные, хотя и продолжают штамповаться в фоновом режиме. При разворачивании из панели задач они все выскакивают. Новая кнопка в панели задач не создается.
Ответить с цитированием
  #6  
Старый 04.12.2022, 20:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну а чего ты ожидал, ты же привязываешь форму к приложению. Для второго способа:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var form2:TForm2;
begin
  try
    begin
      Form2 := Tform2Create(Nil);
      form2.Show;
    end;
  finally
 
  end;
end;
Ответить с цитированием
  #7  
Старый 04.12.2022, 21:28
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 38
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Да, теперь на панели задач появляется кнопка, но по-прежнему неясен механизм ее автоматического восстановления по таймеру. Как только свернули главное окно - второе окно отказывается восстанавливаться. У меня есть идея сделать своего рода костыль и настроить задачу по расписанию средствами ОС, но неужели нет никакого более простого способа?
Ответить с цитированием
  #8  
Старый 05.12.2022, 02:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Конечно, есть.
Но тут дело в том, что ты задал конкретный вопрос и получил конкретный ответ. Ты же не сказал, что конкретно тебе надо сделать. Просто показать информационное окно без привязки к основному - этот ответ ты получил (в моем проекте совершенно не важно в каком состоянии находится основное окно приложения, окно оповещения появляется всегда по срабатыванию таймера).
Если ты опишешь задачу целиком, то, возможно, тебе подскажут как ее решить.
Ответить с цитированием
  #9  
Старый 05.12.2022, 12:55
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 38
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Возможно, уважаемый Imikle, Вы меня неправильно поняли. Я задал вопрос именно что "как заставить всплывать окно Form2, даже если окно Form1 (главное) свернуто". Мне совершенно неважно, будет между ними привязка или нет (вообще-то нужна, но это другой вопрос). Если конкретнее: есть программа-словарь. Мне нужно, чтобы карточка со словом появлялась на экране каждые, скажем, 15 минут. При этом основное окно программы может быть свернуто. В любом случае, спасибо Вам за участие.
Ответить с цитированием
  #10  
Старый 05.12.2022, 23:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от T232006
Возможно, уважаемый Imikle, Вы меня неправильно поняли. Я задал вопрос именно что "как заставить всплывать окно Form2, даже если окно Form1 (главное) свернуто". Мне совершенно неважно, будет между ними привязка или нет (вообще-то нужна, но это другой вопрос). Если конкретнее: есть программа-словарь. Мне нужно, чтобы карточка со словом появлялась на экране каждые, скажем, 15 минут. При этом основное окно программы может быть свернуто. В любом случае, спасибо Вам за участие.

прикрепил файл.
в моем случае работает. вызывать так:
Код:
ShowTrayNotification('Message caption','Message details',30,TrayNotificationClick);
событие для "отлова" клика по этому окну:
Код:
procedure TrayNotificationClick(UserAction : TTrayNotificationUserAction);
Вложения
Тип файла: pas TrayNotify.pas (7.9 Кбайт, 4 просмотров)
Ответить с цитированием
  #11  
Старый 07.12.2022, 15:28
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 38
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Хотелось бы больше пояснений по поводу процедуры ShowTrayNotification('Message caption','Message details',30,TrayNotificationClick)
Куда ее вставлять, что она вызывает? А также когда наступает событие procedure TrayNotificationClick(UserAction : TTrayNotificationUserAction) и что по нему нужно делать?
Ответить с цитированием
  #12  
Старый 08.12.2022, 07:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вызывать в тот момент, когда ты хочешь показать это окно. Например, в обработчик события OnTimer компонента TTimer.
Сама процедура вызывает показ окна с указанным сообщением (я делал эту библиотечку для показа Tray Notifications, так что будет показывть окошко около трея, но т.к. исходники я тебе дал, то координаты можешь и поменять).
Собственно, параметры:
1. Заголовок окна
2. Само сообщение (там можно использовать CRLF если надо несколько строк
3. Время отображения окна, после истечения времени оно само уберется.
4. CallBack для обработки клика по окну.
Собственно, procedure TrayNotificationClick(UserAction : TTrayNotificationUserAction) и есть этот CallBack, т.е. обработчик сообщения о клике по окну. Внутрь эта процедура получает флаг о том, где юзер кликнул - просто закрыл окно или кликнул по любому другому месту.

В конце концов, сделай маленькое приложение с кнопкой, в которой и вызывай эту процедуру и посмотри, что получается...
Ответить с цитированием
  #13  
Старый 08.12.2022, 18:49
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 38
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

А, понял! В принципе, я так и делал, но просто не заметил этого окна в правом нижнем углу! Красивое окно, вот только проблема в том, что оно сворачивается, как только сворачивается главное окно. При работе от таймера главного окна в свернутом положении окно не восстанавливается.
Ответить с цитированием
  #14  
Старый 08.12.2022, 23:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Хм, да? Не замечал, может это на Win10/11? Или другая версия Delphi? Какая у тебя?

ЗЫ. Эта либа писалась и отлаживалась на D7.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
T232006 (10.12.2022)
  #15  
Старый 09.12.2022, 10:26
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 38
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

OC Win10, среда XE5
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter