|
|
Регистрация | << Правила форума >> | 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; |
#7
|
|||
|
|||
Да, теперь на панели задач появляется кнопка, но по-прежнему неясен механизм ее автоматического восстановления по таймеру. Как только свернули главное окно - второе окно отказывается восстанавливаться. У меня есть идея сделать своего рода костыль и настроить задачу по расписанию средствами ОС, но неужели нет никакого более простого способа?
|
#8
|
|||
|
|||
Конечно, есть.
Но тут дело в том, что ты задал конкретный вопрос и получил конкретный ответ. Ты же не сказал, что конкретно тебе надо сделать. Просто показать информационное окно без привязки к основному - этот ответ ты получил (в моем проекте совершенно не важно в каком состоянии находится основное окно приложения, окно оповещения появляется всегда по срабатыванию таймера). Если ты опишешь задачу целиком, то, возможно, тебе подскажут как ее решить. |
#9
|
|||
|
|||
Возможно, уважаемый Imikle, Вы меня неправильно поняли. Я задал вопрос именно что "как заставить всплывать окно Form2, даже если окно Form1 (главное) свернуто". Мне совершенно неважно, будет между ними привязка или нет (вообще-то нужна, но это другой вопрос). Если конкретнее: есть программа-словарь. Мне нужно, чтобы карточка со словом появлялась на экране каждые, скажем, 15 минут. При этом основное окно программы может быть свернуто. В любом случае, спасибо Вам за участие.
|
#10
|
|||
|
|||
Цитата:
прикрепил файл. в моем случае работает. вызывать так: Код:
ShowTrayNotification('Message caption','Message details',30,TrayNotificationClick); Код:
procedure TrayNotificationClick(UserAction : TTrayNotificationUserAction); |
#11
|
|||
|
|||
Хотелось бы больше пояснений по поводу процедуры ShowTrayNotification('Message caption','Message details',30,TrayNotificationClick)
Куда ее вставлять, что она вызывает? А также когда наступает событие procedure TrayNotificationClick(UserAction : TTrayNotificationUserAction) и что по нему нужно делать? |
#12
|
|||
|
|||
Вызывать в тот момент, когда ты хочешь показать это окно. Например, в обработчик события OnTimer компонента TTimer.
Сама процедура вызывает показ окна с указанным сообщением (я делал эту библиотечку для показа Tray Notifications, так что будет показывть окошко около трея, но т.к. исходники я тебе дал, то координаты можешь и поменять). Собственно, параметры: 1. Заголовок окна 2. Само сообщение (там можно использовать CRLF если надо несколько строк 3. Время отображения окна, после истечения времени оно само уберется. 4. CallBack для обработки клика по окну. Собственно, procedure TrayNotificationClick(UserAction : TTrayNotificationUserAction) и есть этот CallBack, т.е. обработчик сообщения о клике по окну. Внутрь эта процедура получает флаг о том, где юзер кликнул - просто закрыл окно или кликнул по любому другому месту. В конце концов, сделай маленькое приложение с кнопкой, в которой и вызывай эту процедуру и посмотри, что получается... |
#13
|
|||
|
|||
А, понял! В принципе, я так и делал, но просто не заметил этого окна в правом нижнем углу! Красивое окно, вот только проблема в том, что оно сворачивается, как только сворачивается главное окно. При работе от таймера главного окна в свернутом положении окно не восстанавливается.
|
#14
|
|||
|
|||
Хм, да? Не замечал, может это на Win10/11? Или другая версия Delphi? Какая у тебя?
ЗЫ. Эта либа писалась и отлаживалась на D7. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
T232006 (10.12.2022)
|
#15
|
|||
|
|||
OC Win10, среда XE5
|