HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0530
名無しIEコンポーネントのバグ報告(?)7解決


名無し

リンク

2015/5/30(Sat) 01:49:28|NO.69496

NO.69488・NO.69490・NO.69492にある通り、
「IEコンポーネントでスクロール量取得が正常に行かないことがある」
という不具合が見つかりました。
ただ、これを最小のスクリプトで再現しようとするとなかなか難しいです。
例えば次のコードを実行しようとすると、

;ウィンドウを初期化 screen 0, 640, 480 ;IEコンポーネントを設置 pos 0, 0 axobj ie, "Shell.Explorer.2", 640, 480 ;ページを開く ie->"Navigate" "http://hsp.tv/" ;スクロール量を取得 pDoc = ie("Document") pBody = pDoc("body") pPW = pDoc("parentWindow") scrollH = pBody("scrollHeight") - ie("Height") pPW->"scrollBy" 0, scrollH delcom pDoc stop
私の環境(ASUS K55VD-SX3210Bに64bit版Win7を入れたもの)では

--------------------------- #Error 39 in line 10 (???) 外部オブジェクトの呼び出しに失敗しました ---------------------------
と表示されます。が、

ie->"Navigate" "http://hsp.tv/" ;スクロール量を取得
部分を

ie->"Navigate" "http://hsp.tv/" wait 100 ;スクロール量を取得
と書き換えると、なぜか最後までスクロールするようになります。
ロジック的に正常なのにエラーが出されるとバグにしか見えないのですが、
これはHSP側のバグ? それともIEコンポーネントの仕様?

※wait命令を「forの空ループ」などの重い処理に書き換えても上記のエラーが出ます。
 つまり、wait命令の間にIEの描画が行われていると思われます。
 実際、「wait 50」程度じゃギリギリ描画しきれていましたが、「wait 10」ぐらいに
 すると上記のエラーが出ます。要するに、安全に運用するためには、
 onerrorで捕捉して誤魔化すか、「描画完了を待つ」命令なりAPIなりを模索するか
 しないとダメだということです。



この記事に返信する


名無し

リンク

2015/5/30(Sat) 01:58:31|NO.69499

また、拙作の専ブラでは最初に

ie->"Navigate" "about:blank"
と適当に開いておいてから、作成したHTMLを

pDoc = ie("Document") pDoc->"Open" pDoc->"Write" thread_html pDoc->"Close"
として流し込んでいましたが、この際に「ie->"Navigate" "about:blank"」部分を
消してみると「pDoc = ie("Document")」部分でエラーが出ます。
要するにNavigateしてないIEコンポーネントだとDocumentが使えないようです。
これだけならまだIEコンポーネントの仕様と言い切れますが(良くないけど)、
次のコードで、前述のバグ(NO.69488・NO.69490・NO.69492)が再現出来ました。

;ウィンドウを初期化 screen 0, 640, 480 ;IEコンポーネントを設置 pos 0, 0 axobj ie, "Shell.Explorer.2", 640, 480 ie->"Navigate" "about:blank" ;ページを開く sdim html, 1024 html = "<html><head></head><body>" for k, 0, 100 html += "<p>Hot Soup Processor</p>" next html += "</body></html>" wait 50 ;スクロール量を取得 pDoc = ie("Document") pDoc->"Open" pDoc->"Write" html pDoc->"Close" pBody = pDoc("body") pPW = pDoc("parentWindow") ;aaaa = pBody("scrollHeight") scrollH = pBody("scrollHeight") - ie("Height") pPW->"scrollBy" 0, scrollH delcom pDoc delcom pBody delcom pPW stop
流し込むHTMLが雑いのは許してください。このまま実行すると殆どスクロールしませんが、
22行目のコメントアウトを外すと普通に最後までスクロールできます。なんでだよ!
ちなみに、「aaaa = pBody("scrollHeight")」を「aaaa = pDoc("parentWindow")」や
「aaaa = pDoc("body")」にすると最後までスクロールしません。
また、「scrollH = pBody("scrollHeight") - ie("Height")」を
「scrollH = aaaa - ie("Height")」なんかにしてもスクロールしません。わけがわからないよ!



mamo

リンク

2015/5/30(Sat) 08:04:59|NO.69504

読み込みが不十分な状態でのエラーってだけなんじゃないのかな。

ie->"Navigate" "http://hsp.tv/"
の後に

repeat if ie("Busy") = 0 : break await 15 loop
こんな感じでどうだろ。



名無し

リンク

2015/5/30(Sat) 08:58:54|NO.69507

>mamoさん
ありがとうございます。それで、No.69496については解決出来ました。
ただ、No.69499についてはその対策入れてもダメなんですよね……



deff

リンク

2015/5/30(Sat) 09:17:27|NO.69508

manoさんが先に書かれてますが、navigateやwriteメソッドの後で内容が更新される前に操作するからそうなります
バグでも何でもないです。
>要するにNavigateしてないIEコンポーネントだとDocumentが使えないようです。
>これだけならまだIEコンポーネントの仕様と言い切れますが(良くないけど)、
これも当たり前ですしHSP関係ないです。
更新待つスクリは以下がいいような気がします。
最初にwait入れないと更新開始する前にbusy状態のチェックをしてしまうことがあったような気がするので。
本当はイベントでチェックする方がいいみたいですけど

repeat wait 20 if ie("busy")==0 & ie("ReadyState")==4 :break loop



deff

リンク

2015/5/30(Sat) 09:22:33|NO.69509

修正です
>writeメソッド
closeメソッドです



名無し

リンク

2015/5/30(Sat) 11:29:32|NO.69511

>deffさん
ありがとうございます。これでNo.69499も直りました。

;ウィンドウを初期化 screen 0, 640, 480 ;IEコンポーネントを設置 pos 0, 0 axobj ie, "Shell.Explorer.2", 640, 480 ie->"Navigate" "about:blank" ;ページを開く sdim html, 1024 html = "<html><head></head><body>" for k, 0, 100 html += "<p>Hot Soup Processor</p>" next html += "</body></html>" wait 50 ;スクロール量を取得 pDoc = ie("Document") pDoc->"Open" pDoc->"Write" html pDoc->"Close" repeat wait 20 if(ie("busy") == 0) && (ie("ReadyState") == 4) :break loop pBody = pDoc("body") pPW = pDoc("parentWindow") ;aaaa = pBody("scrollHeight") scrollH = pBody("scrollHeight") - ie("Height") pPW->"scrollBy" 0, scrollH delcom pDoc delcom pBody delcom pPW stop



スペース

リンク

2015/5/30(Sat) 12:38:04|NO.69512

名無しさん、mamoさん、deffさん、有難うございます。
お陰で上手く行きそうです。



ONION software Copyright 1997-2023(c) All rights reserved.