下記のコードを実行してみます。

Private Sub Command1_Click()
ProgressBar1.Visible = True
Label1.Visible = True
ProgressBar1.Max = Val(Text1.Text)
For i = 1 To Val(Text1.Text)
Text1.Text = i
ProgressBar1.Value = i
Next i
MsgBox "終了しました。"
ProgressBar1.Visible = False
Label1.Visible = False
End Sub

「ProgressBar1」はループに入る前に「Visible = True」になります。
「Label1」はループ終了後に「Visible = True」になります。
「Text1.Text = i」はループ終了後に表示されます。

本来は、「Label1」はループに入る前に「Visible = True」にして、「Text1.Text = i」をループ中に表示させたいのですが、できません。
どこかコードが間違っているのでしょうか。

A 回答 (2件)

ループ内に


doevents
をいれてみたら、どうでしょか?
    • good
    • 0
この回答へのお礼

できました。 有り難うございます。

お礼日時:2001/12/10 09:13

Windowsのプログラムというのは、OSからイベントで駆動され、プログラムでの処理が終わってからOSに制御を返します。


そのため、基本的にはひとつのイベント内で、他のイベントが発生するような処理は思うように行かないことがあるのです。
(ここでは詳しくは説明しきれませんが...)
ykkw_2001さんのおっしゃる「DoEvent」ステートメントは、このひとつのイベント内での連続処理中に、一度、プログラムが制御を手放してWindowsに処理をするタイミングを与えるための命令です。
お試しください。
    • good
    • 0
この回答へのお礼

>他のイベントが発生するような処理は思うように行かないことがあるのです。
...どうも、そのようですね。
しかしながら、
「ProgressBar1」がループ前に「Visible = True」
「Label1」がループ終了後に「Visible = Truue」
同じループに入る前なのに・・・・って思ってしまうのは素人考えでしょうか。
昔のBASICは必ず行の上から実行されていたので、なんとなく不思議でした。
これが、VBのバグなのか、WinOS自体の仕様なのかとの疑問もありましたが「DoEvents」が用意されているということは、WinOS自体の仕様なのでしょうね。
よくわかりました。 有り難うございました。

お礼日時:2001/12/10 09:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QLabel2.visible=false

任意の関数式を入れるとグラフを描くプログラムを作りました。表示するのに時間がかかる(といっても1秒程度ですが)ので「計算中!」と赤で表示させ、グラフが描き終わると消したいと思い、グラフ開始時にLabel2.Visible=True、終了時にLabel2.Visible=Falseを付けましたが、思惑通りには行きません。何故でしょう。おわかりになる方、教えてください。

Aベストアンサー

.NET以降,DoEvents (System.Windows.Forms.Application.DoEventsメソッド) の使用は推奨されません。
DoEventsはVB6までやVBAのような,マルチスレッドが扱えない言語における代替策でしかなく,
長時間かかる処理 (だいたい50ms:WinRT APIにおける非同期処理の目安) を超えるようであれば,その処理はバックグラウンドスレッドで処理すべきです。

VB 2005以降であれば,BackgroundWorkerコンポーネントをFormに配置し,
・Label2.Visible = False後,配置したBackgroundWorkerのRunWorkerAsyncメソッドを呼び出す
・グラフの点の計算をBackgroundWorkerのDoWorkイベントに記述する。
※このイベントの中で,Formのコントロールやコンポーネントに触ることができないので注意して下さい。
・BackgroundWorkerのRunWorkerCompletedイベントで,グラフの描画やLabel2.Visible = Trueを行う。
という方法で処理を行います。
# VB 2012以降で.NET 4.5以降をターゲットとする場合では,Async/Awaitを使う方法が推奨されます。

ref) MSDN: 方法 : バックグラウンドで操作を実行する
http://msdn.microsoft.com/ja-jp/library/hybbz6ke.aspx

.NET以降,DoEvents (System.Windows.Forms.Application.DoEventsメソッド) の使用は推奨されません。
DoEventsはVB6までやVBAのような,マルチスレッドが扱えない言語における代替策でしかなく,
長時間かかる処理 (だいたい50ms:WinRT APIにおける非同期処理の目安) を超えるようであれば,その処理はバックグラウンドスレッドで処理すべきです。

VB 2005以降であれば,BackgroundWorkerコンポーネントをFormに配置し,
・Label2.Visible = False後,配置したBackgroundWorkerのRunWorkerAsyncメソッドを呼び...続きを読む

Q特定のキーを入力すると、visible=falseからtrueになるよ

特定のキーを入力すると、visible=falseからtrueになるようにコーディングしたいのですがうまくいきません。次のようにalt+F12でFrameを表示させたいのですが全く反応しません。何故でしょう。

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyF12
If Shift = vbAltMask Then
Frame2.Visible = True
End If
End Select
End Sub

アドバイス願いますm(_ _)m

Aベストアンサー

フォームのKeyPreviewプロパティがTrueになっているか確認してみては?

Qデザイン時のVisible=Falseは実行時に変更できない?

VB2008です。

フォームデザイン時に、コントロールのVisibleをFalseに設定していると、実行時にTrueに設定してもコントロールが見えません。(実行時エラーも出ません。)

私の環境では、ほぼすべてのコントロールが同じ挙動をします。
もちろん、デザイン時にVisibleをTrueにしておいて、実行時にコードでFalseにすると見えなくなりますし、Trueを与えてやると再度見えるようになります。

これは、言語の仕様なのでしょうか。

Aベストアンサー

2008は使ったこと無いけど、…Visibleは「いつ」変更してますか?
FormのLoadイベントなんかだと、Loadイベントの処理が「終了した直後」に
Formが初期化されるので、Load中に変更を加えようとしても無駄になりますよ。
(たぶん、New(コンストラクタ?)でやっても同じ事だと思います)
もし そうであれば、
・FormのShownイベントに記述する
・Loadイベント中でMe.Showを実行し、その後でVisibleを変更
のいずれかで変更可能かと思います。

的外れだったらすみません。

QFOR文でtext1,text2,text3...などとどうやって処理させればいいのですか

超初心者な質問ですみません。
たとえばFOR文を使ってtext1~10まで連続に処理させるには
どういったコードを記述すればよいのでしょうか?
初心者用の本やHPを探しても見当たりませんでした。
お願いします。

Aベストアンサー

textエリアをインデックス配列にすればいいです。
Text1のエリアをファーム上でコピーし、貼り付けると
Text1(0)~ Text1(9) の配列になります。
それを
 
(例)

i =0
for i=0 to 9
text1(i) = x
next

のようにすればいいです。

Qtextbox.textやlabel.captionの型変換について

VB6.0を使用しています。
テキストボックスやラベルに値として数字を入れているのですが、これらの値に数字で加算減算する場合・・・

●宣言部でintegerを宣言する又は、

●string型で宣言してからプロシージャ内でCint(textbox.text)やCint(label.caption)のように変換するのとどう違うのでしょうか?

Aベストアンサー

宣言部でintegerを宣言した変数でも、textboxやlabelに放り込む時点で、テキスト型にキャストされてます。

また逆に、textbox.textやlabel.captionをそのまま数値計算式に放り込んで計算できたりするのは、「それらが数値だった場合、数値型にキャストする」といった処理が暗黙のうちに行われているためです。

VB6.0に限れば別に問題の無い話かもしれませんが、自身の将来的なことも見越すならば、明示的な型変換はなるべく心がけるようにしたほうがよいと思います。
textbox.textやlabel.captionの値を計算式に用いる場合は、CintやClngで型変換するようにしましょう。


人気Q&Aランキング

おすすめ情報