tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルWebにおけるradioボタンの選択について
記事No2658
投稿日: 2005/11/28(Mon) 11:55
投稿者火星の砂
[OSのVer]:Windows xp   [VBのVer]:VB.NET2003

AxWebBrowserで開いたページのradioボタンを選択させる方法を
アドバイスしていただけますか

topというフレームにあるabcdという名前のradioボタンを選択して値 "1"
を選びたいのですが
私が考えついたコードは
AxWebBrowser1.Document.frame("top").elements("abcd").Value = 1
です
実行するとエラーがでます。内容は
  追加情報 : マーシャラの制約 : 文字列が長すぎます。
です

お邪魔するときは質問ばかりで申し訳ございませんが
よろしくご教授ください

  

[ツリー表示へ]
タイトルRe: Webにおけるradioボタンの選択について
記事No2664
投稿日: 2005/11/28(Mon) 21:08
投稿者花ちゃん
下記あたりが参考になりませんか?
hhttp://homepage1.nifty.com/MADIA/vb/vb_bbs/200309_03090093.html

> topというフレームにあるabcdという名前のradioボタンを選択して値 "1"
> を選びたいのですが
具体的な URL と場所を教えて頂ければテストもできるのですが。

[ツリー表示へ]
タイトルRe: Webにおけるradioボタンの選択について
記事No2665
投稿日: 2005/11/28(Mon) 23:26
投稿者魔界の仮面弁士
対象ページのURLがあるとわかりやすいのですが…。

> topというフレームにあるabcdという名前のradioボタンを選択して値 "1"

これが VBScript ベースだとすれば、
  For Each Radio In document.frames("top").document.getElementsByName("abcd")
    If Radio.value = "1" Then
       Radio.checked = True
       Exit For
    End If
  Next
という感じでしょうかね。(未確認)


VB.NET でも同様の手順でいけるとは思いますが、個々のオブジェクトについて、
ReleaseComObject メソッドでの解放処理が必要になる可能性があります。
hhttp://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200511/05110095.txt

[ツリー表示へ]
タイトルRe: Webにおけるradioボタンの選択について
記事No2693
投稿日: 2005/12/02(Fri) 13:25
投稿者火星の砂
レスを頂きありがとうございました
当初は目的ページを保存してオフラインでテストしていたのですが
オンラインで実際のページを開くとその時点で違う動きが始まりまして
試すことすら出来ていません
目的のページは
hhttps://tools.dti.ne.jp/gate/index.html
です。AxWebBrowser1.Navigateでこのページを開くと
新たにブラウザが2つ開いて同じページを表示します(WinXP)
(Win98では実行エラーになり終了です)

対象フレームの名前は top
Radioボタンの名前は dti_point です
dti_pointに value = "1"を指定したいのですが
オフラインでも上手く選択できませんでした

引き続きよろしくお願いします

[ツリー表示へ]
タイトルRe^2: Webにおけるradioボタンの選択について
記事No2705
投稿日: 2005/12/04(Sun) 20:14
投稿者花ちゃん
> 引き続きよろしくお願いします

ところで、No.2665 の魔界の仮面弁士さんのコードは試されましたか。
それでチェックが入りますよ。

[ツリー表示へ]
タイトルRe^3: Webにおけるradioボタンの選択について
記事No2707
投稿日: 2005/12/06(Tue) 07:59
投稿者火星の砂
> ところで、No.2665 の魔界の仮面弁士さんのコードは試されましたか。

頂いたコードをそのまま使いますと
For Each Radio
のRadioが ”名前Radioが宣言されていません”
となりますので
Dim Radio As RadioButton を宣言してみました
すると
If Radio.value = "1" Thenが
'value' は 'System.Windows.Forms.RadioButton' のメンバではありません。
というエラーになってしまいました
申し訳ありません
理解が足りないようです

[ツリー表示へ]
タイトルRe^4: Webにおけるradioボタンの選択について
記事No2708
投稿日: 2005/12/06(Tue) 09:13
投稿者魔界の仮面弁士
> Dim Radio As RadioButton を宣言してみました
型が異なります。HTMLのコントロールと、Windowsフォームのコントロールは別物です。

