見出し画像

PowerAppsのススメ 〜その5〜 アラーム機能の追加(2)

※バグについて
drpHourとdrpMinのItemsプロパティが数値で指定していましたが、2桁の文字列に変更しました。
TimeValue関数で文字列から時刻変換する際に、数値のままだと1桁の時分が読み取れないため、正常に時刻変換ができずアラームの設定ができない時間帯があったためです。

前回はアラームの設定画面を追加しました。

今回はいよいよアラームを鳴らしてみます!!

その前に。

アラーム音の用意はどうしましょうか?

私は今回、こちらの無料SEを利用させていただくことにしました。

フリー音素材サイトOtoLogic(オトロジック)

こちらで電話の効果音をダウンロードさせてもらいました。

なお、OtoLogicさんの効果音はフリーですが、必ず「クレジット表記」が必要です。

詳細はOtoLogicさんのHPの利用規約をご覧ください。

1.アラーム時刻の記録

それではまず、アラーム設定画面scrAlarmSettingでアラームを鳴らす時刻を記録します。

前回、グローバル変数AlarmTimeを用意したので、そこにアラーム時刻を記録します。

btnAlarmSettingOnSelectプロパティで、時間と分のドロップダウンに指定された値を読み取ってAlarmTimeに記録します。

Set(AlarmTime,TimeValue(Concatenate(drpHour.Selected.Value,":",drpMin.Selected.Value,":00")));

1−1.Concatenate関数

この関数は、2つ以上の文字列の結合を行います。

Concatenate(引数1,引数2,…)

最低でも2つの引数を必要とします。

結合された文字列は関数の戻り値として得られます。

1−2.TimeValue関数

この関数は文字列表記の時刻を時刻値に変換します。

文字列の書式は基本的に”時:分:秒”ですが、12時間表記にも対応しており、その場合は後ろに”PM”または”AM"を追加します。


btnAlarmSetting.OnSelectプロパティ

最終的に上記のように設定します。

これで、ドロップダウンで指定した時刻を、「アラーム設定」ボタンを押すことでAlarmTimeに記録します。

時計画面には、「戻る」ボタンで戻ります。

2.アラーム音の追加と設定

アラーム音(SE)は、メディアオーディオコントールを追加して行います。

オーディオコントールを追加すると、次のようなコントールが画面に追加されます。

このメディアコントロールはaudAlarmという名称にしました。

効果音ファイルはメディアプロパティで指定します。

アラーム音はループさせたいので、ループプロパティはオン、また、今回はコントールを表示させたくないので、表示プロパティはオフにしておきます。

2−1.再生方法

メディアコントロールの再生は、Startプロパティを利用します。

ここではコンテキスト変数を定義して利用します。

また、停止させた後で再度再生する場合に先頭から再生させたいので、Resetプロパティをtureにしておきます。

コンテキスト変数はscrClock画面のOnVisibleプロパティに次のように追加します。

UpdateContext(
    {
        TxtDate: "",
        TxtTime: "",
        AudioAlarmOn: false
    }
);
Reset(audAlarm);

ここで、AudioAlarmOnというコンテキスト変数をfalseで定義します。

また、画面が切り替わった際にメディアコントロールをReset関数でリセットすることで、再生を先頭からさせることができます。
(メディアコントロールのResetプロパティをtrueにしておく必要があります)

次に、追加したメディアコントロール、audAlarmStartプロパティにAudioAlarmOnを指定します。

audAlarm.Startプロパティ

2−2.アラームのオン・オフ

これでAudioAlarmOntrueにすればアラームは鳴るはずです。

では、AudioAlarmOnをどこでtrueにすればよいでしょうか。

今回は、tmrUpdateOnTimerStartプロパティで行います。

UpdateContext(
    {
        TxtDate: Text(Now(), DateTimeFormat.LongDate, "ja"),
        TxtTime: Text(Now(), DateTimeFormat.ShortTime24, "ja")
    }
);
If(Text(AlarmTime,DateTimeFormat.ShortTime24)=Text(Now(),DateTimeFormat.ShortTime24)
    ,UpdateContext({AudioAlarmOn: true})
    ,UpdateContext({AudioAlarmOn: false})
);

アラーム時刻であるAlarmTimeと、現在時刻をあらわすNow関数の時分秒部分を比較し、一致したらAudioAlarmOntrueにし、そうでなくなったらfalseにします。

なお、この実装だと1秒毎にチェックされ、アラーム時刻の間、何度もAudioAlarmOntrue設定されますが、今回は目をつぶってください。

2−3.アラームの停止方法

アラームは設定した時刻の間鳴り続けることになります。

そのため、停止させるには、「アラーム時刻をクリア」する必要があります。

この処理は、ボタンを使う方法が一般的ですが、ここでは既に作成済みのコントロール、「アラーム設定」ボタンを利用することにします。

アラーム時刻になるとコンテキスト変数のAudioAlarmOntrueになるので、btnAlarmSetTextプロパティと、OnSelectプロパティに少し手を加えます。

まず、Textプロパティを以下のように変更します。

If(AudioAlarmOn,"アラーム停止","アラーム設定")

こうすることで、アラーム時刻になるとボタンのテキストが「アラーム停止」に切り替わります。

さらにOnSelectプロパティは、

If(AudioAlarmOn
    ,Set(AlarmTime,Blank())
    ,Navigate(scrAlarmSetting)
)

と、このようにAudioAlarmOntrueの時にAlarmTimeを空白値にするようにします。

こうすることで、アラームが鳴り始めると「アラーム設定」ボタンが「アラーム停止」ボタンとなり、ボタンを押すとアラームが止まる、という動作になります。

※アラーム動作の確認動画を作成しました。


これでアラーム機能の追加は完了です。

ただし、

  • 起動時、一時的に「0000年00月・・・」と表示される。

  • アラーム設定画面から戻った時にも表示される

  • アラームを停止させると毎回設定し直さないとならない

といったように、まだ改良の余地はありますが、時計アプリは一旦、ここまでとします。

次回はGoogleスプレッドシートとの連携を解説したいと思います。

お疲れ様でした。

この記事が気に入ったらサポートをしてみませんか?