Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Class & Timer Добавлено: 12.07.07 12:20  

Автор вопроса:  KreAtoR
вопрос таков. Можно ли создавая класс в VB6 сделать в нем timer чтоб на форме его не ставить и класс можно было применить в любой другой проге не заботясь о таймере

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #1 Добавлено: 12.07.07 18:46
Можно. В WIN32API функция SetTimer, поместить в какой-нибудь метод создаваемого класса. В модуле написать функцию обратного вызова (CALLBACK) TimerProc. Из нее вызывать другой метод класса.
И в этом методе - RaizeEvent.
А тебе зачем? :-)

Ответить

Номер ответа: 2
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #2 Добавлено: 13.07.07 00:18
Можно. В WIN32API функция SetTimer, поместить в какой-нибудь метод создаваемого класса. В модуле написать функцию обратного вызова (CALLBACK) TimerProc. Из нее вызывать другой метод класса.
И в этом методе - RaizeEvent.

RaiseEvent
Придется изрядно поморочится с множественными инстанциями класса, надавая им идентификаторы чтобы различить кому какой колбек пришел. Идентификатор задается как ObjPtr(инстанция класса) и уникален так как по одному адресу памяти может находиться только 1 класс.
Но действительно хотелось бы понять вот зачем это надо? Если уж так невтерпеж тебе эта форма, ну воспользуйся ты ATLTimer (погугли, кажись оно так называлось) - библа, подгружаемая к вб, позволяющая делать таймеры без форм.
зы Я помню кто-то делал такой класс без модуля (колбек процедура находится как binary в массиве байт), но не знаю каков исход, запользуй поиск по форуму

Ответить

Номер ответа: 3
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #3 Добавлено: 13.07.07 00:56
RaiseEvent

Акцентируя мою орфографию, убедись в безупречности своей.
надавая им идентификаторы

И что мешает "надавать"? Посмотри на сигнатуру функции, может увидишь.

Ответить

Номер ответа: 4
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #4 Добавлено: 13.07.07 02:33
Можно. В WIN32API функция SetTimer, поместить в какой-нибудь метод создаваемого класса. В модуле написать функцию обратного вызова (CALLBACK)
В этом весь и прикол. И часто если таскать с собой ещё и модуль, к столько маленькому классу - меня начинает воротить от такого "закоса под ООП" Не делайте ООП там где оно неделается, и делать его ненужно :) Заюзай просто модуль с двумя функциями, установить_таймер и снять_таймер. Передавай просто указатель на функцию которая будет является обработчиком. Таймер не та теме где можно выенутся :) Всё имхо.

Ответить

Номер ответа: 5
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #5 Добавлено: 13.07.07 02:35
P.S. Как это я пропустил насчет ObjPtr.
Вот уж точно он не нужен.

Болванка такая:

в модуле:

Option Explicit

Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Integer, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public colcls As New Collection

Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Integer, ByVal dwTime As Long)
Dim cls As Class1
    For Each cls In colcls
        If cls.IsMyId(idEvent) Then
            cls.TempSub
        End If
    Next
End Sub


в классе:

Option Explicit
'Event TempEvn()
Private mytm As Integer

Public Sub StartTm(elaps As Long)
    mytm = SetTimer(0, 0, elaps, AddressOf TimerProc)
End Sub

Public Function IsMyId(id As Integer) As Boolean
IsMyId = (mytm = id)
End Function

Public Sub TempSub()
'    RaiseEvent TempEvn
    Debug.Print "зачем нужен ObjPtr " & ObjPtr(Me)
End Sub

Private Sub Class_Initialize()
    colcls.Add Me
End Sub

Private Sub Class_Terminate()
    KillTimer 0, mytm
    Dim cls As Class1
    Dim i As Integer
    For Each cls In colcls
        i = i + 1
        If cls Is Me Then
            colcls.Remove i
        End If
    Next
End Sub


вызов:

Option Explicit
Dim s1 As Class1
Dim s2 As Class1

Private Sub Form_Load()
Set s1 = New Class1
Set s2 = New Class1

s1.StartTm 100
s2.StartTm 500
End Sub








Ответить

Номер ответа: 6
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #6 Добавлено: 13.07.07 02:38
таскать с собой ещё и модуль

Ну че бы по приколу не потаскать, запас карман не тянет.

Ответить

Номер ответа: 7
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 13.07.07 18:22
дык проще уже всё сделать модулем... и тогда не таскать класс :)

Ответить

Номер ответа: 8
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #8 Добавлено: 13.07.07 18:29
дык проще

 - Этат артыст очен пахож на меня, памоему его нада расстрелять.
 - Товарищ Сталин! Может не надо расстреливать? Может просто усы сбрить?
 - Ну, или так.

Ответить

Номер ответа: 9
Автор ответа:
 KreAtoR



Вопросов: 120
Ответов: 438
 Профиль | | #9 Добавлено: 16.07.07 13:58
Идея была проста. Создать класс который бы выводил опции МедиаЭнкодера и одной карты. В нем создается окно, все нужные вещи и ТАЙМЕР к томуже.

Смысл был в том, что я эту часть программы очень часто использую, в других программах не или могу использовать в будущих программах. а модуль лепить не хотел. вот и появилась идея создания токакого муню

а что насчет класс+модуль, неее это уже будет слишком :))))) плюс форма это уелая программа получается а не часть ее :)))))

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам