Добрый день!

Решил сделать окно приветствия с отображением полезной информации пользователям при запуске программы. Нашёл тему https://community.terrasoft.ua/forum/topic/1924, в которой описывается принцип как это сделать. Вызов основан на коде

function wnd_MainOnShow(Window) {
var LogoWindow = Services.GetNewItemByUSI('wnd_Welcome');
LogoWindow.Show();
System.BeginProcessing();
System.ProcessMessages();
LogoWindow.Prepare();
System.EndProcessing();
}

У меня вопрос: зачем нужно писать всё это писать (что делают эти строки), если работает код?
function wnd_MainOnShow(Window) {
var LogoWindow = Services.GetNewItemByUSI('wnd_Welcome');
LogoWindow.Show();
}

Меня не устраивает как это все работает: окно появляется под окном логотипа программы, программа на нем не останавливается. Сделал показ модального окна, программа ждет его закрытия, но при этом само окно появляется под окном логотипа программы. Вопрос: как это окно показывать после скрытия окна логотипа или хотя бы на переднем плане (BringToFront не помог).

Нравится

14 комментариев

Здравствуйте.

Для показа поверх окон, попробуйте использовать ForceBringToFront();.

LogoWindow.Prepare(); нужно вызывать перед LogoWindow.Show();
Также можно добавить паузу в показе окна:

System.Sleep(3000);

Дмитрий, к сожалению команда LogoWindow.ForceBringToFront() не привела к желаемым результатам - если окно модальное, то оно появляется за окном логотипа программы, а если не модальное, то сверху него появляется окно программы. А команда System.Sleep(3000) вообще повела себя очень интересно: окно появилось на заднем фоне, а переключившись в него получил белое окно (без данных), такое впечатление что весь вывод остановился. Есть еще другие пути показать нормальное окно приветствия, например до логотипа, после ввода пароля и соединения с БД, после закрытия окна логотипа и т.п.?

Здравствуйте!

Пожалуйста, предоставьте сервисы окна приветствия (wnd_, scr_), а также текущий код, которым Вы вызываете данное окно.

Заранее спасибо!

Окно самое простое, скриптов к нему еще никаких нет. Кусок кода из скрипта scr_Main в прикрепленном архиве.

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 разрешаю работу таймера. После первого же срабатывания запрещаю работу таймера, так как больше мне вызов этого окна по таймеру не потребуется. Все ли правильно я делаю?

Да, верно. Если окно больше не вызывается, то все ок.

Показать все комментарии