#PowerApps スライダータイマーを柔軟に制御する


スライダータイマーとは??

@github129 氏のこちらの記事になります
【#PowerApps】PowerAppsでタイマーコントロールを使わずにタイマーコントロールよりも高速なループを実行する方法

この手法により、タイマー制御が非常に高速になりまして、本当に有用なものとなったのですが
問題は、早すぎるということですね。

Patchなどを使って、データソースのアップデートを実行したい場合、更新完了を待たずに次に行ってしまいかねません。

ならば、タイマーを使えばいいという話になるのですが

@tomikiya 氏のこちらの記事の通り
[PowerApps]バックグランドで緯度経度を取得する
タイマーはバックグラウンドでは実行されないということがわかりました。

なので、スライダータイマーでかつ、実行タイミングを制御する方法を以下にまとめることにしました。

完成系

使用する変数

変数名 意味
SliderTimer スライダータイマーのループ判定に使用
0~1 チェンジ用
2はストップ
Cnt 間隔をあけて実行する用のカウンタ変数
ExecCnt 実行間隔を指定(回数)

OnStartプロパティ

Onstart
Set(Slidertimer,2);
Set(Cnt,0);
Set(ExecCnt,500)

START/STOPの実装

スライダータイマーの方式にも記載ありますが、こういうやり方もあるんだぞということで・・・

Startボタン

OnSelect

OnSelect
Set(Slidertimer,0)

Stopボタン

OnSelect

OnSelect
Set(Slidertimer,2)

スライダー

Default

Default
Slidertimer

Max

Max
2

Min

Min
0

OnChange

OnChange

Switch(
    Slidertimer,
        0,Set(Slidertimer,1),
        1,Set(Slidertimer,0)
);

実行間隔制御の実装

次は、先ほど作ったものに実行間隔制御を実装していきます。

スライダー

OnChange

OnChange
Switch(
    Slidertimer,
        0,Set(Slidertimer,1),
        1,Set(Slidertimer,0);Set(ExecCnt,Cnt+1)
);
If(
    ExecCnt=Cnt,
        // 間隔制御して実行させたい処理を入れる
        Collect(
            GPSData,{
                datetime:Now(),
                lat:Location.Latitude,
                long:Location.Latitude,
                alt:Location.Altitude,conp:Compass
            }
        );
        // ここまで

        // 間隔カウンタリセット
        Set(Cnt,0),
    ""
)

これでスライダーの値が500回になったときに処理が実行されるという間隔制御ができるようになります。

応用

ラジオボタンなどを使うことで、このように、実行間隔をアプリ上で変更することもできるようになります!