SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

IEとExcelの連携 - ActiveXObjectを使ったIEとExcelの操作

Webページから抽出したURLを、IEでスライドショー表示する

IEとExcelの連携 - ActiveXObjectを使ったIEとExcelの操作 (2)

ダウンロード source.zip (7.0 KB)

初期化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という関数に、f0f1という関数を投げ込んでいます。

 こんなやり方もありますよというお遊びのサンプルです。setTimeoutがごちゃごちゃとあるのは見にくいという人は、こういった書き方もあります。人によって、もっと見やすい方法があると思いますので、各自の好みで待機処理は行って下さい。

 念のために少し、解説を加えておきます。このwait関数では、待機処理を行う関数と、待機が終わった後に実行する関数をwaitの引数として設定しています。

 このwait関数では、第1引数cFuncが、待機確認用の判定を行う関数になっています。この関数がtrueの値を返せば、待機処理は終了します。また、Timeoutで指定している時間が経過した場合も処理は終了します。そして、cFunctrueを返した場合だけ、第2引数eFuncを実行するようにします。

 それほど難しい処理ではないですので、どういった処理を行っているか、目で追っていってもらえればと思います。最初にwait(関数1,関数2)で呼び出された時に、chkFuncencFuncに関数を保存しておき、その後は、その関数を使って、終了判定と、終了時実行処理を行っています。ちょっと変わった書き方をしてみました。

ボタンの処理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がssStatspanタグ内に実行状態を書き込むようにしています。stopSldShw内のsldShwStopFlgtrueになるまで処理を続けます。

 doSldShw内での処理を簡単に説明します。IEの読み込みが終了しているのなら2秒で次のページに、読み込みが終わっていない場合は4秒で次のページに移動するようにしています。「ページ進行」の部分で、再びdoSldShwを呼び出し、スライドショーを続けるようにしています。

 これで、スライドショーの作成は終了です。では、次のページで全てのプログラムをまとめて示しましょう。

次のページ
まとめ(完成プログラム)

この記事は参考になりましたか?

IEとExcelの連携 - ActiveXObjectを使ったIEとExcelの操作連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1965 2008/01/16 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー