помогите с алгоритмом вывода на форму значений массива >0

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

помогите с алгоритмом вывода на форму значений массива >0

Сообщение Penumbra » 20.05.2012 (Вс) 1:58

помогите с алгоритмом :oops:
как бы объяснить,..
есть таймер, и массив р(255)
надо на форму циклически в таймере выводить scan и значения р(1-255)>0
те за один цикл значение Label1.caption =scan за следующий цикл первое значение из массива Label1.caption =р(i) большее 0, потом опять Label1.caption =scan где scan =scan +1, затем второе значение из массива Label1.caption =р(i) большее 0 и тд если все значения в массиве станут = 0 то просто выводить scan + 1
и так в вечном цикле
Код: Выделить всё
Public Sub Interval_Timer()
Dim scan  As Integer

Label1.caption = scan
scan =scan + 1
If scan = KCount + 1 Then   scan = 1

End Sub

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: помогите с алгоритмом вывода на форму значений массива >

Сообщение Хакер » 20.05.2012 (Вс) 6:37

Бред какой-то.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: помогите с алгоритмом вывода на форму значений массива >

Сообщение Mikle » 20.05.2012 (Вс) 8:34

Хакер писал(а):Бред какой-то.

Ты не телепат :)
Penumbra
Либо замени Dim на Static. либо перенеси строку:
Код: Выделить всё
Dim scan  As Integer

из ф-ции в модуль формы.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.05.2012 (Вс) 10:55

Что-то такое:
Код: Выделить всё
Dim Scan  As Integer = 255
Dim ValueDisplayed As Boolean = True
Dim P(1 To 255) As Integer

Public Sub Interval_Timer()
  If Not ValueDisplayed Then
    For Q As Integer = LBound(P) To UBound(P)
      If P(Q) > 0 Then
        Label1.Caption = P(Q)
        ValueDisplayed = True
        Exit Sub
      End If
    Next Q
  Else
    ValueDisplayed = False
  End If
 
  ' It's not an else branch!
  Scan = Scan + 1
  If Scan > UBound(P) Then Scan = LBound(P)
  Label1.Caption = Scan
End Sub
Думаю, принцип показал, исправить сам сможешь :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: помогите с алгоритмом вывода на форму значений массива >

Сообщение Хакер » 20.05.2012 (Вс) 10:57

Qwerty, как же ты любишь прилагать код, написанный на дотнете. Прямо хлебом не корми, каждый раз, когда появляется возможность, ты это делаешь, а потом «ой, а я и не знал, что в VB6 так сделать нельзя».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.05.2012 (Вс) 11:34

Хакер писал(а):Qwerty, как же ты любишь прилагать код, написанный на дотнете.

Это не .NET хотя бы потому, что у процедуры Interval_Timer нет Handles и нигде эта процедура не устанавливается как обработчик события таймера :D

Хакер писал(а):а потом «ой, а я и не знал, что в VB6 так сделать нельзя»

Я же наоборот написал:
Qwertiy писал(а):Думаю, принцип показал, исправить сам сможешь :)
Насколько я представляю, в написанном мной коде (который я писал прямо тут в тестовом поле) ошибками будут только присваивания при объявлении (в том числе в цикле For). Больше ничего дотнетовского я не использовал, даже наоборот, применил LBound и UBound из VB6.

Qwertiy писал(а):  ' It's not an else branch!

Скорее всего, надо немного по-другому - если нет значения, то не менять надпись и подождать. Тогда так:
Код: Выделить всё
Dim Scan  As Integer = 255
Dim ValueDisplayed As Boolean = True
Dim P(1 To 255) As Integer

Public Sub Interval_Timer()
  If Not ValueDisplayed Then
    For Q As Integer = LBound(P) To UBound(P)
      If P(Q) > 0 Then
        Label1.Caption = P(Q)
        ValueDisplayed = True
        Exit Sub
      End If
    Next Q
    ValueDisplayed = True
  Else
    ValueDisplayed = False
    Scan = Scan + 1
    If Scan > UBound(P) Then Scan = LBound(P)
    Label1.Caption = Scan
  End If
End Sub
Последний раз редактировалось Qwertiy 20.05.2012 (Вс) 11:38, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: помогите с алгоритмом вывода на форму значений массива >

Сообщение Хакер » 20.05.2012 (Вс) 11:36

Qwertiy писал(а):Насколько я представляю, в написанном мной коде (который я писал прямо тут в тестовом поле) ошибками будут только присваивания при объявлении (в том числе в цикле For). Больше ничего дотнетовского я не использовал, даже наоборот, применил LBound и UBound из VB6.


Да. И я нисколько не сомневаюсь, что ты заведомо знал, что инициализация-при-объявлении есть только в дотнете, и её нет в VB/VBA, но всё равно написал так, как написал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.05.2012 (Вс) 11:53

Хакер писал(а):Да. И я нисколько не сомневаюсь, что ты заведомо знал, что инициализация-при-объявлении есть только в дотнете, и её нет в VB/VBA, но всё равно написал так, как написал.

Да, знал. Мне просто было лень писать по-другому. Если бы не знал, не написал бы, что код надо исправлять :mrgreen:
Но т. к. это тема по VB6, я написал ... = LBound(P) To UBound(P), а не ... = 0 To P.Count :)
Вполне можно считать это VB-подобным псевдокодом :roll:

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.05.2012 (Вс) 11:58

Кстати. Ещё "почему это не .NET":
Qwertiy писал(а):Dim P(1 To 255) As Integer
Label1.Caption = P(Q)
Эти строчки там не скомпилируется, т. к.
1. Нижняя граница в .NET обязана быть нулём :lol:
2. Там .Text, а не .Caption.
Ты ведь это тоже знаешь?

