VB6でループができないです。
明日までにどなたか教えてください><;
まず、意味がわかる文章を書かないと、まったく先に進みませんよ
単なるループならFor 〜 Next、Do 〜 Loopなどがあります
すみません^^;
えっとpictureの透過はできているんですが。
ループのプログラムがわからなくて^^;
いろいろ試してみましたができなくて
Do〜loop、for〜Nextなどはいろいろ試しましたが
どうにもループしなくて困っています><
> pictureの透過
が、ループとどう関係するんです?
何をどういう風にループさせようとして、どういうコードを書いてみたら、
どう、上手くいかなかったのか、ちゃんと書いてください。
これじゃ、「ちゃんと、コードを書けば動きますよ」としか、答えようがありません・・・
透過はスクリーンセーバ作ってるので後に透過しないといけなかったからで透過しています
ループはコードがまったくわからないのです><
たとえば1の地点から2の地点に行ったらまた1の地点の戻ってきてまた
2の地点に行っての繰り返しを無限ループをしたいのです
私はVB初心者で本当にコードがわかりません><
> 透過はスクリーンセーバ作ってるので後に透過しないといけなかったからで透過しています
今回の「VB6でpictureBoxをループさせる方法教えてください」と「透過」の関係を尋ねているんですけど・・・
#質問に関係ない事なら書かないでください。話が混乱するだけです。
> 私はVB初心者で本当にコードがわかりません
では、頑張って勉強しましう!
勉強して、自分のレベルを上げるまでは、
自分でできる程度のプログラムで我慢するしかありませんからね。
> たとえば1の地点から2の地点に行ったらまた1の地点の戻ってきてまた
> 2の地点に行っての繰り返しを無限ループをしたいのです
「地点」をどうやって保持しているか分かりませんが・・・例えば、
---------------------------
Do While True
If 地点= 地点1 Then
地点= 地点2
Else
地点= 地点1
End If
' -- 何かの処理
Loop
---------------------------
とか・・・
#念の為。上記は「概念(考え方の例)」であって、実際に動作するコードじゃありません。
先ほどのは、
「地点1と地点2をジャンプ」した場合、
「地点1から地点2へ順に移動」なら、
--------------------------------
s=1
Do While True
If s = 1 Then
For 変数 = 地点1 To 地点2 Step 地点1から地点2への移動量
' 処理
Next
s=-1
Else
For 変数 = 地点2 To 地点1Step 地点2から地点1への移動量
' 処理
Next
s=1
End If
Loop
--------------------------------
こういうのもありですかね。
#念の為。上記は「概念(考え方の例)」であって(以下同文)
うむむ……
出来れば、最初から そのぐらいの質問の仕方が出来るようになりましょう。
小言っぽくなってしまいますが、物事を理論的に(情報を過不足なく)表現して
人に伝えることは、ある意味、プログラマやSEにとっては必要不可欠のスキルかと
思いますので。
(話は逸れるかもしれませんが、慣れたSEだと、他愛の無い会話をしただけで、
相手が技術者として優れているか、だいたい予想が付くそうです)
……で、要は、
「PictureBoxを、ある条件で移動させる(ずらしていく)処理を無限ループさせたい」
んですよね。たぶん。
セーバーとか透過云々は、私は わからないんですが、
「PictureBoxを移動 → PictureBoxのTop、Leftプロパティを変える」
なので、その「プロパティを変える」処理をループさせてください。
どうやら時間も無いそうなので、簡単に、Formを水平に動かすプログラムを
載せておきますので参考にしてください。
<Form1.frm>
Option Explicit
Const MinX As Long = 1500 '100 * Screen.TwipsPerPixelX
Const MaxX As Long = 4500 '300 * Screen.TwipsPerPixelX
Private Sub Form_Activate()
Dim DirectionF As Boolean 'True:右に移動 False:左に移動
Me.Left = MinX 'Formの水平位置初期化
DirectionF = True '始めは右に移動
Do
If DirectionF = True And Me.Left = MaxX Then '範囲の右端に達した際の方向転換
DirectionF = False
End If
If DirectionF = False And Me.Left = MinX Then '範囲の左端に達した際の方向転換
DirectionF = True
End If
If DirectionF = True Then 'DirectionFによって動かす方向を変える
Me.Left = Me.Left + Screen.TwipsPerPixelX
Else
Me.Left = Me.Left - Screen.TwipsPerPixelX
End If
DoEvents 'アプリが「応答なし」になるのを回避
Loop
End Sub
PictureBoxの場合も、これの応用で移動自体は出来ます。
あと、移動速度を変える場合は、タイマ等を使用して、「タイマイベントでループ」する
必要が出てきますが、これについては今は触れないことにします。
(変数のスコープとか説明しなくちゃいけなくなる可能性があるので)
何となく、「初歩をすっ飛ばしてるんじゃないか?」というイメージも受けますが、
出来ればもうちょっと基本的な部分から、キッチリ押さえていく事をオススメします。
ありがとうございます^^
えっと自分のは一回画面の外に消えてそしてもう一回始まったところに戻りまたそれが画面外に消えの繰り返しをしたいのです。
それを無限ループさせたいのです。
よろしくお願いします
えと、退社時間が近いので(汗)とりあえずヒントだけ。
・画面の大きさはScreen.WidthやScreen.Heightで取得可能
・初期位置では左端に隠れて見えないような状態にするなら、
初期位置は -Me.Width
これだけわかれば、あとは応用で何とかなるとは思うんですが……
do
if 画面の外に出たら then
座標を初期化処理
end if
座標の移動処理
DoEvents
loop
としか答えられないような気がする
ありがとうございますm(_ _)m
試して見ます
考え方はわかりましたが・・・
構文がよくわかりません><;
移動もしますが画面外に消えたら戻ってきません・・・
Do〜Loop文使ってみましたがいまいちDo〜Loop文がまだ理解できてないです。
うーん……
とりあえず、出来れば、その「画面外に消えて戻って来ない」状態のヤツでいいので、
書いたコードを見せてみてもらえませんか?
そこから問題点を示した方が、今後のためでも あると思うので。
しばらく後に、もう一度ここを覗いてみますので。
Private Sub Timer4_Timer()
Dim dx As Integer
Dim Picture21 As Integer
dx = 1
Form1.Picture24.Top = Form1.Picture24.Top - ((1 * Rnd) + dx)
Form1.Picture24.Left = Form1.Picture24.Left - ((50 * Rnd) + dx)
saver3
End Sub
Private Sub saver3()
WindowState = 2
Dim x As Integer, y As Integer, w As Integer, h As Integer
x = Picture24.Left 'コピー先の座標
y = Picture24.Top
w = Picture24.Width 'コピー先のサイズ
h = Picture24.Height
'背景(花見)をコピー
Picture24.PaintPicture Form1.Image, 0, 0, , , x, y, , , vbSrcCopy
Picture24.PaintPicture Picture20.Image, 0, 0, w, h, 0, 0, w, h, vbSrcPaint '←追加
Picture24.PaintPicture Picture23.Image, 0, 0, w, h, 0, 0, w, h, vbSrcAnd '←追加
End Sub
今はこんな感じです^^;
これで一応左側に消えますがループができません><
通り巣鴨さんがおっしゃっている、
if 画面の外に出たら then
座標を初期化処理
end if
が見受けられませんが。
#というかこの処理が零さんのいう「ループ」になるのですかね。
座標を初期化する処理のやり方を教えてください・・・
ふむふむ……
確かに、これだと戻ってきませんね。
「画面からはみ出したら下端、または右端に戻す」処理が記述されていないのは、理解できてますでしょうか?
ひたすら引くだけじゃ、戻ってこられませんよ。
Private Sub Timer4_Timer()
Dim dx As Integer
Dim Picture21 As Integer
dx = 1
Form1.Picture24.Top = Form1.Picture24.Top - ((1 * Rnd) + dx)
Form1.Picture24.Left = Form1.Picture24.Left - ((50 * Rnd) + dx)
'ここで、画面からはみ出る(Top < Me.Height、または Left < Me.Width)可能性がある
'はみ出た場合は、最下端または最右端に飛ばす
If Form1.Picture24.Top < Me.Height Then '上に はみ出たら……
Form1.Picture24.Top = Screen.Height '最下端に飛ばす(Screen.Heightが最下端になるのは解りますね?)
End If
If Form1.Picture24.Left < Me.Width Then '左に はみ出たら……
Form1.Picture24.Left = Screen.Width '最右端に飛ばす(Screen.Widthが以下略)
End If
saver3
End Sub
……と、こんな感じでしょうか?
Me.HeightやMe.Widthを使っている意味が解らなければ、Me.HeightやMe,Widthを
試しにゼロに変えて動かしてみてください。
(((1 * Rnd) + dx)、((50 * Rnd) + dx)のところをScreen.TwipsPerPixelY、
Screen.TwipsPerPixelXに変えてみると、もっと解りやすいかも?)
しまった、間違えました、スミマセン。
Me.Height と Me.Width は、マイナスをつけて
-Me.Hwight 、-Me.Width として下さい。
今、VB6入ってるマシン起動してないんでデバッグしてなくて(^^;……失礼しました。
Form1.Picture24.Top = Form1.Picture24.Top - Screen.TwipsPerPixelY
Form1.Picture24.Left = Form1.Picture24.Left - Screen.TwipsPerPixelX
'ここで、画面からはみ出る(Top < Me.Height、または Left < Me.Width
可能性がある
'はみ出た場合は、最下端または最右端に飛ばす
If Form1.Picture24.Top < 0 Then '上に はみ出たら……
Form1.Picture24.Top = Screen.Height '最下端に飛ばす(Screen.Heightが最下端になるのは解りますね?)
End If
If Form1.Picture24.Left < 0 Then '左に はみ出たら……
Form1.Picture24.Left = Screen.Width '最右端に飛ばす(Screen.Widthが以下略)
End If
これで一応上にたどり着いたら消えました
ですが消えた後元の位置に戻りの繰り返しができません。
んーと……
んでは とりあえず、Screen.Height → Form1.Height 、Screen.Width → Form1.Width に
変えてみてもらえますか?
(もしかしたらForm1.ScaleHeightとScaleWidthの方がいいかもだけど)
それと、「元の位置に戻る」というのは、「本当に最初に画像が現れた位置」ですかね?
それとも、下の端に ほとんど隠れた位置? はたまた、下の端だけど完全に画像が見える位置?
その辺の情報を教えて下さい。
あと、多少話は逸れますが、(Me.)WindowState = 2 は、Form_Loadあたりでやっておいて、
それ以降は毎回設定したりしない方がいいと思いますよ。
(しかしいきなりラスタオペレーションですか(汗))
消えた画像は「元の位置に戻る」用にしたいです。
元の位置からまた移動して消えていってからの繰り返しですから
元の位置のほうがいいです。
既にヒントや答えはいっぱい書いていただいているようなのですが?
答えを全部聞きたいのですか?勉強しているのですか?
とりあえず、元の位置を最初にどこかに退避しておいて
一定位置(この場合は画面から消えたら)にきたら、画像の位置を最初に退避した
値をセットしてあげたら、画像は最初の位置にもどってるはずです。
提示されたコードを自分でヘルプなりネットで調べて、実験して
多少は加工してください。
そのほうが掲示板の書込みを待つより確実に早くやりたいことができるとおもいますよ。
書いているのはわかっているのですが
それを実行できないのです><
コードをいろいろ変えながらもしているのですが
うまくいかないのです。
>消えた画像は「元の位置に戻る」用にしたいです。
えぇ、すればいいと思いますが・・・
え?誰かにして欲しいの?
では逆に聞きますが、「元の位置」ってどこですか?
その答えが、貴方の質問の答えです
(略).Top = 元の位置のTop
(略).Left = 元の位置のLeft
もしくは
(略).Move 元の位置のLeft, 元の位置のTop
うーん、とりあえずヒントだけ書いてみます。
まず、私の想像で、やりたい事は
「デザイン時に設定したPictureBoxの位置を初期位置として、移動させて画面から(Formから)
はみ出したら、初期位置に戻す」として、それを前提として書きます。
「デザイン時に設定したPictureBoxの位置を初期位置とする」
↓
「デザイン時の位置を何らかの方法で憶えておく」
事が必要です。
デザイン時のTop、Leftプロパティを定数として定義しておくのも不可では ないですが、
それだと同じ情報が重複してしまい、プログラム修正時にミスが出る可能性が高くなるので、
私が よくやるやり方のヒントを。
・Top、Leftプロパティを憶えておくための「変数」(定数じゃないですよ)を準備
タイマーイベントプロシージャから抜けても憶えておいてもらわないといけないので、
Timer4_Timer() 内での定義ではダメです。
ほとんど答えになってしまいますが、「モジュールレベル変数」として
(厳密には、その他にも やり方はありますが、ここでは割愛)定義してください。
・Form_Loadで、上で定義した変数に、Loadした時点でのPictureBoxのTop、Leftプロパティを代入しておく
……あとは、「はみ出た」条件に引っかかったときの戻り先の位置を設定する際に、
その変数の内容を再利用するだけです。
ありがとうございましたm(__)m
解決しました。
ツイート | ![]() |