Помогите оптемизировать код.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
minigun
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 04.06.2005 (Сб) 7:06

Помогите оптемизировать код.

Сообщение minigun » 04.06.2005 (Сб) 7:10

Здравствуйте, подскажите пожалуйсто как оптемизировать код.
Вот листинг. Буду очень благодарен за приобретенный опыт!

Dim plu(10) As Integer
Dim chislo As Integer

Private Sub Command1_Click()
Timer1.Enabled = True
End Sub

Private Sub Command2_Click()

Randomize
chislo = 1 + Int(Rnd * 6)

Label1(1).Caption = chislo
Command2.Enabled = False
Command1.Enabled = True
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
Command1.Enabled = False

plu(1) = 0
End Sub

Private Sub Timer1_Timer()

If Image1(0).Visible = True Then
Image1(0).Visible = False
Image1(1).Visible = True
GoTo g:
End If
If Image1(1).Visible = True Then
Image1(1).Visible = False
Image1(2).Visible = True
GoTo g:
End If
If Image1(2).Visible = True Then
Image1(2).Visible = False
Image1(3).Visible = True
GoTo g:
End If
If Image1(3).Visible = True Then
Image1(3).Visible = False
Image1(4).Visible = True
GoTo g:
End If
If Image1(4).Visible = True Then
Image1(4).Visible = False
Image1(5).Visible = True
GoTo g:
End If
If Image1(5).Visible = True Then
Image1(5).Visible = False
Image1(6).Visible = True
GoTo g:
End If
If Image1(6).Visible = True Then
Image1(6).Visible = False
Image1(7).Visible = True
GoTo g:
End If
If Image1(7).Visible = True Then
Image1(7).Visible = False
Image1(8).Visible = True
GoTo g:
End If
If Image1(8).Visible = True Then
Image1(8).Visible = False
Image1(9).Visible = True
GoTo g:
End If
If Image1(9).Visible = True Then
Image1(9).Visible = False
Image1(10).Visible = True
GoTo g:
End If
If Image1(10).Visible = True Then
Image1(10).Visible = False
Image1(11).Visible = True
GoTo g:
End If
If Image1(11).Visible = True Then
Image1(11).Visible = False
Image1(12).Visible = True
GoTo g:
End If
If Image1(12).Visible = True Then
Image1(12).Visible = False
Image1(13).Visible = True
GoTo g:
End If
If Image1(13).Visible = True Then
Image1(13).Visible = False
Image1(0).Visible = True
GoTo g:
End If
g:
If Timer1.Enabled = True Then
plu(1) = plu(1) + 1
Timer1.Enabled = False
Timer1.Enabled = True
If plu(1) = chislo Then
Timer1.Enabled = False
plu(1) = 0
If Image1(0).Visible = True Then
MsgBox "Hello! Image1(0)"
End If
If Image1(6).Visible = True Then
MsgBox "Hello! Image1(6)"
End If
If Image1(8).Visible = True Then
MsgBox "Hello! Image1(8)"
End If
If Image1(12).Visible = True Then
MsgBox "Hello! Image1(12)"
End If
Command1.Enabled = False
Command2.Enabled = True
End If
End If
End Sub

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 04.06.2005 (Сб) 9:25

Код: Выделить всё

Option Explicit

Dim plu(10) As Integer
Dim chislo As Integer

Private Sub Command1_Click()
Timer1.Enabled = True
End Sub

Private Sub Command2_Click()

Randomize
chislo = 1 + Int(Rnd * 6)

Label1(1).Caption = chislo
Command2.Enabled = False
Command1.Enabled = True
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
Command1.Enabled = False

plu(1) = 0
End Sub

Private Sub Timer1_Timer()
Static i As Integer
If Image1(i).Visible = True Then
    Image1(i).Visible = False
    i = i + 1
    If i > 13 Then
        i = 0
    End If
    Image1(i).Visible = True
