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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0811
axobjIEコンポーネントでページをスクロールするには11解決


axobj

リンク

2008/8/11(Mon) 16:38:14|NO.18053

IEコンポーネントで開いているページを自動的にゆっくりスクロールさせたいのですが、どうすれば良いのでしょうか?
教えていただければ、幸いです。



この記事に返信する


flory

リンク

2008/8/11(Mon) 19:56:27|NO.18059

IEコンポーネントを利用して作成したオブジェクトをプログラムからスクロールするには、
IHTMLWindow2インターフェースのscrollメソッド、scrollByメソッド、scrollToメソッドを利用します。
具体的に言うと、

IWebBrowser2インタフェースのDocumentプロパティでIHTMLDocument2インターフェースを取得する

IHTMLDocument2インターフェースのparentWindowプロパティでIHTMLWindow2インターフェースを取得する

IHTMLWindow2インターフェースのscrollメソッド等を使う

となります。
このscrollメソッド等をrepeat構文等で繰り返し使ってやれば、ページの自動スクロールが実現できるはずです。

ちなみに、オブジェクトの高さを取得するにはIWebBrowser2インタフェースのHeightプロパティを使います。もちろんaxobj命令で指定した高さを変数に保持しておいても良いのですが。
また、スクロールできる範囲(要するにページ本来の高さ)を取得するには、IHTMLDocument2インターフェースのbodyプロパティを使用してbody要素のIHTMLElement2インターフェースを取得し、そのscrollHeightプロパティを使います。


……自分で読み返してみて、これではわかりづらいだろうな〜と思った。
必要であればサンプルも提示しますが?



axobj

リンク

2008/8/11(Mon) 21:13:54|NO.18060

・・・はあ、なんせIEコンポーネントでブラウザ作ったときは「進む」と「戻る」と「移動」しか扱ったこと無いですから・・・・
失礼ですが、サンプルをお願いいたします。



flory

リンク

2008/8/11(Mon) 22:01:00|NO.18063

ほい、サンプルです。

; ; IEコンポーネントを使ったブラウザ ; #define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" #define DISPID_NAVIGATECOMPLETE2 252 cls 1 sdim url,512 url="http://hsp.tv/" objsize 600,24 pos 0,2:mes "URL:" pos 0,26:mes "WEB Browser Sample" pos 40,0:input url objsize 120,24 pos 520,24:button "移動",*wow pos 400,24:button "進む",*go_f pos 280,24:button "戻る",*go_b ////////////////ボタン追加//////////////// pos 160,24:button "自動スクロール",*scroll_auto ////////////////以上//////////////// pos 0,48 axobj ie, "Shell.Explorer.2",640,480-48 num=stat comevent ie_event, ie, "{34A715A0-6587-11D0-924A-0020AFC7AC4D}",*event ; DIID_DWebBrowserEvents2 ie->"Navigate" url *main stop *event ; COMイベント処理 dispid = comevdisp(ie_event) if dispid = DISPID_NAVIGATECOMPLETE2 : gosub *OnNavigateComplete2 return *OnNavigateComplete2 name = ie("LocationURL") objprm 0,name pDoc = ie("Document") name = pDoc("Title") title name delcom pDoc return *wow ie->"Navigate" url goto *main *go_f ie->"GoForward" goto *main *go_b ie->"GoBack" goto *main ////////////////処理追加//////////////// *scroll_auto pDoc = ie("Document") ; IHTMLDocument2インターフェースを取得します。 pBody = pDoc("body") ; body要素のIHTMLElement2インターフェースを取得します。 pPW = pDoc("parentWindow") ; IHTMLWindow2インターフェースを取得します。 objH = ie("Height") message = "オブジェクトの高さは"+objH+"です。" docH = pBody("scrollHeight") message += "\nページ本来の高さは"+docH+"です。" scrollH = docH-objH message += "\nつまり、 "+docH+" - "+objH+" = "+scrollH+" だけスクロールすれば、" message += "ページの一番下に到達します。" dialog message repeat if pBody("scrollTop") >= scrollH:break ; scrollTopプロパティを利用します。 ; このプロパティは現在どれだけ下方向にスクロールされているかを示します。 ; このプロパティとあらかじめ計算しておいたスクロール量を比較し、 ; 一番下に到達しているかどうかを判断します。 pPW->"scrollBy" 0,2 ; scrollByメソッドを利用します。 ; このメソッドは現在の位置から指定したピクセル数だけスクロールさせます。 ; 第一パラメータは水平方向のスクロールのオフセットです。 ; 正数を指定すると右へ、負数を指定すると左へスクロールします。 ; 第二パラメータは垂直方向のスクロールのオフセットです。 ; 正数を指定すると下へ、負数を指定すると上へスクロールします。 wait 10 loop dialog "自動スクロールが終了しました。" ; delcom pPW ; なくてもよさそう。 ; delcom pBody ; delcom pDoc goto *main ////////////////以上////////////////
HSP付属のサンプル(web.hsp)にボタンと処理を追加しただけです。