Так что 1 пункт из .NET против двух (как минимум) из VB6 :mrgreen:

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: помогите с алгоритмом вывода на форму значений массива >

Сообщение Penumbra » 20.05.2012 (Вс) 13:38

]
Хакер писал(а):Бред какой-то.

ну у меня туго с изложением мысли, я как собака: смотрю умными глазами, все понимаю но сказать не могу :lol:
Mikle писал(а):Ты не телепат :)
Penumbra
Либо замени Dim на Static. либо перенеси строку:
Код: Выделить всё
Dim scan  As Integer

из ф-ции в модуль формы.

я и сам только что заметил что тупанул)) код набирал прям тут в редакторе форума

Qwertiy
немного преобразовал твой код, работает не правильно, так я уже делал :(
если Label1 заменить на
Код: Выделить всё
Text1.Text = Text1.Text & vbNewLine & i & "  -  " & P(Q)


Код: Выделить всё
Dim Scan  As Integer, i As Integer
Dim ValueDisplayed As Boolean, Q As Integer
Dim P(1 To 255) As Integer

Private Sub Form_Load()
    On Error GoTo ErrorHandler
    P(3) = 1111
    P(8) = 2222
    P(12) = 3333
    P(16) = 4444
    P(25) = 5555
    P(28) = 6666
    P(55) = 9999
    P(77) = 9999
    Exit Sub
ErrorHandler:
    MsgBox Error, vbExclamation + vbOKOnly
End Sub

Public Sub Interval_Timer()
    i = i + 1
   
    If Not ValueDisplayed Then
       
        For Q = LBound(P) To UBound(P)
            If P(Q) > 0 Then
                Text1.Text = Text1.Text & vbNewLine & i & "  -  " & P(Q)
                ValueDisplayed = True
                Exit Sub
            End If
        Next Q
        ValueDisplayed = True
    Else
        ValueDisplayed = False
        Scan = Scan + 1
        If Scan > 255 Then Scan = 1
        Text1.Text = Text1.Text & vbNewLine & i & "  -  " & Scan
    End If
End Sub


твой код выводит
    1 - 1111
    2 - 1
    3 - 1111
    4 - 2
    5 - 1111
    6 - 3
    7 - 1111
    8 - 4
    9 - 1111
    10 - 5
    11 - 1111
    12 - 6
    13 - 1111
    14 - 7
    15 - 1111
    .....

а надо
    1 - 1
    2 - 1111
    3 - 2
    4 - 2222
    5 - 3
    6 - 3333
    7 - 4
    8 - 5555
    9 - 5
    10 - 6666
    11 - 6
    12 - 9999
    13 - 7
    14 - 9999
    14 - 8
    16 - 1111
    17 - 9
    16 - 2222
    17 - 10
    16 - 3333
    17 - 11
    ....

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.05.2012 (Вс) 17:01

Penumbra писал(а):Qwertiy
немного преобразовал твой код, работает не правильно, так я уже делал :(

1. В Form_Load написать ValueDisplayed = True
2. Если массив не меняется, то вынеси счётчик Q из процедуры и ищи следующий. Если меняется, то считай количество элементов.

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: помогите с алгоритмом вывода на форму значений массива >

Сообщение Penumbra » 21.05.2012 (Пн) 1:00

значения массива меняются , ввел доп переменную lastQ и все стало зашибись вроде


Код: Выделить всё
Dim Scan  As Integer, i As Integer
Dim ValueDisplayed As Boolean, Q As Integer
Dim P(1 To 255) As Integer, lastQ As Integer

Private Sub Command1_Click()

    Interval.Enabled = Not Interval.Enabled
   
End Sub

Private Sub Form_Load()
    On Error GoTo ErrorHandler
    P(3) = 1111
    P(8) = 2222
    P(12) = 3333
    P(16) = 4444
    P(25) = 5555
    P(28) = 6666
    P(55) = 9999
    P(77) = 9999
    lastQ = LBound(P)
    Exit Sub
ErrorHandler:
    MsgBox Error, vbExclamation + vbOKOnly
End Sub

Public Sub Interval_Timer()
    i = i + 1
   
    If Not ValueDisplayed Then
       
        For Q = lastQ To UBound(P)
            If P(Q) Then
                Text1.Text = Text1.Text & vbNewLine & i & "  -  " & P(Q)
                ValueDisplayed = True
                lastQ = Q + 1
                Exit Sub
            End If
        Next Q
        If Q >= UBound(P) Then
            lastQ = LBound(P)
            Scan = Scan + 1
            If Scan > 255 Then Scan = 1
        End If
        ValueDisplayed = True
    Else
        ValueDisplayed = False
        Scan = Scan + 1
        If Scan > 255 Then Scan = 1
        Text1.Text = Text1.Text & vbNewLine & i & "  -  " & Scan
    End If
End Sub

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.05.2012 (Пн) 16:31

Penumbra писал(а):все стало зашибись вроде

Цикл должен быть другой:
Код: Выделить всё
Q = LastQ
Do
  Q = Q + 1
  If Q > UBound(P) Then Q = LBound(P)
  If P(Q) > 0 Then
    Text1.Text = Text1.Text & vbNewLine & i & "  -  " & P(Q)
    LastQ = Q
    ValueDisplayed = True
    Exit Sub
  End If
Loop While Q <> LastQ
Разница в том, что для закольцовывания массива не используется дополнительная итерация таймера.
И вообще, ты какую-то ерунду делаешь с If Q >= UBound(P) Then.


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 58

    TopList