2015-11-05 36 views
1

我希望在主窗體中的計時器滴答時減少類中的某些值。我正在創建同一個類的多個實例,因爲我的程序是一個模擬應用程序,我不會將這些實例存儲在數組或任何列表中。我只是聲明它們並將它們的圖片框添加到主窗體上的控件。不過,我希望在類中有一個子例程,當主窗體中的計時器打勾時觸發該子例程。我認爲是這樣的:從類中處理定時器

Public Class Jimmy 
    Dim _a As Integer = 10 

    Sub decreseNum(sender As Object, e As EventArgs) Handles mainapp.tmrLog.Tick 
     _a -= 1 
    End Sub 

End Class 

mainapp爲主要形式的名稱和tmrLog是我想我的子程序與關聯的計時器。但是上面的代碼不起作用

+0

該子不會工作,因爲你不叫它。如果你希望子創建一個新實例就開始工作,你應該使用[構造函數](https://en.wikipedia.org/wiki/Constructor_(object-oriented_programming))來完成。 – Eminem

+0

我建議把它們放到某種集合中,然後讓定時器使用For Each循環調用每個對象的Decrement方法 – peterG

+0

爲了擴展我以前的評論,我這樣做的原因是耦合在定時器和對象之間更寬鬆。例如減量法可以很容易地從別處調用。如果你在對象中有一個定時器的引用,那麼主對象和對象就會彼此瞭解太多。 – peterG

回答

0

你可以嘗試定義在麥類的本地引用定時器:

Public Class Jimmy 
    Dim _a As Integer = 10 
    Private WithEvents tmr As Timer 

    Public Sub New(ByRef MainTmr As Timer) 
     tmr = MainTmr 
    End Sub 

    Sub decreseNum(sender As Object, e As EventArgs) Handles tmr.Tick 
     _a -= 1 
    End Sub 
End Class 
0

如果你想所有的類反應timer.elapsed事件,只是註冊了其。以下計劃全面運作。這是例如,你可以做些什麼來讓您的孩子單親的計時器事件/定時器

Imports System 
imports system.timers 

Public Module Module1 
    Public Sub Main() 

     dim mc as new MainClass() 
     mc.CreateChildren(5) 
     System.Threading.Thread.Sleep(60000) ' wait and monitor output of childern 
     mc.Stop() 
     Console.WriteLine("All should stop now...") 
     Console.Read() 
    End Sub 
End Module 

public class MainClass 'This class could be your form 

    private _timer as new Timer(5000) 

    public sub CreateChildren(count as integer) 

     For i as integer = 1 to count 
      dim c as new Child(i) 
      Addhandler _timer.Elapsed, addressof c.DoWhentimerTicks 
     next 
     Console.WriteLine("timer should run now...") 
     _timer.Start() 

    end sub 

    public sub [Stop]() 
     _timer.Stop() 
    End Sub 

End class 


public class Child 

    private _myNO as integer 

    public sub new (no as integer) 
     _myNo = no 
    end sub 

    public sub DoWhentimerTicks(sender as object , e as ElapsedEventArgs) 


    Console.WriteLine(string.format("Child #{0} just ticked. Time = {1}", _myNo, e.signaltime)) 

    end sub 
End class 
-1

,我發現我的解決方案,在這裏發帖進一步參考反應。 我的情況是試圖讓我的計時器在觸發類中的一個子類,我使用了以下解決方案。

類:當你想與

RemoveHandler Form1.Timer1.Tick, AddressOf subToBeTriggered 

否則刪除處理

Sub addHandlesToSub 
    AddHandler Form1.Timer1.Tick, AddressOf subToBeTriggered 
End Sub 

Sub subToBeTriggered(sender As Object, e As EventArgs) 
    'My code 
End Sub 

在subToBeTriggered的參數是有用的,會有沒有參數的錯誤。

感謝所有的答案。

+0

很高興您將自己的答案作爲解決方案提供給您,但我已經給您完整的答案如何執行您想要做的事情,並且它包含了AddHandler。你有沒有看過我提供的光滑圖案解決方案? –