あと、先のレスに書き忘れていたんですが、現在のスクロール量を取得するにはIHTMLElement2インターフェースのscrollTopプロパティを使います。使うんですが……一部のWebページではなぜかうまく取得できません……。上のサンプルではscrollTopプロパティで自動スクロールを終了するかどうか判定しているので、うまく取得できないと自動スクロールが終わらないのです。
そういうわけで、自動スクロールの終了条件は別のものにした方が良いかもしれません。



axobj

リンク

2008/8/12(Tue) 13:22:36|NO.18071

なるほど。分かり易くコメントまで入れていただいて、ありがとうございます。
別な終了条件とは、例えばループの回数からどの程度スクロールしたかを割り出して終わっ
たかどうか判断する、とかですか?



flory

リンク

2008/8/12(Tue) 18:28:04|NO.18078

>別な終了条件
まあ適当に考えればいいですよ。「自動スクロール」ボタンを押すとスクロールが始まり、もう一度押すと止まるとか。
「ループ回数からスクロール量を割り出す」ですか。これではスクロール量しかわかりませんから、応用範囲が狭いですね。やはり現在のスクロール位置を取得しないと厳しいです。

で、scrollTopプロパティでうまく取得できない原因がわかりました。HTMLのDOCTYPE宣言に影響されるそうです。
参考→http://diaspar.jp/node/47
このことを踏まえて、NO.18063のサンプルの「処理追加」部分を以下のスクリプトと差し替えるとうまく動作します。

*scroll_auto pDoc = ie("Document") pBody = pDoc("body") if pDoc("compatMode") = "CSS1Compat" { ; compatModeプロパティを利用します。 ; この値が"CSS1Compat"であれば、document要素のscrollTopプロパティを、 ; "BackCompat"であればbody要素のscrollTopプロパティを利用します。 pElm = pDoc("documentElement") } else { pElm = pBody } pPW = pDoc("parentWindow") scrollH = pBody("scrollHeight")-ie("Height") repeat if pElm("scrollTop") >= scrollH:break pPW->"scrollBy" 0,2 wait 10 loop dialog "自動スクロールが終了しました。" goto *main
これで現在のスクロール位置がわかりますから、応用の幅が広がるでしょう。



flory

リンク

2008/8/12(Tue) 18:33:00|NO.18079

連投失礼します。
ちょっと追記。
compatModeプロパティはIE6か7が必要です。未確認ですが、IE5以前だと正しく動作しないと思います。また、IE8ではこのプロパティは非推奨になる予定です。なんとも短い寿命ですね。



axobj

リンク

2008/8/12(Tue) 18:55:23|NO.18081

はい、ありがとうございます。
自分に知識が無いばかりにやたらと細かく質問してしまいましたが、分かり易く解説していただき、ありがと
うございました。



axobj

リンク

2008/8/20(Wed) 19:46:29|NO.18526

あの、前のスレ上げてしまって申し訳ないんですけど、ページを開いたらすぐに自動スクロール始まるようにはできませんか?
buttonをgosubに変えただけでは動作しないのです。



inovia

リンク

2008/8/20(Wed) 20:34:33|NO.18535

こんな感じにすれば動くかな?
長くなるので変更点だけを書いておきます。前後の部分も入れてあります。


#define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" #define DISPID_NAVIGATECOMPLETE2 252 #define DISPID_DocumentComplete 259//追加


////////////////ボタン追加//////////////// pos 160,24:button gosub "自動スクロール",*scroll_auto//変更


; COMイベント処理 dispid = comevdisp(ie_event) if dispid = DISPID_NAVIGATECOMPLETE2 : gosub *OnNavigateComplete2 if dispid = DISPID_DocumentComplete : gosub *OnDocumentComplete//追加 return *OnDocumentComplete//追加 gosub *scroll_auto//追加 return//追加 *OnNavigateComplete2


dialog "自動スクロールが終了しました。" return ////////////////以上////////////////



inovia

リンク

2008/8/20(Wed) 20:46:52|NO.18537

見にくいですね・・・
こっちのほうがいいかも。
http://tkooler.moe.hm/iescroll.hsp



axobj

リンク

2008/8/21(Thu) 12:19:36|NO.18589

ありがとうございます!
コンテストに投稿する作品の一部なので、スペシャルサンクスに皆さんの名前入れときます。



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