PopupWindow для реалтайма
Амиброкер располагает функцией PopupWindow. Эта функция создает всплывающее окно с сообщением на экране терминала.
Всплывающее окно является отличным инструментом при отладке кода. Также оно даёт возможность информировать пользователя о возникновении определённых ситуаций в работе формулы уже в "боевом" режиме. Проблемы при использовании этой функции появляется в случае, что если вызов PopupWindow() происходит из цикла или если условие вызова PopupWindow выполняется на последовательных проходах AFL. В этих случаях легко получить сотни или даже тысячи всплывающих окон на экране.
В качестве решения разработчиком предложен механизм, позволяющий избежать этого неприятного эффекта. Немного его усовершенствовав, получаем следующее решение проблемы:
Добавляем идентификатор (popupID) для отслеживания каждого отдельного всплывающего окна. Повторное появление окна с тем же идентификатором возможно лишь по истечении определенного периода ожидания, либо в случае изменения отображаемого текста.
function GetSecondNum() { Time = Now( 4 ); Seconds = int( Time % 100 ); Minutes = int( Time / 100 % 100 ); Hours = int( Time / 10000 % 100 ); SecondNum = int( Hours * 60 * 60 + Minutes * 60 + Seconds ); return SecondNum; } function PopupWindowEx( popupID, bodytext, captiontext, timeout, left, top ) { displayText = bodytext + captiontext; if ( ( StaticVarGetText( "prevPopup" + popupID ) != displayText) OR ( StaticVarGet( "prevPopupTime" + popupID ) < GetSecondNum() ) ) { StaticVarSetText( "prevPopup" + popupID, displayText); StaticVarSet( "prevPopupTime" + popupID, GetSecondNum() + timeout ); PopupWindow( bodytext, Captiontext + popupID, timeout, Left, top ); } } PopupWindowEx( "ID:1", "testing", "test alert ", 5, -1, -1 ); PopupWindowEx( "ID:2", "testing", "test alert ", 5, 0, 0 );
Или другой вариант, более простой (но с использованием препроцессора):
dnl Получение числа секунд с полуночи до указанного timenum
define(`SecondsFromTimeNum',`(Floor(m4_arg(`$1')/10000) *eval(60*60)+ (Floor(m4_arg(`$1')/100)%100)*60+m4_arg(`$1')%100)') procedure PopupWindowEx(BodyText, CaptionText, TimeOut, Left, Top) { Local CurrentTime; CurrentTime = Now( 4 ); dnl Текущее время в формате TimeNum
CurrentTime = SecondsFromTimeNum(CurrentTime); dnl Переводим в секунды с полуночи
if (CurrentTime > Nz(StaticVarGet(BodyText)))
{ StaticVarSet( BodyText, CurrentTime + TimeOut );
PopupWindow( BodyText, CaptionText,TimeOut, Left, Top );
}
}
См. также PlotBackground