- ベストアンサー
[VB6]プログレスバーコントロールの使用法について
- VB6.0+SP5でのプログレスバーコントロールの使用法について質問です。データベースからレコードセットを取得する関数myFunctionを作成し、処理の進捗に合わせてプログレスバーを表示したいと考えています。プログレスバーコントロールを設置したフォームを呼び出し、繰り返し文の中でプログレスバーの値を変更する方法がわかりません。
- myFunctionはクエリを受け取り、データベースからレコードセットを取得します。まず、レコードの件数を取得するために、SELECT COUNT(*)を実行します。その後、プログレスバーの最大値をレコード数とし、繰り返し文でレコードを取得しながらプログレスバーの値を更新します。
- もし他のスマートな方法があれば、教えていただきたいです。また、今回の方法において改善点があれば教えていただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ソースを見る限りだとレコード件数分だけ「何か」させたいのですよね?で、1件処理したらプログレスバーをびょーんって伸ばしたいんだと思うのですが...違います? 1.プログレスバーの使い方はよいようですが、minも設定することをおすすめします。 2.「繰り返し文の中身をどう記述して良いものかわかりません。」 →繰り返し文とはfor文のところを指していますよね。何をさせたいか分からないので答えようがありません。申し訳ないです。ひょっとして、自作関数の使い方を聞いてます? 3.「また、もっとスマートな方法があれば、そちらも教えていただけると助かります。」 →私なら、myFunctionはRecordsetではなく件数を返すようにします。あとはこんな感じかな? ----------------- 'プログレスバーフォーム表示 load frm_progressBar frm_progressBar.show with frm_progressBar.ProgressBar1 .min = 0 .max = myFunction(ぱらめた) .value = 0 end with '件数分だけぐるぐる回す(.max-1しているのは0から開始しているため) for i = 0 to frm_progressBar.ProgressBar1.max-1 step 1 'レコード取得 <<処理ロジック>> 'プログレスバーをびょーんって伸ばす frm_progressBar.ProgressBar1.value += 1 next i ----------------- さらにやるなら、frm_progressBarに「let property」でプロパティを作り、それを使ってカウントアップやmin/max値を設定できるようにするくらいです。
その他の回答 (1)
- yamada_28
- ベストアンサー率43% (21/48)
なるほど理解しました。 自作関数はmax件数を取得するだけなのですね。 RecordsetオブジェクトにRecordCountというのがありますので、これで件数を取得することができます。 →http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpado260/htm/mdprorecordcount.asp なので、自作関数でselect count(*) ~ではなく、select 項目名~でRecordsetを取得しましょう。で、maxプロパティにはq_rs.RecordCountで件数を設定し、あとは参考URL(vbaですが、基本的に一緒です)にあるとおり Do Until RS.EOF debug.pring RS!フィールド名 RS.MoveNext Loop でReccordsetのEOFまでまわせばOKです。
お礼
お礼が遅くなってしまいました。 どうにも私の説明のしかたがまずかったみたいで、お手数ばかりかけてしまいました。 要はDBにクエリを投げて、それを取得するまでにかかる時間を計りたかったのです。 あの後資料をみれば、やはり無理っぽいとのことでした。
お礼
回答ありがとうございます。 説明が不足していました。 関数myFunctionはDBにクエリを投げて結果を取得する為に作成しました。 レコードの件数がそれなりに多いので↓の行でそれなりに時間がかかってしまいます。 p_rs.Open query, con, adOpenStatic ...(*) そこで処理の進捗をグラフィカルに表示できないか?と思いこのような質問をした次第です。 つまり、回答者様がおっしゃるように >1件処理したらプログレスバーをびょーんって伸ばしたいということです。 関数myFunction中でレコード件数を取得しているのは、プログレスバーのmaxに利用するためだけであり、 実際の処理では必要ありません。(質問の際に分離するのを忘れていました。) レコード取得の進捗と、カウンタを繋げてFOR文を書けば良いというのも理解できます。 わからないのはループの中に「レコード1件の取得」をどのように記述すれば良いのか、ということです。 上記(*)のような書き方であれば、一行で全件のレコードを取ってきてしまうと思います。