とりあえずは、「For Each Radio As Object In 〜」などのように、
Object として宣言しておきましょう。もしも厳密な型指定が必要なら、
MSHTML.TLBなどを参照設定する事になります。

[ツリー表示へ]
タイトルRe^5: Webにおけるradioボタンの選択について
記事No2716
投稿日: 2005/12/07(Wed) 15:05
投稿者火星の砂
魔界の仮面弁士さんありがとうございます
お世話になります

AxWebBrowser1.Navigate("hhttps://tools.dti.ne.jp/gate/index.html")

Do While AxWebBrowser1.Document.ReadyState <> "complete"
System.Windows.Forms.Application.DoEvents()
Loop

For Each Radio As Object In AxWebBrowser1.Document.frames("top").getElementsByName
("dti_point")
If Radio.value = "1" Then
Radio.Checked = True
Exit For
End If
Next

としてみましたが
'System.Runtime.InteropServices.COMException' のハンドルされていない例外が
microsoft.visualbasic.dll で発生しました。

となってしまいました。申し訳ありませんがあと少し面倒を見ていただけるとありがたいです
よろしくお願いします

[ツリー表示へ]
タイトルRe^6: Webにおけるradioボタンの選択について
記事No2717
投稿日: 2005/12/07(Wed) 17:11
投稿者花ちゃん
> .Document.frames("top").getElementsByName("dti_point")
  document.frames("top").document.getElementsByName("abcd")

よくコードを見比べて見て下さい。 どこか[抜けて]いませんか?

[ツリー表示へ]
タイトルこちらの方もですね。
記事No2718
投稿日: 2005/12/07(Wed) 17:31
投稿者花ちゃん
hhttp://www.bcap.co.jp/hanafusa/logbbs/wforum.cgi?mode=allread&no=6255#6264

AxWebBrowser1.Navigate("hhttps://tools.dti.ne.jp/gate/index.html")
Do While AxWebBrowser1.Busy
    System.Windows.Forms.Application.DoEvents()
Loop

Do While AxWebBrowser1.Document.ReadyState <> "complete"
    System.Windows.Forms.Application.DoEvents()
Loop

For Each Radio As Object In AxWebBrowser1.Document.frames("top").Document.getElementsByName("dti_point")
    If Radio.value = "1" Then
        Radio.Checked = True
        Exit For
    End If
Next

尚、ReleaseComObject メソッドでの解放処理はしておりませんので、必要により追加して
下さい。

[ツリー表示へ]
タイトルRe: こちらの方もですね。
記事No2719
投稿日: 2005/12/09(Fri) 11:16
投稿者火星の砂
花ちゃん さん ご丁寧にありがとうございました
書いていただいたコードをコピペして実行してみましたら
同様にエラーになり終了確認のメッセージがでました
そこで、「継続」を選び様子をみてみました

実行するたびに
するとRadio.value = "1"にいったんチェックが付くのですが
すぐにRadio.value = "0"の方(既定値)にチェックが戻ってしまいます
なぜでしょうか?

その前に書いていただいた
AxWebBrowser1.Document.frames("top").Document.getElementsByName ...が
AxWebBrowser1.Document.frames("top").getElementsByName...になっていたのは
エラーが続く中、もしや...と思いあえて変えてみた所でした
全く意味が無かったようですね 失礼しました

[ツリー表示へ]
タイトルRe^2: こちらの方もですね。
記事No2722
投稿日: 2005/12/09(Fri) 14:05
投稿者花ちゃん
> 同様にエラーになり終了確認のメッセージがでました

実際に使用したコード(イベント含む)をコピペして投稿して下さい。
どこの部分でどのようなエラーメッセージ(正確に)が表示されたかをすぐ返事
下さい(忘れた頃レスされても....)

[ツリー表示へ]
タイトルRe^3: こちらの方もですね。
記事No2733
投稿日: 2005/12/12(Mon) 10:49
投稿者火星の砂
確認が遅くなり大変失礼しました
今日からは1日2回は確認をしに来れると思いますので
よろしくお願いします
以下に状況をまとめさせていただきます


Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click

