プロが教えるわが家の防犯対策術!

VBでラベルの文字色を透明から黒に徐々にしたいと思ってるんですけど。

For文で作ってみたものの・・・
エラーがでて困っています。
作ってみたFor文を以下に書きます。

For i = 255 To 0 Step -2
Label1.ForeColor = RGB(i, i, i)
Next

この文の中の RGB(i,i,i) というところがエラーでます。。

どうしたら徐々に色を変化させれるのか教えてください!

A 回答 (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
    • good
    • 1
この回答へのお礼

回答ありがとうございます。

なんとか徐々に色を変えることができました!!
問題解決の仕方等、教えてくださってありがとうございました。

お礼日時:2010/02/28 22:09

コードを見る限り、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

実際には、タイマーを使って徐々に色が変わるように作成するべきですが。
    • good
    • 0
この回答へのお礼

すいません。
VBのバージョンを書いてませんでしたね。。
今使ってるのはVB2010Betaです。

VB6でやって下さってありがとうございます。

一応、タイマーでやってます!

お礼日時:2010/02/28 17:35

エラーが出たとき、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
かな。
    • good
    • 0
この回答へのお礼

エラーの内容を書いてませんでしたね。。
すいません。。

エラーの内容は、

iの値をsystem.drawing.colorに変換できません。

っていうエラーです。
どうにかして変換とかできないんでしょうか?

お礼日時:2010/02/28 17:37

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