End If
If Timer1.Enabled = True Then
    plu(1) = plu(1) + 1
    Timer1.Enabled = False
    Timer1.Enabled = True
    If plu(1) = chislo Then
        Timer1.Enabled = False
        plu(1) = 0
   
        Select Case i
            Case 0, 6, 8, 12
                Debug.Print "Hello! Image1(" & i & ")"
        End Select
        Command1.Enabled = False
        Command2.Enabled = True
    End If
End If
End Sub
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Dex
Постоялец
Постоялец
 
Сообщения: 346
Зарегистрирован: 09.08.2004 (Пн) 16:11

Сообщение Dex » 04.06.2005 (Сб) 9:28

Вот так:
Код: Выделить всё
Dim plu(10) As Integer
Dim chislo As Integer

Private Sub Command1_Click()
Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
Randomize
chislo = 1 + Int(Rnd * 6)
Label1(1).Caption = chislo
Command2.Enabled = False
Command1.Enabled = True
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
Command1.Enabled = False
plu(1) = 0
End Sub

Private Sub Timer1_Timer()
For i = 0 To Image1.Count - 1
If Image1(i).Visible = True Then
Image1(i).Visible = False
If i <> 13 Then Image1(i + 1).Visible = True
If i = 13 Then Image1(i - i).Visible = True
GoTo g:
End If
Next i
g:
If Timer1.Enabled = True Then
plu(1) = plu(1) + 1
If plu(1) = chislo Then
Timer1.Enabled = False
plu(1) = 0
For i = 0 To Image1.Count - 1
If i = 0 Or i = 6 Or i = 8 Or i = 12 Then
If Image1(i).Visible = True Then
MsgBox "Hello! Image1(" & i & ")"
End If
End If
Next i
Command1.Enabled = False
Command2.Enabled = True
End If
End If
End Sub

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 04.06.2005 (Сб) 10:11

Dex, GoTo Очень плохой оператор. Лутше использовать переменную которая потом будет служить признаком необходимости выполнения нужного блока.
Еще строку
Код: Выделить всё
If Timer1.Enabled = True Then

лутше заменить строкой
Код: Выделить всё
If Timer1.Enabled Then

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.06.2005 (Сб) 14:25

ism писал(а):Еще строку
Код: Выделить всё
If Timer1.Enabled = True Then

лутше заменить строкой
Код: Выделить всё
If Timer1.Enabled Then

Это, кстати, в общем случае не одно и тоже.
А тут - да, лучше заменить.
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 04.06.2005 (Сб) 21:13

Тёмыч, ты это имееш ввиду:
Код: Выделить всё
Private Sub Form_Load()
Dim i As Integer
i = 1
If i = True Then MsgBox "i = true"
If i Then MsgBox "i"
End Sub

Выскакивает только "i"
т.е if i then , это скорее if i <> 0 then, нежели If i = True Then
الفيجوال بيسك الرابح

minigun
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 04.06.2005 (Сб) 7:06

Сообщение minigun » 04.06.2005 (Сб) 21:28

Да Вы просто СУПЕР!!! Придя с работы, увидев это, я подумал «ХОТЬ ОДНА ХОРОШАЯ НОВОСТЬ: КОД ОТИМИЗИРОВАН, ЗА СТОЛЬ КОРОТКИЙ СРОК!!!» Спасибо, буду теперь разбираться!
Кстати, вопрос на засыпку. Код приведенный выше, создает эффект передвижения картинки по форме, но для этого нужно разместить на форме 14 картинок, одного типа, сделать их Visible = False и только тогда, будет создан эффект перескакивающей картинки по определенному маршруту. А если нужно сделать так, что бы было например 4 типа картинки выложить их на форме, задать для каждой определенный маршрут и что тогда, это значит 14х4 = 56 картинок будет на одной форме? Я вот сегодня подумал, а что если картинку запихать в переменную, выставит на форме пустые Image, и при необходимости просто по очереди присваивать определенную переменную пустой картинке, а потом этой же картинке присваивать переменную = пустой картинки? Такое ведь тоже возможно и код должен оптимизироваться, или нет? Если да, то как присвоить переменной, любую картинку, и какой тип переменной должен быть? Опишите плиз 8))

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.06.2005 (Вс) 21:34

