/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
VB6: Timer object i en klasse
Fra : Mads


Dato : 08-02-04 08:41

Hej

Hvorledes kan jeg lave et timer object i en klasse?
Indtil videre er jeg kommet frem til følgende kode til min klasse:

Private WithEvents myTimer As VB.Timer

Private Sub Class_Initialize()
Set myTimer = New VB.Timer
myTimer.Interval = 500
myTimer.Enabled = True
End Sub

Private Sub Class_Terminate()
myTimer.Enabled = False
Set myTimer = Nothing
End Sub

Private Sub myTimer_Timer()
Debug.Print "timer class"
End Sub

Men når jeg fra en normal form forsøger at lave "Set noget = New Class1" så
får jeg en fejl: "Invalid use of New keyword" ved "New VB.Timer".
Hvordan skal jeg løse dette?

Hilsen
Mads




 
 
Kim Pedersen (08-02-2004)
Kommentar
Fra : Kim Pedersen


Dato : 08-02-04 21:36

> Hvorledes kan jeg lave et timer object i en klasse?

En måde er at oprette en timer Via API i stedet for at bruge den indbyggede
i VB. Dette er faktisk rimeligt ukompliceret. Faktisk har jeg en på min
hjemmeside på http://www.vbcodemagician.dk/tips/system_formlesstimer.htm

Hilsen Kim Pedersen



Mads (09-02-2004)
Kommentar
Fra : Mads


Dato : 09-02-04 12:48

"Kim Pedersen" <ppicasso@hotmail.com> wrote in message
news:c066iu$q0q$1@sunsite.dk...
> > Hvorledes kan jeg lave et timer object i en klasse?
>
> En måde er at oprette en timer Via API i stedet for at bruge den
indbyggede
> i VB. Dette er faktisk rimeligt ukompliceret. Faktisk har jeg en på min
> hjemmeside på http://www.vbcodemagician.dk/tips/system_formlesstimer.htm
>
Mange tak.

Du bruger en metode i et Module.
Jeg vil gerne pakke det ind i en klasse som bare rejser en VB Event når der
kommer et timer signal fra OS. For at gøre det simplere at bruge flere
steder i programmet (der består af en stor del class modules).
Jeg har lavet en public sub i min clsTimer klasse der hedder TimerProc.
Men når jeg forsøger at udfører:
timerID = SetTimer(&H0, &H0, myInterval, AddressOf TimerProc)
inde i klasse får jeg "Invalid use of AddressOf operator".
Hvorledes kan jeg løse dette?

Venlig Hilsen
Mads



Mads (09-02-2004)
Kommentar
Fra : Mads


Dato : 09-02-04 14:38

"Mads" <mads@iname.com> wrote in message news:c07ruc$dqk$1@sunsite.dk...
> "Kim Pedersen" <ppicasso@hotmail.com> wrote in message
> news:c066iu$q0q$1@sunsite.dk...
> > > Hvorledes kan jeg lave et timer object i en klasse?
> >
> > En måde er at oprette en timer Via API i stedet for at bruge den
> indbyggede
> > i VB. Dette er faktisk rimeligt ukompliceret. Faktisk har jeg en på min
> > hjemmeside på http://www.vbcodemagician.dk/tips/system_formlesstimer.htm
> >
> Mange tak.
>
> Du bruger en metode i et Module.
> Jeg vil gerne pakke det ind i en klasse som bare rejser en VB Event når
der
> kommer et timer signal fra OS. For at gøre det simplere at bruge flere
> steder i programmet (der består af en stor del class modules).
> Jeg har lavet en public sub i min clsTimer klasse der hedder TimerProc.
> Men når jeg forsøger at udfører:
> timerID = SetTimer(&H0, &H0, myInterval, AddressOf TimerProc)
> inde i klasse får jeg "Invalid use of AddressOf operator".
> Hvorledes kan jeg løse dette?
>

Jeg fandt på en metode der løser det. Men den indvoldvere to ekstra filer.
ét modul der indeholder timeProc og en reference til et objekt TimerDist
én klasse TimerDist der har en metode der kan rejse en event
Timer(timerID)
Mine Timer objekter lytter så efter Timer(timerID) event'en, og hvis det
timerID der kommer med passer med objektets eget timerID, så rejse det
objekt så en event Timer() der trigger metoder i de objekter der har
reference til det objekt.

Den virker lidt besværlig min metode, så vil gerne høre om andre har en mere
elegant løsning, der stadig, fra resten af programmet, ligner en normal
Timer klasse.

Venlig Hilsen
Mads B. Tandrup



Kim Pedersen (09-02-2004)
Kommentar
Fra : Kim Pedersen


Dato : 09-02-04 15:00

> Den virker lidt besværlig min metode, så vil gerne høre om andre har en
mere
> elegant løsning, der stadig, fra resten af programmet, ligner en normal
> Timer klasse.

