
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.121] |
![]() |
|
![]() |
|
|
люди добрые.
помогите. каким образом можно динамически создоть объект по типу таймер в VB-классе и пользоваться его ивентпми. заранее благодарствую. |
![]() |
Сообщ.
#2
,
|
|
Написать свой...
![]() ![]() 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 |
Сообщ.
#3
,
|
|
|
Можно и так:
![]() ![]() 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 |
Сообщ.
#4
,
|
|
|
Извиняюсь за "откапывание мамонтов", сабж для меня как никогда актуален.. В двух постах предыдущих, ответа для себя не нашел, может сможет кто-нибудь привести еще пример, буду ацки признателен, ведь столько возможностей сразу откроется..
Автор вроде-бы понятно поставил вопрос, но все-таки добавлю подробностей.. Помогите, пожалуйста реализовать следующее: ![]() ![]() ' Тип для таймеров 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 это возможно не реально воплотить в точности так, но хотя-бы что-то похожее. Присылайте также исходники по теме, сам тоже буду мозговать. Давайте решим эту задачу! |
![]() |
Сообщ.
#5
,
|
|
Интересно, зачем я шесть лет назад написал вот это..
Цитата B.V. @ Wait Val(500) Мда, ну да ладно. Цитата Darkspringreen @ Я конечно понимаю, что на vb6 это возможно не реально воплотить в точности так В точности так -- нет, но по идентичной логике, вполне можно. Если уж разбирать, так давай начнем с того, что у тебя вызывает затруднения по реализации приведенного алгоритма? |
Сообщ.
#6
,
|
|
|
Цитата Интересно, зачем я шесть лет назад написал вот это.. Цитата (B.V. @ 7.12.05, 00:55) Wait Val(500) Мда, ну да ладно. Мда, глуповато получилось.. Надо было, прогнать Ваш код в vb, прежде чем постить, а я лишь бегло прочел, притом надеясь увидеть готовый алгоритм и показалось, что это нито, что мне нужно, но сейчас понял, что можно взять за основу ![]() |
![]() |
Сообщ.
#7
,
|
|
Цитата Darkspringreen @ Мда, глуповато получилось.. Надо было, прогнать Ваш код в vb, прежде чем постить, а я лишь бегло прочел, притом надеясь увидеть готовый алгоритм и показалось, что это нито, что мне нужно, но сейчас понял, что можно взять за основу Попробую воплотить, трудности были в том, что не знал с чего начать, теперь есть.. Ты неправильно меня понял. Мой комментарий относился к совершенно бессмысленному использованию функции Val Впрочем, если тебя устроит неуправляемая задержка, используй, конечно. Но судя по алгоритму выше, тебе нужен полностью управляемый таймер с событием |
Сообщ.
#8
,
|
|
|
Хых, мозгу нужно выспаться, ато совсем туплю и невнимательным стал) А использование Вашего примера не оправдало надежд
![]() ![]() ![]() 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 Я думал, что при таком раскладе квадратики будут появлятся поочереди, если несколько раз нажать на кнопку.. Былоб оно так, это уже былоб для меня хоть что-то. Теперь снова не имею понятия как воплотить свой алгоритм.. |
Сообщ.
#9
,
|
|
|
Цитата Darkspringreen @ Я думал, что при таком раскладе квадратики будут появлятся поочереди, если несколько раз нажать на кнопку.. дело в том, что в однопоточном приложении событие, произошедшее во время DoEvents, обрабатывается "вложенным" — воврат в функцию, в которой выполнялся DoEvents, происходит только ПОСЛЕ обработки вызванного события. В твоём случае, это выглядит так: -нажатие кнопки. попадаем в DoEvents. ждём. (событие №1) --во время ожидания кнопка нажата ещё раз. попадаем в DoEvents. ждём. (событие №2) ---во время ожидания кнопка нажата ещё раз. попадаем в DoEvents. ждём. (событие №3) ---ждём. кнопка больше не нажималась. дождались, нарисовали квадратик. обработка события №3 закончена --ждём. дождались, нарисовали квадратик. обработка события №2 закончена -ждём. дождались, нарисовали квадратик. обработка события №1 закончена как видно из этой схемки, самое первое событие завершается последним, после завершения обработки других событий, оказавшихся, фактически, "вложенными" в него. выходов три: либо использовать многопоточность (это геморрой, VB6 это позволяет исключительно ректальным образом), либо эмулировать таймеры с помощью массива пар "время срабатывания/имя обработчика" (юзать CallByName для коллбэка), либо не выпендриваться, и юзать массив контролов: ![]() ![]() 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 (здесь я не стал заморачиваться с уничтожением или повторным использованием использованных таймеров, так проще и понятнее). Ы. о самом верном решении не говорю, оно у меня в подписи. |
Сообщ.
#10
,
|
|
|
http://bbs.vbstreets.ru/viewtopic.php?f=28&t=36606
|
Сообщ.
#11
,
|
|
|
Плюсанул всем.
Артур, хороший исходник, буду разбираться. |