none
如何開啟一個新form RRS feed

  • 問題

  • 請問各位這樣的情況該如何撰寫程式呢?

    原先透過新增專案增加一個windows form為form1, 然後設定一個按鍵去播放一個檔案(.avi之類的), 不過需要在新的form中,所以我使用了.show()可以去開啟一個新的form2,不過如果要將原新的form1隱藏or消失,因該如何做呢?

    如果form2播放完畢後, 又該如何將form1叫回來呢?

     

    謝謝!!!

     

    YKen

    2006年4月12日 下午 04:32

解答

  • Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim form2 As Form2
            form2 = New Form2
            form2.Show()

            '加進去你要做的事
            Me.Visible = False '看不見
        End Sub
    End Class

    Public Class Form2   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Form1.Visible = True '又看得見了
            Me.Dispose(True) 'form2自殺
        End Sub
    End Class

     

    form2播放完畢後?你指的是自己播完後,自動關掉並叫form1回來?

    那你可能就把Button1_Click換個Event來自殺並把form1帶回來就好了。

    2006年4月12日 下午 05:28

所有回覆

  • Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim form2 As Form2
            form2 = New Form2
            form2.Show()

            '加進去你要做的事
            Me.Visible = False '看不見
        End Sub
    End Class

    Public Class Form2   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Form1.Visible = True '又看得見了
            Me.Dispose(True) 'form2自殺
        End Sub
    End Class

     

    form2播放完畢後?你指的是自己播完後,自動關掉並叫form1回來?

    那你可能就把Button1_Click換個Event來自殺並把form1帶回來就好了。

    2006年4月12日 下午 05:28
  • 謝謝您 這樣我暸解了..

    Ken

    2006年4月13日 上午 04:08
  •  Simon1120 寫信:

    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim form2 As Form2
            form2 = New Form2
            form2.Show()

            '加進去你要做的事
            Me.Visible = False '看不見
        End Sub
    End Class

    Public Class Form2   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Form1.Visible = True '又看得見了
            Me.Dispose(True) 'form2自殺
        End Sub
    End Class

     

    form2播放完畢後?你指的是自己播完後,自動關掉並叫form1回來?

    那你可能就把Button1_Click換個Event來自殺並把form1帶回來就好了。

    請問我在Form2.vb中加入
            Form1.Visible = True '又看得見了
    但是會出現錯誤 "參考非共用成員需要物件參考" 請問該如何解決呢?

     

    謝謝!!

    2006年4月17日 上午 04:52
  • 驚訝中,因為我實際上就把code是這樣寫的copy過來。

    你是用VS2005版?如果不是的話…我比較早以前的習慣寫法是這樣的:

    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim form2 As Form2
            form2 = New Form2
            form2.Show()

            form2.Tag = Me

            Me.Visible = False '看不見

        End Sub

     

    Public Class Form2

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim form As Form1
            form = CType(Me.Tag, Form1)
            form.Visible = True

            Me.Dispose(True)
        End Sub
    End Class

     

    我用form2的Tag把form1自己的ref傳到form2

    在form2再從Tag中拿出form1的ref後對form做動作。

    這樣子寫比較好,說真的,因為當你有兩個Form1的 instance時,之前的寫法可能會怪怪的。

    Tag的用法,我個人是拿來這樣用的,就是把call的一方丟進去。就可以從被call的一方知道是誰在call他了。

    如果你覺得Tag有別的用途的話,你就在Form2中設一個public的get和set來做資訊傳輸用吧。

    試試吧。不過我不確定能不能解決你的這個Error的問題

    2006年4月17日 下午 02:31
  • 您好! 謝謝您的回覆, 我是使用vs2003版的.
    您的程式碼是沒有錯的,也讓我學習到tag的功能,不過我還是有測到一個問題,那就是如果我在form2執行關閉,也是會有程式常駐的情況。

    是不是因該在Closed中加入刪除form1的動作呢?
    例如:
        Private Sub Form2_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
            Dim form As Form1
            form = CType(Me.Tag, Form1)

            form.Close()
        End Sub
    不知道這樣會不會怪怪的呢?還是該改成什麼樣子呢?

    謝謝!
    Ken
    2006年4月19日 上午 09:25
  • 如果你希望form2關掉,也關掉form1那麼就這樣做吧。

    不過看你怎麼設計使用者流程就是了。我比較不會這麼做就是了。

    關掉不會使用的資產是好習慣,但通常會選擇關掉在自己class中New過的resouce寫在Dispose裡。而會去不關掉外來參照資源,因為你外來參照資源通常不是自己掌握的。

    我通常會建一個MainForm,然後把要開的form都做子對話框或是程序使用。比較不希望由子程序結束整個MainForm的操作。

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbconmdiapplications.asp

    MDI 的設計方式,你可以參考一下。分成parent form 和child form的方式。child form應該盡量少去關掉parent form的資源。就像是你同時可以用office word去開許多個word檔這樣,你可以關任一其中一個在操作中的word檔,而不使其他在編輯中的word關掉。而你要結束整個程式,應該是由MainForm來自我了斷。

    2006年4月19日 上午 10:00
  • 瞭解,所以我因該在關閉child form時去呼叫parent form. 這樣資源才會依序關閉對吧!

     

    謝謝你,讓我瞭解了不少。

     

    Ken

    2006年4月20日 上午 08:11