Det virker besværligt i hvert fald :) Men hvis du vil udgå at lave en DLL,
så er det uanset hvad, nødvendigt at have et modul i din kode. Problemet er
nemlig, at AddressOf ikke kan referere til procedurer i en klasse. Dette
skyldes at klassen opfattes som private i koden. En klasse eksisterer jo kun
så længe den er oprettet fra koden med f.eks. Dim cTmr As New clsTimer.
Derfor er du nødt til at have TimerProc liggende i modulet. Herfra skal du
så referere beskeden tilbage til den form/objekt, som har oprettet klassen.
Det er ikke helt nemt, og kræver kendskab til pointers (og gerne C+)
programmering. Jeg vil ikke spilde tid med at forklare det her, for
sandsynligheden er, at det bare forvirrer mere end det gavner.

Hvis det skal laves elegant og uden besvær, så vil jeg anbefale, at du laver
en lille DLL til formålet.

Hilsen Kim Pedersen



Mads (10-02-2004)
Kommentar
Fra : Mads


Dato : 10-02-04 20:50

"Kim Pedersen" <ppicasso@hotmail.com> wrote in message
news:c083oj$mvm$1@sunsite.dk...
> > Den virker lidt besværlig min metode, så vil gerne høre om andre har en
> mere
> > elegant løsning, der stadig, fra resten af programmet, ligner en normal
> > Timer klasse.
>
> Det virker besværligt i hvert fald :) Men hvis du vil udgå at lave en DLL,
> så er det uanset hvad, nødvendigt at have et modul i din kode. Problemet
er
> nemlig, at AddressOf ikke kan referere til procedurer i en klasse. Dette
> skyldes at klassen opfattes som private i koden. En klasse eksisterer jo
kun
> så længe den er oprettet fra koden med f.eks. Dim cTmr As New clsTimer.

Ja, overvejede om man evt. kunne erklære klasse static eller noget lignende.

> Derfor er du nødt til at have TimerProc liggende i modulet. Herfra skal du
> så referere beskeden tilbage til den form/objekt, som har oprettet
klassen.
> Det er ikke helt nemt, og kræver kendskab til pointers (og gerne C+)
> programmering. Jeg vil ikke spilde tid med at forklare det her, for
> sandsynligheden er, at det bare forvirrer mere end det gavner.
>
Tjo. Har nu aldrig syntes pointers principelt var komplicerede (selvom jeg
dog har set nogle konstuktioner som indeholdt en snedig udnyttelse)
Jeg har overvejet hvorledes man mest effektivt (og elegant) kan propagere
Timer event'en til det rette Timer objekt, så den kan rejse en normal VB
event. Men det var nok mest elegant med en DLL

Venlig Hilsen
Mads



Kim Pedersen (10-02-2004)
Kommentar
Fra : Kim Pedersen


Dato : 10-02-04 22:33

> Tjo. Har nu aldrig syntes pointers principelt var komplicerede (selvom jeg
> dog har set nogle konstuktioner som indeholdt en snedig udnyttelse)
> Jeg har overvejet hvorledes man mest effektivt (og elegant) kan propagere
> Timer event'en til det rette Timer objekt, så den kan rejse en normal VB
> event. Men det var nok mest elegant med en DLL

Det er i hvert fald det nemmeste. I hvert fald kommer du ikke uden om et
modul i koden, da du ikke kan lave en addressof til en funktion eller sub i
en klasse. Det du kan gøre er at lave en funktion i et modul som modtager
alle WM_TIMER beskederne. Når disse modtages skal de sendes tilbage til den
form, hvor klassen med timeren er oprettet. Det kan gøres ved at du med
SetProp gemmer en pointer til formen. Da hWnd vil pege tilbage på formen,
som timeren er styret fra, vil du derfor med GetProp kunne læse pointeren og
med et lille trick få en reference tilbage til formen:

Dim frm As Object
CopyData frm, GetProp(hWnd,"ObjPtr",4), 4
frm.TimerProc()
CopyData frm, 0&, 4

Det er naturligvis stadig lidt rodet, men det virker. Igen kommer jeg
tilbage til, at eneste "elegante" måde er at lave en DLL eller
oprette/slette timeren automatisk.

Og du har helt ret. Pointers er i sig selv ikke noget problem, men jeg har
flere gange tidligee forsøgt at hjælpe folk i dette og andre forums, hvor
jeg brugte dage på at forklare dem noget, som de bare opgav fordi de ikke
havde kendskab til noget, som ligger lidt uden for VB. Pointers er ikke
noget man sådan normalt støder på i VB, så derfor den overfladiske kommentar
:)

Hilsen Kim Pedersen
http://www.vbcodemagician.dk



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste