[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/02/04(Fri) 16:49
投稿者名:たすけて〜
Eメール:
URL :
タイトル:
Inet コントロールについて
お世話になります。

InetコントロールのExecuteでURL(.cgi)にPOSTでパラメータを渡して、
返ってきた文字列をWebBrowserコントロールで表示しようとしているのですが、
一度目の起動(WwbBrowserが立ち上がっていない時)はうまく行くのですが、
立ち上がってるときに再び同じ処理をしようとすると、
文字列が完全に取得できておらず、うまく表示できません。

どう対処していいかわからずここに質問を投げてみました。

Public gStr       As String
Public Function getXML(ByVal strURL As String, ByVal strData As String) As String
    Dim strURL As String
    Dim strData As String

    'POST処理
    Call Inet.Execute(strURL, "POST", strData)
    DoEvents

    '終了まで待つ
    Do While LenB(gstrRet) = 0
        Call Sleep(100)
        DoEvents
    Loop

    '戻値のセット
    getXML = gStr  ←文字列が途中までしか取得できていない
End Function

'**********************************************************
'   接続状態変化時の処理
'**********************************************************
Private Sub Inet_StateChanged(ByVal State As Integer)
    Dim strBuf      As String
    Dim strXML      As String
    
    If State = icResponseCompleted Then
        strBuf = Inet.GetChunk(1024, icString)
        Do While LenB(strBuf) > 0
            strXML = strXML & strBuf
            strBuf = Inet.GetChunk(1024, icString)
        Loop
        gStr = strXML
    End If
End Sub

宜しくお願い致します。

投稿時間:2005/02/04(Fri) 18:27
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re: Inet コントロールについて
文字列を取得するループ中に、DoEventsを入れてみるとか。

Do While LenB(strBuf) > 0
    strXML = strXML & strBuf
    strBuf = Inet.GetChunk(1024, icString)
    DoEvents
Loop

投稿時間:2005/02/07(Mon) 09:58
投稿者名:たすけて〜
Eメール:
URL :
タイトル:
Re^2: Inet コントロールについて
返信ありがとうございます。

DoEventsを入れてみましたが駄目でした。

うまく取得できる場合と、出来ない場合の違いがどうもわかりません。
もうすこし調査してみます。


> 文字列を取得するループ中に、DoEventsを入れてみるとか。
>
> Do While LenB(strBuf) > 0
>     strXML = strXML & strBuf
>     strBuf = Inet.GetChunk(1024, icString)
>     DoEvents
> Loop

投稿時間:2005/02/07(Mon) 11:35
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^3: Inet コントロールについて
> '終了まで待つ
> Do While LenB(gstrRet) = 0
> Call Sleep(100)
> DoEvents
> Loop

ここで、ループの条件に使っている変数gstrRetは、Inet_StateChangedの中では
使っていないようですが、どこで使っているのでしょうか?(^^;

もしかすると
> '終了まで待つ
> gStr = ""
> Do While LenB(gStr) = 0
> Call Sleep(100)
> DoEvents
> Loop
だったりして。
違ってたら、ごめんなさい。

投稿時間:2005/02/07(Mon) 16:45
投稿者名:たすけて〜
Eメール:
URL :
タイトル:
Re^4: Inet コントロールについて
ご指摘の通り "gstrRet" は "gStr" の誤りです。

書込みする時に間違いました。実際のソースにはgStrで書いております。
すいません^^;

原因不明のままです(TT)

Inetコントロールは通信した後は、自動で接続を解除してくれますよね?
二度目以降の接続で失敗(文字列をきちんと取得できない)することが多いです。

投稿時間:2005/02/07(Mon) 17:14
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^5: Inet コントロールについて
> ご指摘の通り "gstrRet" は "gStr" の誤りです。
>
> 書込みする時に間違いました。実際のソースにはgStrで書いております。
> すいません^^;

ループの前に私が付け加えた、gStr = "" はどうなったんでしょうか?(^^;
gStr = "" が無いと、一度受信するとgStr <> ""となるのでループを素通り
してしまうのでは?

文字列でうまくいかないなら、バイト配列にしてみる手もあります。
Private Sub Inet_StateChanged(ByVal State As Integer)
    Dim bytHTML() As Byte
    Dim lngLength As Long
    Dim strXML As String

    If State = icResponseCompleted Then
        Do
            DoEvents
            bytHTML() = Inet1.GetChunk(1024, icByteArray)
            lngLength = UBound(bytHTML)
            If lngLength >= 0 Then
                strXML = strXML & strConv(bytHTML, vbUnicode)
            End If
        Loop Until lngLength = -1
        gStr = strXML
    End If
End Sub

投稿時間:2005/02/08(Tue) 09:14
投稿者名:たすけて〜
Eメール:
URL :
タイトル:
Re^6: Inet コントロールについて
Inetで文字列がきちんと取得できないのは、環境の違いで起こっているみたいでした。
他PCではきちんと動作することが確認できました。
自分のPCだけその現象がでるみたいです。
原因はわかりませんが・・・

最近インストールしたSidebarのせいかな?
hhttp://www.forest.impress.co.jp/article/2004/05/13/dsktpsidebar.html

ちなみにバイト配列で取得した場合でも失敗でした。

LESIAさんどうもありがとうございました。
大変参考になりました^^