Добрый день, друзья
Поняли тут с коллегами, что в Террасофте 3.3.х не хватает нормальных информационных окон, которые бы всплывали фоново рядом с мышкой, например, и лишь на определенное время.
Или до ближайшего нажатия мышкой где угодно еще. Или же вовсе до момента, когда мышка будет подвинута с места и с того момента отсчитав еще пару секунд.
Показывая пользователю, допустим, что нажатие было успешным и все выполнено, но не требующие при этом нажатия на кнопку "ОК"
К сожалению, понимание, как это лучше сделать, пока не пришло
В голове крутятся возможные варианты исполнения с Action Menu Item-мами.. но их довольно неудобно формировать и, как я понимаю, проблематично показывать прямо перед мышкой или рядом с оной
Либо же держать какую-то форму совершенно крохотную и вызывать ее на нек. время модально, проверяя нужные события. Например смену фокуса. Или таймер.
Но хотелось бы, конечно, более красивого решения
Спасибо за потраченное на прочтение время
Нравится
посмотрите тут http://www.community.terrasoft.ru/blogs/8555
Это, безусловно, крайне полезная ссылка, показывающая новый функционал
И я ее уже находил ранее
Спасибо
Но в данном случае, к сожалению, вопрос перехода на новую версию даже не обсуждается
Он невозможен
Хотелось бы именно самому реализоваться (в крайнем случае взять уже кем-то сделанный код или часть кода для доработки)
Иван, в одном из проектов я сделал окошко, которое выводит какое-то сообщение и закрывается само, например, через 2 секунды. Единственное, что это окно не является модальным, но это не сложно исправить.
Функция вызова окна:
function ShowBlinkMessage(Text, Seconds) { if (IsEmptyValue(Text)) { return; } var Window = GetSingleItemByCode('wnd_BlinkMessage'); SetAttribute(Window, 'Text', Text); if (IsUndefined(Seconds) || (Seconds == null)) { Seconds = 0; } SetAttribute(Window, 'Seconds', Seconds); Window.Prepare(); Window.Show(); }
Эту функцию я разместил в скрипте scr_WindowUtils.
Пример использования функции:
ShowBlinkMessage('Успешно скопировано в буфер обмена: ' + RecordID);
Сервисы окна BlinkMessage для версии 3.4 прикрепил в архиве blinkmessage.zip
Огромное спасибо за крайне развернутый ответ и готовые примеры
Но, признаться честно, хотелось попробовать как-то решить эту задачку без дополнительных форм, так как их загрузка все же немного сказывается на скорости работы и позволяет сделать пользователю ошибку (например случайно нажать на галочку в гриде, пока ТС открывает форму или когда форма закрылась и под ней снова грид), чего пользователь может и не заметить.
А если же делать форму модальной, то на время ее таймера система полностью приостанавливается.
И потеря скорости открытия карточки становится совсем существенной
Возможно кто-то пробовал реализовывать с помощью каких-то еще способов?
Иван, в любом случае нужно будет создавать окно. Например, InfoWindow в версии 3.4.1 - это отдельно созданное окно, которое вызывается ядром:
System.ShowInfoWindow('wnd_Info', 3000, ObjectToAttributes( {Message: Message}));
Чтобы загрузка окна не сказывалась на скорости работы, пропишите получение объекта окна
var Window = GetSingleItemByCode('wnd_Info');
в function wnd_MainOnPrepare(Window) сервиса scr_Main. Таким образом окно пропишется в словаре и получение экземпляра окна записью GetSingleItemByCode будет осуществляться из памяти.
Спасибо за советы
Сделал в результате так, как рекомендовал Андрей
Столкнулся только с одним странным багом
Форма после вызова сначала .Prepare() а потом .Show() открывалась. Показывалась пол секунды абсолютно чистая и только после этого показывала наконец Caption у лэйбла.
Т.е. такое чувство, будто форма даже после явной иницилизации кепшена еще сомневалась. Показывать ли его
Помог от этого только вызов вместо .Show() .ShowModal()
Совершенно не понятно, что за баг
При этом пробовал уже даже и в дизайнере прописывать в кепшн элементу какой-то свой текст.
Бесполезно. Вызывается сначала чистая (как будто даже и без лейбла вовсе) а потом уже через нек. время показывает в нем лейбл с указанным при вызове кепшеном (Т.е. не тем, который был прописан в дизайнере)
Иван, не смогла воспроизвести. Тестировала на сборке 3.3.2.290
Уточните, пожалуйста, на какой сборке возникает данная проблема + вложите используемый Вами код.
сборка 3.3.2.244
форма открывается на кнопке внизу формы редактирования контрагента
на кнопке висит
function btnCheckSatisfactionOnClick(Control) { Control.IsEnabled = false; System.BeginProcessing(); try{ CheckConditions(); ShowBlinkMessage('Проверка условий завершена', 1.5); } catch(err){ //Необработанное исключение Log.Write(2, err.description + " {95A81BCF-E9D3-4166-A9F7-D13B92E52FA7}" + " btnCheckSatisfactionOnClick"); ShowErrorDialog("Во время проверки условий произошла ошибка.\nПожалуйста, сообщите в IT."); } finally{ System.EndProcessing(); Control.IsEnabled = true; } RefreshDatasetAndRestorePosition(Control.ParentWindow('dlData').Dataset); }
В ShowBlinkMessage текст, любезно предоставленный Андреем чуть выше
Иван, все таки не смогла воспроизвести.
Проверьте два момента:
- корректность отображения на другой машине (может быть влияет ОС).
- вызов окна без дополнительной логики, только ShowBlinkMessage:
"Калинин Иван" написал:
Но, признаться честно, хотелось попробовать как-то решить эту задачку без дополнительных форм, так как их загрузка все же немного сказывается на скорости работы и позволяет сделать пользователю ошибку (например случайно нажать на галочку в гриде, пока ТС открывает форму или когда форма закрылась и под ней снова грид), чего пользователь может и не заметить.А если же делать форму модальной, то на время ее таймера система полностью приостанавливается.
И потеря скорости открытия карточки становится совсем существеннойВозможно кто-то пробовал реализовывать с помощью каких-то еще способов?
А если сделать как в BPMonline:
Технически не должно быть сложностей задизайнить невидимую панельку с надписью, а в нужный момент вывести в надпись текст и сделать её видимой.
Прототип за 5 минут:
Да, проблем сделать такую панельку нет
Вот только, к сожалению, террасофт 3.3.х очень скудно перестраивает формы "на живую".
Делает это очень некрасиво и медленно
Но спасибо за альтернативный вариант решения