- ベストアンサー
ラベルの文字色変更
VBでラベルの文字色を透明から黒に徐々にしたいと思ってるんですけど。 For文で作ってみたものの・・・ エラーがでて困っています。 作ってみたFor文を以下に書きます。 For i = 255 To 0 Step -2 Label1.ForeColor = RGB(i, i, i) Next この文の中の RGB(i,i,i) というところがエラーでます。。 どうしたら徐々に色を変化させれるのか教えてください!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
デバッグ作業の際には、Forの内部で。。。等々の、不要な(正常に動作している)個所をそぎ落としていって、最終的にエラー発生の最終的なポイントを特定する事が肝要です。 たとえば、ループの内外関係なく以下の一文だけでも同様のエラーが発生します。 Label1.ForeColor = RGB(0, 0, 0) そこで、RGB関数をヘルプで引くと、Integerを返す関数です。 そのうえで、エラーメッセージと突合せると、ForeColorはsystem.drawing.color型なので、Integer型を設定できないという意味だと読み取れます。 ※「値をsystem.drawing.colorに変換できません」=自動変換できない型の値を代入しようとしています、程度に意訳できます。 それではRGB関数同様に色を指定して、system.drawing.color型の値を作成するにはと言うと system.drawing.colorをヘルプで引くと、FromArgbというメソッドが見つかります。 という事で、以下のように書きなおせばOK Label1.ForeColor = RGB(i, i, i) ↓ Label1.ForeColor = Color.FromArgb(i, i, i) デバッグに必要な切り分け方、ヘルプの情報の当たりの付け方を書いてみました。 ちなみに、#2で書いたように意味のあるコードにする為にはというのを、VB2010で書くと以下の通り Dim i As Integer Dim j As Integer For i = 255 To 0 Step -2 Label1.ForeColor = Color.FromArgb(i, i, i) 'フォームを再描画してラベルの色変えを画面上に反映させる Me.Refresh() '徐々に色が変わっていく様子を見せる為に、待機処理をする '待機時間はループ回数で調整する For j = 0 To 1000 Application.DoEvents() Next Next
その他の回答 (2)
- BellBell
- ベストアンサー率54% (327/598)
コードを見る限り、VB6以前のソースのようですので、そのように解釈してコメントします。 #1の方が書いているように、最終的にはiの値は-1になりますが、stepの値がマイナスで、終了条件が0なのでRGB(-1, -1, -1)は実行されないはず。 実際に、VB6でこのコードを動かしましたがエラーは発生しませんでした。 どちらかと言えば、Label1って名前のコントロールが存在しないなど、別の理由でエラー発生ではないかなという気がします。 とりあえず、何が原因でエラー発生しているのかを調べないことには何も言えません。 たとえば、以下のようなコードに書き直して調査します。 一度、tmpColorに値を格納してから設定するなどの冗長なコードは、エラーの発生個所を明確にする為です。 dim i As Long dim tmpColor As Long '事前にForeColorを設定する Label1.ForeColor = &HFFFFFF MsgBox "ループ開始" For i = 255 To 0 Step -2 'イミディエイトウィンドウにiの値を表示する Debug.Print i tmpColor = RGB(i, i, i) Label1.ForeColor = tmpColor Next MsgBox "ループ終了" ちなみに、エラーが出なくなったとしてもこのコードは無意味です。 あくまでForを使用するのであれば、以下のような感じです。 For i = 255 To 0 Step -2 Label1.ForeColor = RGB(i, i, i) 'フォームを再描画してラベルの色変えを画面上に反映させる Form1.Refresh '徐々に色が変わっていく様子を見せる為に、待機処理をする(待機時間はDoEventsの個数で調整) DoEvents DoEvents ~~~ DoEvents を10000行ぐらい書く ~~~ DoEvents Next 実際には、タイマーを使って徐々に色が変わるように作成するべきですが。
お礼
すいません。 VBのバージョンを書いてませんでしたね。。 今使ってるのはVB2010Betaです。 VB6でやって下さってありがとうございます。 一応、タイマーでやってます!
- bin-chan
- ベストアンサー率33% (1403/4213)
エラーが出たとき、iの値が-1なんじゃない? > For i = 255 To 0 Step -2 -2の差分なので、3,1,-1とループの最終回は-1で実行。 最終回を0でなく1まででやめるか (For i = 255 To 1 Step -2 ね) if文で判断するか。 For i = 255 To 0 Step -2 if i < 0 then Label1.ForeColor = RGB(0,0,0) else Label1.ForeColor = RGB(i,i,i) end if Next かな。
お礼
エラーの内容を書いてませんでしたね。。 すいません。。 エラーの内容は、 iの値をsystem.drawing.colorに変換できません。 っていうエラーです。 どうにかして変換とかできないんでしょうか?
お礼
回答ありがとうございます。 なんとか徐々に色を変えることができました!! 問題解決の仕方等、教えてくださってありがとうございました。