![見出し画像](https://assets.st-note.com/production/uploads/images/83954594/rectangle_large_type_2_0788a2982bf458732f0768e0387b370b.jpeg?width=1200)
PowerAppsのススメ 〜その5〜 アラーム機能の追加(2)
※バグについて
drpHourとdrpMinのItemsプロパティが数値で指定していましたが、2桁の文字列に変更しました。
TimeValue関数で文字列から時刻変換する際に、数値のままだと1桁の時分が読み取れないため、正常に時刻変換ができずアラームの設定ができない時間帯があったためです。
前回はアラームの設定画面を追加しました。
今回はいよいよアラームを鳴らしてみます!!
その前に。
アラーム音の用意はどうしましょうか?
私は今回、こちらの無料SEを利用させていただくことにしました。
こちらで電話の効果音をダウンロードさせてもらいました。
なお、OtoLogicさんの効果音はフリーですが、必ず「クレジット表記」が必要です。
詳細はOtoLogicさんのHPの利用規約をご覧ください。
1.アラーム時刻の記録
それではまず、アラーム設定画面scrAlarmSettingでアラームを鳴らす時刻を記録します。
前回、グローバル変数AlarmTimeを用意したので、そこにアラーム時刻を記録します。
btnAlarmSettingのOnSelectプロパティで、時間と分のドロップダウンに指定された値を読み取って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"を追加します。
![](https://assets.st-note.com/img/1659512109162-82PMhCZErV.png?width=1200)
最終的に上記のように設定します。
これで、ドロップダウンで指定した時刻を、「アラーム設定」ボタンを押すことでAlarmTimeに記録します。
時計画面には、「戻る」ボタンで戻ります。
2.アラーム音の追加と設定
アラーム音(SE)は、メディアのオーディオコントールを追加して行います。
![](https://assets.st-note.com/img/1659517302336-sKusyIXg4c.png?width=1200)
オーディオコントールを追加すると、次のようなコントールが画面に追加されます。
![](https://assets.st-note.com/img/1659518549877-hQjszkiZBY.png)
このメディアコントロールはaudAlarmという名称にしました。
効果音ファイルはメディアプロパティで指定します。
![](https://assets.st-note.com/img/1659519304904-fw4TSv55xt.png?width=1200)
アラーム音はループさせたいので、ループプロパティはオン、また、今回はコントールを表示させたくないので、表示プロパティはオフにしておきます。
![](https://assets.st-note.com/img/1659519316153-tFC7cCEotH.png?width=1200)
2−1.再生方法
メディアコントロールの再生は、Startプロパティを利用します。
ここではコンテキスト変数を定義して利用します。
また、停止させた後で再度再生する場合に先頭から再生させたいので、Resetプロパティをtureにしておきます。
コンテキスト変数はscrClock画面のOnVisibleプロパティに次のように追加します。
UpdateContext(
{
TxtDate: "",
TxtTime: "",
AudioAlarmOn: false
}
);
Reset(audAlarm);
ここで、AudioAlarmOnというコンテキスト変数をfalseで定義します。
また、画面が切り替わった際にメディアコントロールをReset関数でリセットすることで、再生を先頭からさせることができます。
(メディアコントロールのResetプロパティをtrueにしておく必要があります)
次に、追加したメディアコントロール、audAlarmのStartプロパティにAudioAlarmOnを指定します。
![](https://assets.st-note.com/img/1659520097912-wzMQpfoEtA.png?width=1200)
2−2.アラームのオン・オフ
これでAudioAlarmOnをtrueにすればアラームは鳴るはずです。
では、AudioAlarmOnをどこでtrueにすればよいでしょうか。
今回は、tmrUpdateのOnTimerStartプロパティで行います。
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関数の時分秒部分を比較し、一致したらAudioAlarmOnをtrueにし、そうでなくなったらfalseにします。
なお、この実装だと1秒毎にチェックされ、アラーム時刻の間、何度もAudioAlarmOnがtrueに設定されますが、今回は目をつぶってください。
2−3.アラームの停止方法
アラームは設定した時刻の間鳴り続けることになります。
そのため、停止させるには、「アラーム時刻をクリア」する必要があります。
この処理は、ボタンを使う方法が一般的ですが、ここでは既に作成済みのコントロール、「アラーム設定」ボタンを利用することにします。
アラーム時刻になるとコンテキスト変数のAudioAlarmOnがtrueになるので、btnAlarmSetのTextプロパティと、OnSelectプロパティに少し手を加えます。
まず、Textプロパティを以下のように変更します。
If(AudioAlarmOn,"アラーム停止","アラーム設定")
こうすることで、アラーム時刻になるとボタンのテキストが「アラーム停止」に切り替わります。
さらにOnSelectプロパティは、
If(AudioAlarmOn
,Set(AlarmTime,Blank())
,Navigate(scrAlarmSetting)
)
と、このようにAudioAlarmOnがtrueの時にAlarmTimeを空白値にするようにします。
こうすることで、アラームが鳴り始めると「アラーム設定」ボタンが「アラーム停止」ボタンとなり、ボタンを押すとアラームが止まる、という動作になります。
※アラーム動作の確認動画を作成しました。
これでアラーム機能の追加は完了です。
ただし、
起動時、一時的に「0000年00月・・・」と表示される。
アラーム設定画面から戻った時にも表示される
アラームを停止させると毎回設定し直さないとならない
といったように、まだ改良の余地はありますが、時計アプリは一旦、ここまでとします。
次回はGoogleスプレッドシートとの連携を解説したいと思います。
お疲れ様でした。