初期化3 - 待機処理
さて、初期化の最後の部分です。ここまで終われば、スライドショーのアプリケーションは半分以上できたも同然です。というわけで、「初期化1」の処理の続きのソースコードを書いていきます。
:
:
//==== URL読み込み ===============================================
//
IE.Navigate( csvArry[nowViewNo][datUrl] );
//==== 終了処理 ==================================================
//
wait(
function f0() {
// 待機処理終了条件
if ( ! IE.Busy ) return true;
return false;
},
function f1() {
// 終了時実行処理
IE.Document.focus();
focus();
}
);
}
// 待機処理用変数
var Timeout = 10 * 1000; // 最大タイムアウト時間(10秒)
var WaitTime = 500; // 待機時間
var WaitCnt = 0; // 待機カウント
var chkFunc; // 待機処理確認用関数
var encFunc; // 待機処理終了時実行用関数
// スライドショー用変数
var nowViewNo = 0; // 現在の表示ページ番号
var sldShwStopFlg = false; // スライドショー停止フラグ
function wait( cFunc, eFunc ) {
if ( cFunc ) { chkFunc = cFunc; }
if ( eFunc ) { objFunc = eFunc; }
if ( chkFunc && chkFunc() ) {
WaitCnt = 0;
if ( objFunc ) objFunc();
return;
}
if ( WaitCnt > Timeout ) {
WaitCnt = 0;
return;
}
WaitCnt += WaitTime;
setTimeout( "wait()", WaitTime );
}
プログラム自体は非常にシンプルですが、ちょっと見慣れない処理を行っています。前回はExcelのwait関数を使って待機しましたが、今回は他の方法で行ってみようと思います。
ここでは、IE.Navigateの処理が終了するまで、処理を待って、ウィンドウを前面に出す処理を書いています。その方法として、waitという関数に、f0とf1という関数を投げ込んでいます。
こんなやり方もありますよというお遊びのサンプルです。setTimeoutがごちゃごちゃとあるのは見にくいという人は、こういった書き方もあります。人によって、もっと見やすい方法があると思いますので、各自の好みで待機処理は行って下さい。
念のために少し、解説を加えておきます。このwait関数では、待機処理を行う関数と、待機が終わった後に実行する関数をwaitの引数として設定しています。
このwait関数では、第1引数cFuncが、待機確認用の判定を行う関数になっています。この関数がtrueの値を返せば、待機処理は終了します。また、Timeoutで指定している時間が経過した場合も処理は終了します。そして、cFuncがtrueを返した場合だけ、第2引数eFuncを実行するようにします。
それほど難しい処理ではないですので、どういった処理を行っているか、目で追っていってもらえればと思います。最初にwait(関数1,関数2)で呼び出された時に、chkFuncとencFuncに関数を保存しておき、その後は、その関数を使って、終了判定と、終了時実行処理を行っています。ちょっと変わった書き方をしてみました。
ボタンの処理1 - 進む、戻る
ここは非常に単純です。プログラムを掲載し、簡単な解説を加えて済ませようと思います。
function goPage () { //==== 進行処理 ================================================== // nowViewNo = ( nowViewNo + 1 ) % csvArry.length; f.dataNow.value = ( nowViewNo + 1 ); f.url.value = csvArry[nowViewNo][datUrl]; IE.Navigate( csvArry[nowViewNo][datUrl] ); } function backPage () { //==== 後退処理 ================================================== // nowViewNo --; if ( nowViewNo < 0 ) nowViewNo = csvArry.length - 1; f.dataNow.value = ( nowViewNo + 1 ); f.url.value = csvArry[nowViewNo][datUrl]; IE.Navigate( csvArry[nowViewNo][datUrl] ); }
特に難しいところはどこにもないと思います。[進む]ボタンを押した時にgoPageが呼び出され、[戻る]ボタンを押した時にbackPageが呼び出されます。それぞれ、1ページ進む処理と、戻る処理を行っています。
ボタンの処理2 - スライドショー
最後はスライドショー部分です。ここは、先ほど作ったwait関数を使っています。setTimeoutで直接書いても構いません。以下、プログラムを示して、解説していきます。
function doSldShw () { //==== スライドショー実行 ====================================== // document.getElementById("ssStat").innerText = "スライドショー実行中"; goPage(); wait( function f0() { //==== 読み込み待機 ========================================== // if ( ( ! IE.Busy && WaitCnt >= 2000 ) || WaitCnt >= 4000 ) return true; return false; }, function f1() { //==== ページ進行 ============================================ // if ( sldShwStopFlg ) { sldShwStopFlg = false; return; } doSldShw(); } ); } function stopSldShw () { //==== スライドショー停止 ====================================== // document.getElementById("ssStat").innerText = "スライドショー停止"; sldShwStopFlg = true; }
処理はほとんどありません。それぞれの処理の冒頭で、idがssStatのspanタグ内に実行状態を書き込むようにしています。stopSldShw内のsldShwStopFlgがtrueになるまで処理を続けます。
doSldShw内での処理を簡単に説明します。IEの読み込みが終了しているのなら2秒で次のページに、読み込みが終わっていない場合は4秒で次のページに移動するようにしています。「ページ進行」の部分で、再びdoSldShwを呼び出し、スライドショーを続けるようにしています。
これで、スライドショーの作成は終了です。では、次のページで全てのプログラムをまとめて示しましょう。