AxWebBrowser1.Navigate("hhttps://tools.dti.ne.jp/gate/index.html")
Do While AxWebBrowser1.Busy
    System.Windows.Forms.Application.DoEvents()
Loop

Do While AxWebBrowser1.Document.ReadyState <> "complete"
    System.Windows.Forms.Application.DoEvents()
Loop

For Each Radio As Object In AxWebBrowser1.Document.frames("top").Document.getElemen
tsByName
("dti_point")
    If Radio.value = "1" Then
        Radio.Checked = True
        Exit For
    End If
Next
End Sub

コンパイルは成功し実行すると

'System.Runtime.InteropServices.COMException' のハンドルされていない例外が
microsoft.visualbasic.dll で発生しました。
そこで、「継続」を選び様子をみてみました

するとその後は実行するたびに
Radio.value = "1"にいったんチェックが付くのですが
すぐにRadio.value = "0"の方(既定値)にチェックが戻ってしまいます

以上ですよろしくお願いします

[ツリー表示へ]
タイトルRe^4: こちらの方もですね。
記事No2735
投稿日: 2005/12/12(Mon) 13:53
投稿者魔界の仮面弁士
> AxWebBrowser1.Navigate("hhttps://tools.dti.ne.jp/gate/index.html")
このページは、チェックボックスの値を変更するたびに、HTML内のスクリプトによって、
下半分のフレームの文書が挿し換わるようですね。

挿し換わった直後は、文書の再読み込みと解析処理が必要になるため、
Document オブジェクトを取得しなおす必要があるかも知れません。

このあたりはタイミングの問題になってきますので、ループで待機させるのではなく、
VBらしく「イベント」で処理するようにした方が良いと思います。


> For Each Radio As Object In AxWebBrowser1.Document.frames("top").Document.getElementsByName("dti_point")
一行で書くのではなく、オブジェクトを変数に受けとって処理した方が良いでしょう。

その上でエラーが出るようなら、ページ遷移のタイミングで、COMのオブジェクトが一時的に
切断されてしまったのかも知れません。どのCOMオブジェクトまでは取得できていて、
どのオブジェクトにアクセスした時にエラーになるのかを確認してみては如何でしょう。

[ツリー表示へ]
タイトルRe^4: こちらの方もですね。
記事No2738
投稿日: 2005/12/12(Mon) 15:17
投稿者花ちゃん
前回のコードでも最初の1回ならエラーはでなかったはずです。
2度目以降のクリック時にDo While AxWebBrowser1.Document.ReadyState <> "complete"
の部分が素通りされる為にエラーが起きているようです。
System.Windows.Forms.Application.DoEvents() の1行を入れるか待ち時間等を
作ってやればOKです。
一応、下記コードでも問題は起きないようです。

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
    AxWebBrowser1.Navigate("hhttps://tools.dti.ne.jp/gate/index.html")
    Do While AxWebBrowser1.Busy
        System.Windows.Forms.Application.DoEvents()
    Loop
    System.Windows.Forms.Application.DoEvents()
    '上記がないと2度目以降のクリックで下記が素素通りしてしまう
    Do While AxWebBrowser1.Document.ReadyState <> "complete"
        System.Windows.Forms.Application.DoEvents()
        Debug.WriteLine(AxWebBrowser1.Document.ReadyState)
    Loop
    For Each Radio As Object In AxWebBrowser1.Document.frames("top").Document.getElementsByName("dti_point")
        If Radio.value = "1" Then
            Radio.Checked = True
            Exit For
        End If
    Next
End Sub

[ツリー表示へ]
タイトルRe^5: こちらの方もですね。解決
記事No2739
投稿日: 2005/12/12(Mon) 15:27
投稿者火星の砂
花ちゃん さん 何度も面倒を見ていただきありがとうございました
おかげさまで無事解決しました
魔界の仮面弁士さんもアドバイスありがとうございました
下方のドキュメントに対してもループで待機させようと思っていたので
考え直す事にします
大変お手数をおかけしました

[ツリー表示へ]