|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Как сделать всплывающее окно?
Есть Form1 и Form2. Как сделать так, чтобы Form2 появлялась по таймеру, даже если Form1 свернуто? Трэй и всякие костыли вроде AlphaBlend не рассматриваю. Может есть какое-то простое решение?
|
#2
|
|||
|
|||
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
|
|||
|
|||
Пробовал первым способом вот так
Код:
procedure TForm1.Timer1Timer(Sender: TObject); var form3:TForm; begin try begin form3 := form2.CreateParented(form2.Handle); form3.Show; end; finally end; end; Пробовал вторым способом и добавил во второй модуль код Код:
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; |
#4
|
|||
|
|||
Для первого случая. Я не случайно указал там в параметрах "0". Лучше, конечно, поставить "GetDesktopWindow", хотя обычно эта функция и возращает 0 - это handle десктопа.
Для второго случая. При декларации в классе формы ты укзал ключевое слово override? PS. Второй вариант точно работает. Есть проект на D7, проверена работа на Win7 и Win10 лично. |
#5
|
|||
|
|||
Первым способом указал и 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
|
|||
|
|||
Ну а чего ты ожидал, ты же привязываешь форму к приложению. Для второго способа:
Код:
procedure TForm1.Timer1Timer(Sender: TObject); var form2:TForm2; begin try begin Form2 := Tform2Create(Nil); form2.Show; end; finally end; end; |