none
systemTimer 輪詢委派顯示另一個 Form 中的變數,顯示不出來 RRS feed

  • 問題

  • 使用 VB 2008 Express。

    做了 2 Form,
    Form1 為 MainForm,裝載著一個 Public 的有值陣列變數,
    Form1 中放一個按鈕 ShowDialog 出 Form2

    Form2 中放一個按鈕,按鈕裡是 SystemTimer,SystemTimer AddressOf 輪詢一個 Sub,
    Sub 裡用委派要顯示 Form1 的 Public 有值陣列變數( Label1.text = Form1.a(0) ),
    但這樣顯示的卻是 Null,我改用 WinForm 的 Timer 以同樣方法測試操作可以正常顯示。

    請問我如何可以讓 SystemTimer 正常顯示呢?

    Form1:

        Public a(2) As String
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            a(0) = "22"
            a(1) = "11"
            a(2) = "33"
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Form2.ShowDialog()
        End Sub

    Form2:

        Dim SystemTime1 As New System.Timers.Timer()
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            AddHandler SystemTime1.Elapsed, AddressOf ss
            SystemTime1.Interval = 900
            SystemTime1.Enabled = True
            GC.KeepAlive(SystemTime1)
        End Sub
    
        Sub ss()
            myUI(Form1.a(0), Label1)
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            myUI(Form1.a(0), Label1)
        End Sub
    
    
        Private Delegate Sub myUICallBack(ByVal myStr As String, ByVal c As Control)
        Private Sub myUI(ByVal myStr As String, ByVal c As Control)
            If InvokeRequired Then
                Dim myUpdate As myUICallBack = New myUICallBack(AddressOf myUI)
                BeginInvoke(myUpdate, myStr, c)
            Else
                c.Text = myStr
            End If
        End Sub

    2012年11月16日 上午 05:34

解答

  • 沒有看到Form1和Form2的宣告, 如果Form1是類別, 變數應該寫成這樣:

    Public Shared a(2) As String

    • 已標示為解答 C.Kevin 2012年11月16日 上午 06:47
    2012年11月16日 上午 06:14

所有回覆

  • 沒有看到Form1和Form2的宣告, 如果Form1是類別, 變數應該寫成這樣:

    Public Shared a(2) As String

    • 已標示為解答 C.Kevin 2012年11月16日 上午 06:47
    2012年11月16日 上午 06:14
  • 謝謝 tihs, Public Shared a(2) As String 這樣解決了!

    Public Class Form1
    
        Public Shared a(2) As String
        Dim SystemTime1 As New System.Timers.Timer()
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            a(0) = "22"
            a(1) = "11"
            a(2) = "33"
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Form2.ShowDialog()
        End Sub
    End Class


    • 已編輯 C.Kevin 2012年11月16日 上午 06:47
    2012年11月16日 上午 06:47
  • 這是寫 Visual Basic 的人在多執行緒常會踩到的雷, 原因在於你原來的寫法中在 Form2 裡的那個 Form1 , 不是原來的 Form1

    可以參考之前有一個類似的討論, 把前因後果弄懂, 不然你以後還是會一直踩到, 總不能啥都用靜態來解決

    [Thread的BeginInvoke和InvokeRequired的問題]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年11月16日 上午 06:56
    版主
  • To Bill Chung:

    我知道了,原來是這樣~~
    謝謝您的資料,我研究一下。

    2012年11月16日 上午 07:18