встроенный таймер в модуле класса

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

встроенный таймер в модуле класса

Сообщение DimPos » 17.03.2008 (Пн) 19:07

Кто знает почему код в обычном модуле не работает в модуле класса
Код модуля:

Option Explicit
Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, _
ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) _
As Long
Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long
Private TimerId As Long
Function StartTimer(MyInterval As Long) As Long
TimerId = SetTimer(0&, 0&, MyInterval, AddressOf TimerProc)
End Function
Sub StopTimer()
Dim f As Long
f = KillTimer(0&, TimerId)
End Sub
Sub TimerProc(ByVal MyHwnd As Long, ByVal MyMsg As Long, ByVal TimerId As Long)
On Error GoTo err:
'код
Exit Sub
err:
StopTimer
End Sub
вызов функций производится из формы
точно такой же код в модуле класса выдает ошибку

"invalid use of AddressOf operator"

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2008 (Пн) 19:25

Разумеется он не будет работать.
Об этом в справке сказано к AddressOf.
Lasciate ogni speranza, voi ch'entrate.

DimPos
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 15.11.2002 (Пт) 17:24
Откуда: Киров

Сообщение DimPos » 18.03.2008 (Вт) 10:26

Ну нет у меня MSDN и в имеющейся литературе так же нет описания этого оператора. Смутно припоминаю что он связан с субклассированием и может использоваться совместно с еще одной API для замещения функции обработки сообщений окна.(я могу ошибаться-точно уже не помню)
В общем я так понимаю что в этом виде программа работать не будет - можно не париться.
Но опять же в описании API SetTimer про последний параметр сказано - Указатель на периодически вызываемую функцию обработки таймера
Если вместо TimerProc подставить другую функцию - то она почему-то вызывается только один раз - с чем это связано?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.03.2008 (Вт) 10:40

DimPos писал(а):Ну нет у меня MSDN и в имеющейся литературе так же нет описания этого оператора.

MSDN есть у всех, у кого есть интернет.

DimPos писал(а):Смутно припоминаю что он связан с субклассированием и может использоваться совместно с еще одной API для замещения функции обработки сообщений окна.(я могу ошибаться-точно уже не помню)

Не надо ничего смутно припоминать, оператор этот предназначен для передачи адреса функции в качестве аргумента другой функции (как правило для передачи в API-функцию).
DimPos писал(а):Но опять же в описании API SetTimer про последний параметр сказано - Указатель на периодически вызываемую функцию обработки таймера

Именно. И эта функция должна находиться в модуле, но никак не в классе. Есть некоторые сложности с получением адреса функции, находящейся в классе. Хотя, конечно этот адрес получить можно, но AddressOf в этом не поможет.
DimPos писал(а):Если вместо TimerProc подставить другую функцию - то она почему-то вызывается только один раз - с чем это связано?

Незнаю, даром телепатии не обладаю, что за функция, как вызывается?
Весь мир матрица, а мы в нем потоки байтов!

DimPos
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 15.11.2002 (Пт) 17:24
Откуда: Киров

Сообщение DimPos » 18.03.2008 (Вт) 17:27

Хотя, конечно этот адрес получить можно, но AddressOf в этом не поможет.

А что поможет?
Можно ли вообще сделать таймер внутри класса, без использования глобальных переменных проекта и не нарушая инкапсуляцию модуля?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.03.2008 (Вт) 17:31

Без модулей - нельзя.
Каким образом модуль нарушит автономность твоего таймера? В процедуру передается хендл окна и идентификатор таймера, по ним ты легко найдешь, твой это таймер или нет.
Lasciate ogni speranza, voi ch'entrate.

DimPos
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 15.11.2002 (Пт) 17:24
Откуда: Киров

Сообщение DimPos » 18.03.2008 (Вт) 17:52

Ладно, понятно - нельзя так нельзя
А так хотелось чтоб таймер запускался внутри класса при инициализации и останавливался при уничтожении класса без использования внешнего кода (в модуле и тд.). Абыдна...


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

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

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

    TopList