Изобразить лодку, которая перемещается слева направо по нижнему краю формы - VB
Формулировка задачи:
Программа - генерация графических объектов .
Компактный набор треугольников одного цвета и квадратов другого цвета произвольно движутся по форме, изменяя размеры только квадратов и общие цвета рисуются с помощью графических методов формы или управляющего элемента PictureBox.
Лодка, которая перемещается слева направо по нижнему краю формы, а при достижении края формы изменяет направление движения, рисуется с помощью массива управляющих элементов Shape или Line.
Перемещение осуществляется по траектории, определенной вариантом и с временной задержкой, определяемой элементом Timer.
С элементом ProgressBar, с помощью которого иллюстрируется полный цикл процесса, проблема. Определяется интервал отображения процесса неверно. В первом случае - при достижении набора краев должен достигаться максимум,а во втором случае - когда лодочка опаздывает, когда ProgressBar видно (с этим проблема появилась после применения его к первому заданию).
Подскажите где ошибка и как исправить, пожалуйста.
Как исправить ошибку?
Решение задачи: «Изобразить лодку, которая перемещается слева направо по нижнему краю формы»
textual
Листинг программы
Option Explicit
Dim xx As Integer, yy As Integer
Dim cv As Integer
Dim iPositon As Integer
Dim iDirection As Integer
Private Sub Command1_Click()
start
End Sub
Private Sub Command2_Click()
Call brake
End Sub
Private Sub Command3_Click()
If MsgBox("Вы уверены ?", vbYesNo + vbQuestion, "Quit") = vbYes Then
Unload Form1
End If
End Sub
Private Sub Form_Load()
Dim i As Integer
For i = 0 To 3
Line1(i).Visible = False
Next i
ScaleMode = 1
SSTab1.Tabs = 2
SSTab1.TabsPerRow = 2
SSTab1.TabCaption(0) = "Задание 1"
SSTab1.TabCaption(1) = "Задание 2"
SSTab1.Tab = 0
InSSTabRazm
Form1.Caption = ""
Command1.Caption = "Пуск"
Command2.Caption = "Стоп"
Command3.Caption = "Выход"
End Sub
Private Sub InSSTabRazm()
Form1.Top = 0
Form1.Left = 0
Form1.Height = Screen.Height
Form1.Width = Screen.Width
SSTab1.Top = Form1.Top + 200
SSTab1.Left = Form1.Left + 3000
SSTab1.Height = Form1.Height - 2000
SSTab1.Width = Form1.Width - 4000
Command1.Top = Form1.Top + 500
Command1.Left = Form1.Left + 100
Command1.Height = 500
Command1.Width = 1500
Command2.Height = 500
Command2.Width = 1500
Command3.Height = 500
Command3.Width = 1500
Command2.Top = Command1.Top + Command1.Height + 300
Command2.Left = 100
Command3.Top = Command2.Top + Command2.Height + 300
Command3.Left = Form1.Left + 100
Picture1.BorderStyle = 0
Picture1.Left = SSTab1.Left - 2960
Picture1.Top = SSTab1.Top + 600
Picture1.Height = Me.ScaleHeight - 3000
Picture1.Width = SSTab1.Width - 90
iPositon = 0
iDirection = 1
ProgressBar1.Top = SSTab1.Top + SSTab1.Height + 200
ProgressBar1.Left = SSTab1.Left
ProgressBar1.Width = SSTab1.Width
ProgressBar1.Visible = False
ProgressBar1.Min = 0
ProgressBar1.Max = ProgressBar1.Width
End Sub
Private Sub start()
Dim i As Integer
ProgressBar1.Visible = True
If SSTab1.Tab = 0 Then
Timer1.Interval = 50
Timer1.Enabled = True
Picture1.Visible = True
Else
For i = 0 To 3
Line1(i).Visible = True
Next i
Timer2.Interval = 20
Timer2.Enabled = True
End If
End Sub
Private Sub SSTab1_Click(PreviousTab As Integer)
If SSTab1.Tab <> PreviousTab Then
Call brake1
End If
End Sub
Private Sub Timer1_Timer()
MkPcBx
End Sub
Private Sub Timer2_Timer()
MkLin
End Sub
Private Sub brake()
If SSTab1.Tab = 0 Then
Timer1.Enabled = False
Else
Timer2.Enabled = False
End If
End Sub
Private Sub brake1()
Dim i As Integer
ProgressBar1.Visible = False
If SSTab1.Tab = 0 Then
xx = 0
yy = 0
ProgressBar1.Value = 0
Timer1.Enabled = False
Timer2.Enabled = False
Picture1.Cls
For i = 0 To 3
Line1(i).Visible = False
Next i
Else
ProgressBar1.Value = 0
Timer1.Enabled = False
Timer2.Enabled = False
Form1.Cls
For i = 0 To 3
Line1(i).Visible = False
Next i
End If
End Sub
Private Sub MkPcBx()
Dim dX As Integer, dY As Integer
dX = Int(Rnd * 500)
dY = Int(Rnd * 100)
If iDirection = 1 Then
If xx + 1800 + dX >= Picture1.ScaleWidth Then iDirection = -1
ProgressBar1.Value = xx + 1600
Else
If xx + 300 - dX <= 0 Then iDirection = 1
ProgressBar1.Value = xx + 300
End If
xx = xx + dX * iDirection
'ProgressBar1.Value = xx + 1600
If iDirection = 1 Then
If yy + 2100 >= Picture1.Height Then iDirection = -1
Else
If yy - 300 <= 0 Then iDirection = 1
End If
yy = yy + dY * iDirection
Call PcBx(xx, yy)
Exit Sub
End Sub
Private Sub PcBx(x As Integer, y As Integer)
Dim c As Integer
Picture1.Cls
Picture1.DrawWidth = 2
c = Rnd * 10
Picture1.Line (x + 800, y + 600)-(x + 950, y + 300), QBColor(c + 2)
Picture1.Line (x + 950, y + 300)-(x + 1100, y + 600), QBColor(c + 2)
Picture1.Line (x + 1100, y + 600)-(x + 800, y + 600), QBColor(c + 2)
Picture1.Line (x + 1300, y + 2000)-(x + 1450, y + 1700), QBColor(c + 2)
Picture1.Line (x + 1450, y + 1700)-(x + 1600, y + 2000), QBColor(c + 2)
Picture1.Line (x + 1600, y + 2000)-(x + 1300, y + 2000), QBColor(c + 2)
Picture1.Line (x + 300, y + 2000)-(x + 450, y + 1700), QBColor(c + 2)
Picture1.Line (x + 450, y + 1700)-(x + 600, y + 2000), QBColor(c + 2)
Picture1.Line (x + 600, y + 2000)-(x + 300, y + 2000), QBColor(c + 2)
Picture1.Line (x + 800 + c * 10, y + 800)-(x + 1100, y + 1100 + c * 30), QBColor(c + 4), B
Picture1.Line (x + 800 + c * 10, y + 1300)-(x + 1100, y + 1600 + c * 30), QBColor(c + 4), B
End Sub
Private Sub MkLin()
Dim YS As Integer
Dim i As Integer
iPositon = iPositon + 50 * iDirection
If iDirection = 1 Then
If iPositon + 1000 >= ProgressBar1.Width Then iDirection = -1 * iDirection
Else
If iPositon - 1000 <= 0 Then iDirection = -1 * iDirection
End If
ProgressBar1.Value = iPositon + 1000 * iDirection
YS = SSTab1.Height - 1000
Line1(0).X1 = iPositon
Line1(0).X2 = iPositon + 1000 * iDirection
Line1(0).Y1 = YS
Line1(0).Y2 = YS
Line1(1).X1 = iPositon
Line1(1).X2 = iPositon + 1000 * iDirection - 200 * iDirection
Line1(1).Y1 = YS + 400
Line1(1).Y2 = YS + 400
Line1(2).X1 = iPositon
Line1(2).X2 = iPositon
Line1(2).Y1 = YS
Line1(2).Y2 = YS + 400
Line1(3).X1 = iPositon + 1000 * iDirection
Line1(3).X2 = iPositon + 1000 * iDirection - 200 * iDirection
Line1(3).Y1 = YS
Line1(3).Y2 = YS + 400
End Sub