DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ProgressChangeについて

分類:[全般]

はじめまして!
VB6.0のProgressChangeイベントについて教えてください。
ダウンロードの進行状況をProgressChangeで検知し、ProgressBarで表示しようとしているのですが、うまくいきません。
具体的には以下のようなコードなのですが、

Private Sub brwWebBrowser_ProgressChange(ByVal Progress As Long, ByVal ProgressMax As Long)
On Error Resume Next

If Progress = -1 Then
ProgressBar1.Value = 100
Exit Sub
End If
ProgressBar1.Max = ProgressMax
ProgressBar1.Value = Progress
ProgressBar1.Refresh

End If
End Sub

取得するProgressがProgressMax(10000)に比べて小さいのです。
重たいページでもProgressの値は大体0〜500ぐらいで、上記コードだと
最高でも500/10000程度になり、ProgressBarは1メモリ or Maxメモリと言う感じになってしまいます。(しかも値は50ずつしかあがりません)
色々なサイトで調べてみましたが、どうしてこうなるのか分かりません。
何か使用方法が違うのでしょうか?

VB初心者の私を助けてください。
お願いします。
> 取得するProgressがProgressMax(10000)に比べて小さいのです。

helpによると、

The container can use the information provided by this event to display the number of bytes downloaded so far or to update a progress indicator.

To calculate the percentage of progress to show in a progress indicator, multiply the value of Progress by 100 and divide by the value of ProgressMax (unless Progress is -1, in which case the container can indicate that the operation is finished or hide the progress indicator).

とあるので、
「Progress に 100 を掛けて、ProgressMax で割る」
って進捗率を計算し、それをValueにいれるのでは?
(ProgressBar1.Max = ProgressMax とはせずに百分率として使う)

……にしても、50ずつなら50*100/10000 = 50% * 100 = 50
ProgressBar1.Value = 50
なんか荒いですねぇ。。。(^^; 違うかも。
お返事ありがとうございます!

下記の方法でやってみましたが、やっぱり結果は同じでした。。。。
で、色々試してみてわかったことがひとつあります。
WebBrowserで読み込んでいるページは A|B と言う感じでフレームを切ってあるのですが、
一番最初にページを読み込んだ時のみ、Progressの値は正常に取れているようです。
その後のページはBの部分に読み込ませているのですが、もしかしてフレームを切っていることが原因なのでしょうか???

VBって難しいです・・・・

>>取得するProgressがProgressMax(10000)に比べて小さいのです。
>
> helpによると、
>
> The container can use the information provided by this event to display the number of bytes downloaded so far or to update a progress indicator.
>
> To calculate the percentage of progress to show in a progress indicator, multiply the value of Progress by 100 and divide by the value of ProgressMax (unless Progress is -1, in which case the container can indicate that the operation is finished or hide the progress indicator).
>
> とあるので、
> 「Progress に 100 を掛けて、ProgressMax で割る」
> って進捗率を計算し、それをValueにいれるのでは?
> (ProgressBar1.Max = ProgressMax とはせずに百分率として使う)
>
> ……にしても、50ずつなら50*100/10000 = 50% * 100 = 50
> ProgressBar1.Value = 50
> なんか荒いですねぇ。。。(^^; 違うかも。
>
BeforeNavigate2イベントでフレームが分かれていることを識別できる
かもしれません。
(このイベントは.net版ではバグっていて来ないらしい。
http://support.microsoft.com/?kbid=311298)

しかし、IEのプログレスバーの動きもかなりいい加減な動きをしている
ので、どのみちProgressChangeで精度の高い進捗率を求めるのは無理で
はないでしょうか。
これは私見ですが、ProgressChangeイベントの用途は、ユーザに正確な
進捗率を伝えるためにあるのではなく、バーを動かすことにより、待ち
時間のイライラを減少させ、かつ、動いていれば一応何かしらの処理は
進んでいるのだなぁとフリーズしていないことを示す気休め程度のもの
と考えておくのが正解だと思います。

DOBON.NET | プログラミング道 | プログラミング掲示板