IEのビジー状態、オブジェクトの状態を取得(busy, readyState)

InternetExplorerがビジー状態なのか、
操作可能な状態なのかを判別します。

・busy
IE.busy = True / False

・readyState
IE.readyState = 0~4

busy
・True・・・ビジー状態である
・False・・・ビジー状態ではない

readyState
・0・・・初期化未完了状態(READYSTATE_UNINITIALIZED)
・1・・・ロード中状態(READYSTATE_LOADING)
・2・・・ロード完了状態(READYSTATE_LOADED)
・3・・・操作可能状態(READYSTATE_INTERACTIVE)
・4・・・全データ読込完了状態(READYSTATE_COMPLETE)

ビジー状態とは、オブジェクトの状態とは?

IE.navigate(URL)で、指定のURLにアクセスできることは既に説明しました。
しかし、URLを指定しアクセスしたからと言って、直ぐにデータが使用できるとは限りません。
インターネットの回線が重かったり、ページのデータ(画像とか)がたくさんあったりする場合、
ページにアクセスしてもなかなか表示がされませんよね。
そんな状態で次の処理を行ったらどうなるでしょう。
ページの読込が全部終わってないのに、「××のデータを××して」と
スクリプトに命令があっても、「そんなデータはページにないよ(本当はあるけど、まだ読込が終わってない)」
とエラーが返ってしまうことになりかねません。

ページの読込が終わるまで待つにはどうしたらよい?

例えば、UWSCのSLEEP(20秒)等、長めに待ってみましょうか。
でもそれってすごく不安定な処理ですよね。
回線やページの重さっていつも一定ではないです。
指定時間より長くかかってエラーになったり、
逆にあっという間に終わってしまい、余計な時間待たされたりすることも。
そこで、IEの状態を取得し、「読込状態」が終わったら次の処理に移るという、
スマートな処理にする方法を使いましょう。
※SLEEPも使いますが最短0.1秒でOK

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = True
IE.navigate("http://canal22.org")
REPEAT
 //0.1秒待つ
 SLEEP(0.1)
UNTIL !IE.busy AND IE.readyState = 4
MSGBOX("読込完了!")

どうでしょうか。
実際にページにアクセスしても、
画像などを読み込んだりしているため、きちんと待機していることが分かります。
全ての読み込みが終わったら「読込完了!」のメッセージが表示されます。

busyとreadyStateは何を表す?

busyは英語のビジーです。
オブジェクトが何か別の処理をしていて、「ビジー状態」のときはIE.busyはTrueを返します。
readyStateはオブジェクトがデータを読込しているときの状態を数値で返します。
「0」は「まだ初期化すらしてないよ」という状態、
「1」は「読込中」、「2」は「読込<は>終わった」状態です(読込だけは終わった状態)
「3」は更に一歩進んで、とりあえず「操作はできますよ」という状態です。
砂時計とカーソルの両方が出ているアイコンが出ている状態と思えばOKです。
そして読込は全て完了、自由に操作もできますよという状態が「4」です。
と言うわけで、ループ文の条件は下記の意味となります。

 !IE.busy //IE.busy = Falseと同じ。つまり「ビジー状態」じゃ無くなったらという意味
 IE.readyState = 4 //読込完了した状態 = 4になったら、という意味

ビジー状態とオブジェクトの状態の遷移を見てみよう

それでは、ビジー状態とオブジェクトの状態の遷移を見てみましょう。
以下のスクリプトは2つのIEオブジェクトを立ち上げ、状態の遷移をPRINTしています。
なお、待機状態を判別するループ文はWHILE-WENDでも実現可能ですので
そのパターンも書いてみました。
両者の違いを比べてみるのもいいでしょう。
スクリプトは以下のようになります。

この投稿の続きを読む »

タグ

2012年7月2日 | コメントは受け付けていません。 |

カテゴリー:UWSCとInternetExplorer

このページの先頭へ