timer

Программирование на Visual Basic for Applications
Pavlo
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 06.12.2003 (Сб) 14:12

timer

Сообщение Pavlo » 16.03.2005 (Ср) 20:32

Подскажыте есть ли api ф-я, аналог таймера, потому что в VBA таймера нет? И если есть то как ету ф-ю использовать. Спасибо.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 16.03.2005 (Ср) 20:45

SetTimer/KillTimer API
Моду создают модоки, а распространяют модозвоны.

Pavlo
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 06.12.2003 (Сб) 14:12

Сообщение Pavlo » 17.03.2005 (Чт) 20:27

Спасибо за ответ! Но дайте ламеру пример использование етой ф-и,потому что я не знаю какие параметры передавать. :shock:

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 17.03.2005 (Чт) 21:17

SetTimer:
Код: Выделить всё
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

- создает таймер.

Параметры:
· hWnd
Задает дескриптор окна, связанного с таймером. Окно должно принадлежать вызывающему функцию потоку. Если этот параметр равен NULL (0&), никакое окно с таймером не связывается, а параметр nIDEvent (см. ниже) игнорируется.

· nIDEvent
Задает ненулевой дескриптор таймера. Если параметр hWnd равен NULL (0&), параметр nIDEvent игнорируется.

· uElapse
Задает значение интервала таймера, в миллисекундах.

· lpTimerFunc
Задает адрес функции, выполняемой по истечении заданного интервала времени. См. TimerProc.
Если параметр lpTimerFunc равен NULL (0&), система посылает сообщение WM_TIMER в очередь сообщений вашей программы. Член hwnd структуры MSG содержит значение параметра hWnd.

KillTimer:
Код: Выделить всё
Declare Function KillTimer Lib "user32" Alias "KillTimer" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

- уничтожает созданный тобой таймер.

Параметры:
· hWnd
Задает дескриптор окна, связанного с таймером. Это значение должно быть таким же, как и то, что вы задали при вызове функции SetTimer.

· uIDEvent
Задает дескриптор уничтожаемого таймера. Если дескриптор окна, переданного функции SetTimer верен, этот параметр должен совпадать с параметром uIDEvent, заданном при вызове функции SetTimer. Если же приложение вызывает SetTimer, но задает значение hWnd как NULL(0&), этот параметр должен быть установлен в значение, возвращенное функцией SetTimer.

Пример:
Код: Выделить всё
'В коде стандартного модуля
Public Const DT_CENTER = &H1
Public Const DT_WORDBREAK = &H10
Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Declare Function DrawTextEx Lib "user32" Alias "DrawTextExA" (ByVal hDC As Long, ByVal lpsz As String, ByVal n As Long, lpRect As RECT, ByVal un As Long, ByVal lpDrawTextParams As Any) As Long
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Global Cnt As Long, sSave As String, sOld As String, Ret As String
Dim Tel As Long
Function GetPressedKey() As String
    For Cnt = 32 To 128
        'Получить состояние выбранной клавиши
        If GetAsyncKeyState(Cnt) <> 0 Then
            GetPressedKey = Chr$(Cnt)
            Exit For
        End If
    Next Cnt
End Function
Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
    Ret = GetPressedKey
    If Ret <> sOld Then
        sOld = Ret
        sSave = sSave + sOld
    End If
End Sub

'В коде формы
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Me.Caption = "Клавиатурный шпион"
    'Создаем таймер
    SetTimer Me.hwnd, 0, 1, AddressOf TimerProc
End Sub
Private Sub Form_Paint()
    Dim R As RECT
    Const mStr = "Загрузите это приложение, наберите " & _
    "что-нибудь на клавиатуре и закройте его. Будет " & _
    "показано сообщение с набранными вами символами!"

    'Очистка формы
    Me.Cls
    'Задать масштабирование
    Me.ScaleMode = vbPixels
    'Задать прямоугольную область
    SetRect R, 0, 5, Me.ScaleWidth, Me.ScaleHeight
    'Нарисовать текст
    DrawTextEx Me.hDC, mStr, Len(mStr), R, _
    DT_WORDBREAK Or DT_CENTER, ByVal 0&
End Sub

Private Sub Form_Resize()
    Form_Paint
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'Убить таймер
    KillTimer Me.hwnd, 0
    'Показать набранный текст
    MsgBox sSave
End Sub
Моду создают модоки, а распространяют модозвоны.

Pavlo
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 06.12.2003 (Сб) 14:12

Сообщение Pavlo » 17.03.2005 (Чт) 21:23

У матросов нет вопросов. Спасибо, буду юзать :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.03.2005 (Пт) 5:23

Вопросы могут появиться :)

Прикол в том, что в 97 офисе не поддерживается AddressOf. Причём не поддерживается злостно, т.е. код даже не начнёт компилироваться. И придётся тогда тебе искать пример от Тёмыча :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 18.03.2005 (Пт) 16:34

Есть в VBA таймер,через метод OnTime объекта Application можно запустить и(или) запускать постоянно макрос. Работает не плохо.

Это в модуле макросов:

Код: Выделить всё
Dim Flag As Boolean

Sub StartTimer()
Flag = True
Timer
End Sub

Sub StopTimer()
Flag = False
End Sub

Sub Timer()

If Flag = True Then
'Повторить запуск через 1 секунду
Application.OnTime Now + TimeValue("00:00:01"), "Timer"
End If
End Sub


Но это в Excel, в ворде придется делать иначе, используя цикл DO или таймер на форме, который имеется.

Pavlo
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 06.12.2003 (Сб) 14:12

Сообщение Pavlo » 18.03.2005 (Пт) 19:08

Действительно не компилируеться и в VB6 и в VBA, хотя офис 2000.
Значит про ф-ю Settimer можно забыть? Ну тогда попробую делать как Vitalik.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.03.2005 (Пт) 19:34

Не, компилироваться будет... В 2000 и выше...
А что говорит?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Pavlo
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 06.12.2003 (Сб) 14:12

Сообщение Pavlo » 19.03.2005 (Сб) 12:34

Говорит Invalid use of AddressOf operator.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.03.2005 (Сб) 15:15

Значит, ты проигнорировал комменты и засунул всё в модуль класса, хотя callback должен быть в обычном модуле :)
Или офис у тебя 97 :D
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 21.03.2005 (Пн) 11:59

Pavlo, ну мой то таймер заработал?...

Pavlo
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 06.12.2003 (Сб) 14:12

Сообщение Pavlo » 21.03.2005 (Пн) 22:16

При помощи метода ONtime все работает нормально. Тему можна считать закрытой, всем спасибо :D


Вернуться в VBA

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

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

    TopList  
cron