Добрый день!
Решил сделать окно приветствия с отображением полезной информации пользователям при запуске программы. Нашёл тему https://community.terrasoft.ua/forum/topic/1924, в которой описывается принцип как это сделать. Вызов основан на коде
var LogoWindow = Services.GetNewItemByUSI('wnd_Welcome');
LogoWindow.Show();
System.BeginProcessing();
System.ProcessMessages();
LogoWindow.Prepare();
System.EndProcessing();
}
У меня вопрос: зачем нужно писать всё это писать (что делают эти строки), если работает код?
var LogoWindow = Services.GetNewItemByUSI('wnd_Welcome');
LogoWindow.Show();
}
Меня не устраивает как это все работает: окно появляется под окном логотипа программы, программа на нем не останавливается. Сделал показ модального окна, программа ждет его закрытия, но при этом само окно появляется под окном логотипа программы. Вопрос: как это окно показывать после скрытия окна логотипа или хотя бы на переднем плане (BringToFront не помог).
Нравится
Здравствуйте.
Для показа поверх окон, попробуйте использовать ForceBringToFront();.
LogoWindow.Prepare(); нужно вызывать перед LogoWindow.Show();
Также можно добавить паузу в показе окна:
System.Sleep(3000);
Дмитрий, к сожалению команда LogoWindow.ForceBringToFront() не привела к желаемым результатам - если окно модальное, то оно появляется за окном логотипа программы, а если не модальное, то сверху него появляется окно программы. А команда System.Sleep(3000) вообще повела себя очень интересно: окно появилось на заднем фоне, а переключившись в него получил белое окно (без данных), такое впечатление что весь вывод остановился. Есть еще другие пути показать нормальное окно приветствия, например до логотипа, после ввода пароля и соединения с БД, после закрытия окна логотипа и т.п.?
Здравствуйте!
Пожалуйста, предоставьте сервисы окна приветствия (wnd_, scr_), а также текущий код, которым Вы вызываете данное окно.
Заранее спасибо!
Ozzy,
у меня получилось так:
function wnd_MainOnShow(Window) { Timer.Interval = 5000; Timer.IsEnabled = (Main.TimerInterval > 0); var Hello = Services.GetNewItemByUSI('wnd_Help'); Hello.ForceBringToFront(); Hello.ShowModal(); }
Дмитрий, а получилось что? Использовал Ваш скрипт, но эффект аналогичный. Появляется описанное модальное окно за логотипом, при этом менять 5000 на что-то другое никакого эффекта не дает. Не хочет команда Hello.ForceBringToFront(); показывать окно поверх логотипа. Как вызвать мое окно после исчезновения логотипа?
Ozzy, какую версию Вы используете?
Дело в том, что предоставленный мною код как раз решает Вашу задачу - окно появляется на переднем плане, а не за логотипом загрузки...
У нас используется версия 3.3.2.266, БД Оракл. Проверял и на 3.3.2.211, и на 3.3.2.184 - результат тот же: моё окно появляется под логотипом загрузки. При этом окно с напоминаниями нормально на передний план выскакивает, а карточка звонка так вообще поверх всех открытых окон программ выскакивает.
Ozzy, для решения вопроса измените следующую функцию:
function TimerOnTimer(Timer) { ShowTimerWindow(); PrepareTimer(); if (!Main.AboutIsShown) { var Hello = Services.GetNewItemByUSI('wnd_Notice'); Hello.Show(); Main.AboutIsShown = true; } }
Игорь, спасибо за отклик. Предложенный Вами код работает, но не совсем так, как хотелось бы. Моё окно появляется, но не при старте системы, а через некоторое время (от нескольких секунд до нескольких минут). Это окно может появляться несколько раз (бесконечно много), а может и один раз только появляться. Если должно появиться окно напоминаний, то оно появляется сразу же после старта системы (поверх логотипа), а основное окно программы его перекрывает (так и раньше было). Потом через некоторый промежуток времени появляется моё окно.
Учитывая вышесказанное, жду еще предложений по корректной реализации вызова своего окна при запуске приложения: чтобы оно появлялось поверх окна логотипа, а лучше и поверх основной программы. Вариант с модальным окном поверх окна логотипа без запуска основного приложения, думаю, устроит больше.
Ozzy, окно должно появляться либо сразу же, либо в течении одной минуты (время таймера).
Повторное появление окна возникать уже не должно.
В текущей реализации программы обращение к таймеру происходит каждую минуту.
Для решения Вашего вопроса будет разумно создать еще один таймер, и установить его, к примеру, в 5 секунд. Вызывать его можно не на событии OnShow, а на OnPrepare.
Попробуйте этот вариант.
А если вообще запустить программу не с главного окна, а с этого вашего приветствия?
tsclient /wnd=wnd_Welcome
Спасибо, Игорь. Более-менее то что хотелось получилось реализацией отдельного таймера и его обработчика. Но всё равно, если есть окно напоминаний, то оно появляется раньше моего окна и получается открывается под основным окном, а вот моё окно как раз показывается корректно: поверх основного окна через полсекунды.
Вопрос. Никогда не работал с таймером. В методе OnPrepare разрешаю работу таймера. После первого же срабатывания запрещаю работу таймера, так как больше мне вызов этого окна по таймеру не потребуется. Все ли правильно я делаю?
Да, верно. Если окно больше не вызывается, то все ок.