GM писал(а):Тёмыч, ты это имееш ввиду:
Код: Выделить всё
Private Sub Form_Load()
Dim i As Integer
i = 1
If i = True Then MsgBox "i = true"
If i Then MsgBox "i"
End Sub

Выскакивает только "i"
т.е if i then , это скорее if i <> 0 then, нежели If i = True Then

Это. Причём эта фишка работает даже с Boolean:
Код: Выделить всё
Option Explicit
Private Declare Function Fake Lib "msvbvm60" Alias "VarPtr" (ByVal Value As
Long) As Boolean

Private Sub Form_Load()
Dim b As Boolean
b = Fake(1)
Debug.Print b, b = True      'True   False
Debug.Print Not b, b = False      'True   False
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.06.2005 (Вс) 21:36

minigun, а банально двигать картинку, вместо создания иллюзии движения - не проще?
У картинок есть свойства Left и Top.

Картинку можно присваивать переменной типа Picture.
Изображение

minigun
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 04.06.2005 (Сб) 7:06

Сообщение minigun » 05.06.2005 (Вс) 23:19

tyomitch, я думал над этим, но это будет намного сложнее чем я ожидал. Во-первых, нужно что бы картинка еще и события вызывала. Во-вторых, я хотел бы конечно попробовать даже не просто с картинкой, а с анимацией, например из точки A бежит фигурка в точку Б, останавливается там и ковыряется в носу, но что бы это происходило по определенным ходам, да еще и со всякими фичами я ума не приложу, как это сделать, хотя бы визуально. Сначала я хотел использовать Gif анимацию, и просто передвигать картинку по линии, начал мудрить и все, почувствовал что знаний 0. Сейчас думаю, что проще присвоить переменную картинке, и эту переменную гонять по пустым картинкам, а следом будет ходить переменная пустой картинки, и все подчищать, пока так... Если есть пример передвижения по форме с анимацией, то пожалуйсто приведи.

cg_ck
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 118
Зарегистрирован: 11.06.2003 (Ср) 12:02
Откуда: Riga(Latvia)

Сообщение cg_ck » 18.06.2005 (Сб) 2:48

А какого рода события? Я почему-то уверен что можно обойтись без 14-и невидимых пикчерБоксов.
Ходит по лесу хомяк, хищный маленький дурак...

minigun
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 04.06.2005 (Сб) 7:06

Сообщение minigun » 18.06.2005 (Сб) 10:00

А здесь про PictureBox слова не сказано. Image(100), я раскидал по всей форме, теперь, по нажатию на слово, сгенерировать ход, юнит ходит по этим самым массивам. Если массив будет равен юниту, то можно выполнить какое не будь событие. Конечно, я мог бы воспользоваться Left и Top, и просто передвигать юнита по координатам, но это было бы геморойней, так как пришлось бы писать для каждого юнита координаты, а если их 12, проще сделать передвижение по этим самым пустым Image. А события могут быть самым разными, например, если 2 юнита станут на одну клетку то между ними происходить БК. :)

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 18.06.2005 (Сб) 11:41

Огроиный сори за поднятие старого этапа, но
Код: Выделить всё
Private Sub Form_Load()
Dim i As Integer
i = -1
If i = True Then MsgBox "i = true"
If i Then MsgBox "i"
End Sub
Выводит две мессаги следовательно
True<=>(-1)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.06.2005 (Чт) 21:05

True - это -1, но любое ненулевое значение - тоже True. Не веришь - Debug.Print CBool(1)
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 24.06.2005 (Пт) 10:48

tyomitch писал(а):True - это -1, но любое ненулевое значение - тоже True. Не веришь - Debug.Print CBool(1)

Знание этого удобно при обработке чекбоксов и установке булевым значениями значений чекбоксов (даже если они задисаблены).
Я это везде использую в своей программе.
bChange=Abs(chkChange.Value)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 166

    TopList