На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> динамический таймер , динамический таймер
    люди добрые.
    помогите.

    каким образом можно динамически создоть объект по типу таймер в VB-классе и пользоваться его ивентпми.

    заранее благодарствую.
      Написать свой...

      ExpandedWrap disabled
        Option Explicit
         
        Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
         
        Private Sub cmdOne_Click()
            Wait Val(500)
            MsgBox "Время вышло!", vbInformation, "Info"
        End Sub
         
        Private Sub Wait(ByVal lTime As Long)
            Dim lTickCnt As Long
            lTickCnt = GetTickCount()
            Do: DoEvents
            Loop Until (GetTickCount - lTickCnt) >= lTime
        End Sub
        Можно и так:
        ExpandedWrap disabled
          Private Declare Function SetTimer Lib "user32" Alias "SetTimer" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
           
          Private Declare Function KillTimer Lib "user32" Alias "KillTimer" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
           
          timesecond=10
          dl = SetTimer(hwnd, hwnd, timesecond*1000, AddressOf TimProc)
           
          Function TimProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
              Select Case Msg
              Case WM_TIMER
                  KillTimer(hwnd,hwnd)
                  beep
              End Select
          End Function
          Извиняюсь за "откапывание мамонтов", сабж для меня как никогда актуален.. В двух постах предыдущих, ответа для себя не нашел, может сможет кто-нибудь привести еще пример, буду ацки признателен, ведь столько возможностей сразу откроется..
          Автор вроде-бы понятно поставил вопрос, но все-таки добавлю подробностей..

          Помогите, пожалуйста реализовать следующее:

          ExpandedWrap disabled
            ' Тип для таймеров
            Type DynamicTimer
            '...
            End Type
             
            ' Функция создания таймера и передачи его в переменную
            Public Function TimerCrate() As DynamicTimer
            '...
            End Sub
             
            ' Запускает указанный таймер
            Public Sub TimerStart(whichTimer - запускаемый таймер, timeout - период, periodic - периодический ли, handler - название процедуры события)
            '...
            End Sub
             
            ' Глушит указанный таймер
            Public Sub TimerStop(whichTimer - останавливаемый таймер)
            '...
            End Sub
             
            ' Убивает указанный таймер
            Public Sub TimerKill(whichTimer - удаляемый таймер)
            '...
            End Sub
             
            '---------------------
             
            ' Событие какого-нибудь таймера
            Private Sub DoSomething()
             Dim t as DynamicTimer
             Static i as Integer
             t = GetExpiredTimer() ' Было-бы замечательно знать, что за таймер повлек исполнение процедуры
             i = i + 1
             If i = 100 Then
              TimerKill(t)
             End If
            End Sub
             
            ' Какая-нибудь процедура
            Private Sub Something()
             Dim t as DynamicTimer
             t = TimerCreate()
             Сall TimerStart(t, 1.0, True, "DoSomething")
            End Sub


          Я конечно понимаю, что на vb6 это возможно не реально воплотить в точности так, но хотя-бы что-то похожее. Присылайте также исходники по теме, сам тоже буду мозговать. Давайте решим эту задачу!
            Интересно, зачем я шесть лет назад написал вот это..
            Цитата B.V. @
            Wait Val(500)

            Мда, ну да ладно.
            Цитата Darkspringreen @
            Я конечно понимаю, что на vb6 это возможно не реально воплотить в точности так

            В точности так -- нет, но по идентичной логике, вполне можно. Если уж разбирать, так давай начнем с того, что у тебя вызывает затруднения по реализации приведенного алгоритма?
              Цитата
              Интересно, зачем я шесть лет назад написал вот это..
              Цитата (B.V. @ 7.12.05, 00:55)
              Wait Val(500)

              Мда, ну да ладно.

              Мда, глуповато получилось.. Надо было, прогнать Ваш код в vb, прежде чем постить, а я лишь бегло прочел, притом надеясь увидеть готовый алгоритм и показалось, что это нито, что мне нужно, но сейчас понял, что можно взять за основу :wall: Попробую воплотить, трудности были в том, что не знал с чего начать, теперь есть..
                Цитата Darkspringreen @
                Мда, глуповато получилось.. Надо было, прогнать Ваш код в vb, прежде чем постить, а я лишь бегло прочел, притом надеясь увидеть готовый алгоритм и показалось, что это нито, что мне нужно, но сейчас понял, что можно взять за основу Попробую воплотить, трудности были в том, что не знал с чего начать, теперь есть..

                Ты неправильно меня понял. Мой комментарий относился к совершенно бессмысленному использованию функции Val
                Впрочем, если тебя устроит неуправляемая задержка, используй, конечно. Но судя по алгоритму выше, тебе нужен полностью управляемый таймер с событием
                  Хых, мозгу нужно выспаться, ато совсем туплю и невнимательным стал) А использование Вашего примера не оправдало надежд :wall:

                  ExpandedWrap disabled
                    Option Explicit
                     
                    Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
                     
                    Private Sub Command1_Click()
                        Wait 500
                        Randomize
                        Me.Line (Int(Rnd * Me.ScaleWidth) + 0, Int(Rnd * Me.ScaleHeight) + 0)-Step(10, 10), , B
                    End Sub
                     
                    Private Sub Wait(ByVal lTime As Long)
                        Dim lTickCnt As Long
                        lTickCnt = GetTickCount()
                        Do: DoEvents
                        Loop Until (GetTickCount - lTickCnt) >= lTime
                    End Sub
                     
                    Private Sub Form_Load()
                        Me.ScaleMode = vbPixels
                    End Sub


                  Я думал, что при таком раскладе квадратики будут появлятся поочереди, если несколько раз нажать на кнопку.. Былоб оно так, это уже былоб для меня хоть что-то.
                  Теперь снова не имею понятия как воплотить свой алгоритм..
                    Цитата Darkspringreen @
                    Я думал, что при таком раскладе квадратики будут появлятся поочереди, если несколько раз нажать на кнопку..

                    дело в том, что в однопоточном приложении событие, произошедшее во время DoEvents, обрабатывается "вложенным" — воврат в функцию, в которой выполнялся DoEvents, происходит только ПОСЛЕ обработки вызванного события.

                    В твоём случае, это выглядит так:
                    -нажатие кнопки. попадаем в DoEvents. ждём. (событие №1)
                    --во время ожидания кнопка нажата ещё раз. попадаем в DoEvents. ждём. (событие №2)
                    ---во время ожидания кнопка нажата ещё раз. попадаем в DoEvents. ждём. (событие №3)
                    ---ждём. кнопка больше не нажималась. дождались, нарисовали квадратик. обработка события №3 закончена
                    --ждём. дождались, нарисовали квадратик. обработка события №2 закончена
                    -ждём. дождались, нарисовали квадратик. обработка события №1 закончена


                    как видно из этой схемки, самое первое событие завершается последним, после завершения обработки других событий, оказавшихся, фактически, "вложенными" в него.

                    выходов три: либо использовать многопоточность (это геморрой, VB6 это позволяет исключительно ректальным образом), либо эмулировать таймеры с помощью массива пар "время срабатывания/имя обработчика" (юзать CallByName для коллбэка), либо не выпендриваться, и юзать массив контролов:
                    ExpandedWrap disabled
                      Private Sub Command1_Click()
                      Static c As Long
                      c = c + 1
                      Load Timer1(c)
                      Timer1(c).Interval = 500
                      Timer1(c).Enabled = True
                      End Sub
                      Private Sub Timer1_Timer(Index As Integer)
                      Timer1(Index).Enabled = False
                          Me.Line (Int(Rnd * Me.ScaleWidth) + 0, Int(Rnd * Me.ScaleHeight) + 0)-Step(10, 10), , B
                      End Sub

                    (здесь я не стал заморачиваться с уничтожением или повторным использованием использованных таймеров, так проще и понятнее).
                    Ы. о самом верном решении не говорю, оно у меня в подписи.
                    Сообщение отредактировано: DarknessPaladin -
                      http://bbs.vbstreets.ru/viewtopic.php?f=28&t=36606
                        Плюсанул всем.
                        Артур, хороший исходник, буду разбираться.
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0584 ]   [ 15 queries used ]   [ Generated: 22.08.25, 05:00 GMT ]