Section 3.16 時計の実装(その2)

じゃ、今回は前回追加するって言ったメソッドを作ってくね。
は〜い!
まずは setAlarmFile メソッドから。
このメソッドは §2.8 で作った FileSelector クラスのオブジェクトを使って作ってね。
えっと、openFile メソッドを使えばいいんだよね?
ん、そだよ。
ファイルが選択されたら、WaveSoundBuffer クラスの open メソッドで開いてね。
うん、りょーかい。
あと、例外処理もしといてね。
例外処理って、どんな感じにすればいいの?
§3.12の open メソッドでやってるみたいに、 送られてきた例外メッセージを inform メソッドで表示してくれればいいよ。
わかった。
じゃあ、やってみるね。

setAlarmFile メソッド>

function setAlarmFile()
{
    if(selector.openFile())  // ファイル選択ダイアログを表示します
    {
        try
        {
            // ファイルが選択された場合は、open メソッドで開きます
            buffer.open(selector.name);
        }
        catch(e)
        {
            // 例外が発生した場合は、例外メッセージを表示します
            System.inform(e.message);
        }
    }
}

こんな感じでいい…?
ん、OK。ちゃんと書けてるよ。
よかった〜。
じゃあ次はアラームをセットする setAlarm メソッド だね。
これって Clock クラスの setAlarm メソッド を使って作ればいいんだよね?
うん、そうそう。
で、アラームがセットされたら、タイトルバーとタスクバーに「Alarm ON」って表示してね。
うん、おっけー。
あと、アラームがセットされてる時は、プライマリレイヤの上にマウスカーソルを乗せると、アラームの設定時刻が表示されるようにするから。
こんなふうにね。

<アラームの設定時刻表示>

アラームの設定時刻表示

こういう表示ってよく見かけるけど、これもできるの?
うん。Layer クラスに hint っていうプロパティがあって、 このプロパティに表示したい文字列を設定すれば、こういうふうに表示できるよ。
へぇ、結構カンタンにできるんだね。
でしょ。
プライマリレイヤの上にマウスカーソルが乗った時に表示されるようにするってことは、 primaryLayer.hint に文字列を設定すればいいってこと?
ん、そういうこと。
あとはできそう?
えっと、いつアラームを鳴らすかは Clock クラスの getAlarmTime メソッド を呼び出せば判るんだったよね?
ん、そだよ。
うん、あとはだいじょぶだと思う。
じゃあ、やってみるね。

setAlarm メソッド>

function setAlarm()
{
    if(clock.setAlarm())
    {
        // アラームがセットされたら、タスクバーとタイトルバーの表示を更新します
        System.title = caption = "Alarm ON";

        // プライマリレイヤにマウスカーソルが乗った時にアラームの設定時刻を表示します
        var alarmTime = clock.getAlarmTime();
        primaryLayer.hint = "Alarm: " + "%d:%02d:%02d".sprintf(alarmTime.hour, alarmTime.min, alarmTime.sec);
    }
}

これでどうかなぁ?
うん、getAlarmTime メソッドの使い方も OK だし、 sprintf メソッドもちゃんと使えてるね。
やった!
ちなみに、hint プロパティを設定してる行はこう書いても OK だよ。

primaryLayer.hint = "Alarm: %d:%02d:%02d".sprintf(alarmTime.hour, alarmTime.min, alarmTime.sec);

あ、"Alarm: " の部分も sprintf メソッドの文字列の中に入れちゃっていいんだ?
sprintf メソッドで置き換えられるのは % から始まる部分だけで、 それ以外の部分はそのままになるからね。
なるほどね〜。
それじゃ次は cancelAlarm メソッド
これは簡単だよね。
Clock クラスの cancelAlarm メソッド を呼び出せばいいんだよね?
ん、あとタスクバーとタイトルバーの表示は「Alarm OFF」にして、
プライマリレイヤの上にマウスカーソルが乗っても何も表示されないようにしてね。
あ、そっか。
えっと、プライマリレイヤにマウスカーソルが乗っても何も表示されないようにするにはどうしたらいいの?
hint プロパティに空文字列("")を設定すればいいよ。
そうなんだ。
じゃあ…

cancelAlarm メソッド>

function cancelAlarm()
{
    clock.cancelAlarm();  // アラームの設定を解除します
    System.title = caption = "Alarm OFF";  // タスクバーとタイトルバーの表示を更新します
    primaryLayer.hint = "";  // プライマリレイヤにマウスカーソルが乗っても何も表示されないようにします
}

これでいいんだよね?
ん、OK。
じゃ次は checkAlarm メソッド だね。
アラームを鳴らす時刻になったかどうかのチェックかぁ…どうやったらいいんだろ?
Clock クラスのメソッドを2つ使えばできるよ。
2つ? …ってことは、getAlarmTime メソッド と…
あ、あと、今の時間も判らないといけないから getTime メソッド かな?
ん、そうだね。
じゃあ、今の時刻がアラームを鳴らす時間かどうかをチェックする条件式はどうなると思う?
ん〜… getAlarmTime メソッド の戻り値の辞書配列の hourgetTime メソッド の戻り値の辞書配列の hour が同じになってて、 あと minsec も同じになってればいいんじゃないかな?
そうそう。そこまで解ればできるでしょ。
えっとね〜…

checkAlarm メソッド>

function checkAlarm()
{
    var alarmTime = clock.getAlarmTime();  // アラームの設定時刻を取得します
    if(alarmTime === void)  // アラームがセットされていない場合は
        return false;      // false を返します

    var time = clock.getTime();  // 現在時刻を取得します
    if(alarmTime.hour == time.hour && alarmTime.min == time.min && alarmTime.sec == time.sec)
    {
        // 現在時刻がアラームの設定時刻と同じなら true を返します
        return true;
    }
    else
    {
        // 現在時刻がアラームの設定時刻と違っていれば false を返します
        return false;
    }
}

これでいいと思うんだけど…どうかなぁ?
ん、ちゃんとできてるよ。
ほんと?
ただ、もうちょっと簡単に書けるかな。

checkAlarm メソッド(改良版)>

function checkAlarm()
{
    var alarmTime = clock.getAlarmTime();  // アラームの設定時刻を取得します
    if(alarmTime === void)  // アラームがセットされていない場合は
        return false;      // false を返します

    var time = clock.getTime();  // 現在時刻を取得します

    // アラームの設定時刻と現在時刻が同じかどうかを返します
    return alarmTime.hour == time.hour && alarmTime.min == time.min && alarmTime.sec == time.sec;
}

条件式をそのまま返すんだ…
条件式が真なら true を返して、偽なら false を返すんだから、こう書いても同じ結果になるでしょ。
そっか、確かに同じになるね。
んじゃ次ね。
次は playAlarm メソッド なんだけど、 再生と停止は対応してるから、stopAlarm メソッド も一緒に作っちゃって。
えっと、playAlarm メソッドの方は、status"stop" だったら再生して、 stopAlarm メソッドの方は、status"play" だったら停止すればいいんだよね?
ん、そうだね。
ただ、アラーム用のファイルが設定されてないと再生できないから、 もしアラーム用のファイルが設定されてない場合は、アラームを解除して「アラームファイルが設定されていません」っていうメッセージを表示するようにしてね。
アラーム用のファイルが設定されてるかどうかは、どうやったら判るの?
bufferstatus"unload" になってたら、 ファイルが開かれてないってことだから、それをチェックすれば判るよ。
あと、stopAlarm メソッドの方は、停止した後に cancelAlarm メソッドを呼び出しといてね。
わかった。じゃあやってみるね。

playAlarm メソッド& stopAlarm メソッド>

function playAlarm()
{
    if(buffer.status == "unload")
    {
        // アラームファイルが設定されていない場合はエラーメッセージを表示します
        cancelAlarm();
        System.inform("アラームファイルが設定されていません""エラー");
    }
    else if(buffer.status == "stop")
        buffer.play();  // 現在停止中なら再生します
}

function stopAlarm()
{
    if(buffer.status == "play")
    {
        buffer.stop();  // 現在再生中なら停止します
        cancelAlarm();  // アラームを解除します
    }
}

これでいいかな?
ん、OK。これは前にも同じようなスクリプト書いてるから簡単だったかな。
うん。
これはすぐにできたよ。
最後は action メソッド なんだけど…
ちょっと長くなりそうだから、次回作ることにするね。
あ、そうなの?
うん。
というワケで、また次回ね〜。


前へ | TOP | 次へ