PopupWindow для реалтайма

Опубликовано в AmiBroker

Амиброкер располагает функцией 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

Добавить комментарий


Защитный код
Обновить