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

Delphi Sources



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

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

Есть Form1 и Form2. Как сделать так, чтобы Form2 появлялась по таймеру, даже если Form1 свернуто? Трэй и всякие костыли вроде AlphaBlend не рассматриваю. Может есть какое-то простое решение?
Ответить с цитированием
  #2  
Старый 03.12.2022, 12:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия 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
Сообщения: 52
Версия 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,055
Версия 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
Сообщения: 52
Версия 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,055
Версия 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;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter