none
VB2008 關於MDI多重表單的使用疑問 RRS feed

  • 問題

  • 請教各位大大!小弟在程式中置入一個多重表單!在第1次進入時他的點選及畫面切換都正常!
    但為何在第2次進入時!他會變成點選時畫面就不會跟著切換!請問大大是在使用上,小弟漏掉了什麼嗎??

    Public Class Form4
       
    Private Sub Form4_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    ' Me.ActiveMdiChild.Close() 
        End Sub
        Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                   Form4_1.Show()
        End Sub
    
        Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
            Me.ActiveMdiChild.Close()
            Form4_3.Show()
        End Sub
    
        Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click
            Me.ActiveMdiChild.Close()
            Form4_2.Show()
        End Sub
    
        Private Sub ToolStripMenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem3.Click
            Me.ActiveMdiChild.Close()
            Form4_3.Show()
        End Sub
    End Class
    我一開始以為是直接關閉表單時要執行  Me.ActiveMdiChild.Close(),不過執行第2次時!畫面依舊無法切換!按表單控制項關閉表單時!則會出現 新增在closing事件中的這個物件未被宣告!
    測試結果:若關閉父表單時子表單最後顯示不是form4_1 這個的話!下次再開啟就會出現畫面無法切換的情況!
    所以我目前在closing事件中 放入這個語法
     
    Private Sub Form4_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            Me.ActiveMdiChild.Close()
            Form4_1.Show()
        End Sub
    請問各位大大小弟遇到的情況!又比較好的方式解決嗎?

    新手上路
    2009年7月27日 上午 07:45

解答


  • 例:
    Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click
            Me.ActiveMdiChild.Close()  <-------error: 並未將物件參考設定為物件的執行個體
            Form4_2.Show()
     End Sub 

         Me.ActiveChild.Close的先決條件是至少要有一個 Chuld Form是Active狀態, 出現這問題, 通常是因為沒有ActiveChild Form存在

    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    • 已標示為解答 Lolota Lee 2009年8月3日 上午 09:08
    2009年7月27日 下午 01:42
    版主

所有回覆

  • 把錯誤行標記出來,錯誤訊息完整張貼。

    第二次執行是什麼意思?關閉子視窗重開,還是關閉應用程式重開?


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月27日 上午 08:47
  • 我在form1 中 將 form4 呼叫出來.. 

    Private Sub ToolStripMenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem5.Click
            Form4.ShowDialog()
    End Sub

    form4 為一個 父表單 包含 Form4_1~Form4_7 ,7個子表單  form4_1 為載入的第一個啟始畫面
    當我將form4 關閉時結束畫面不為form4_1時
    再重新呼叫時 ! 就會發生 畫面不能替換的情況!

    錯誤發生處, 剛小弟說的不太清楚抱歉!!每個畫面切換鍵都會觸發這個異常

    例:
    Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click
            Me.ActiveMdiChild.Close()  <-------error: 並未將物件參考設定為物件的執行個體
            Form4_2.Show()
     End Sub 

    以上是小弟問題的敘述!!如有未詳細的地方.請大大見諒!感謝
    新手上路
    2009年7月27日 上午 09:08
  • Form4.ShowDialog -> 對話盒在應用程式關閉重新執行前,並不會真的載出,會保留前次記錄。

    Me.ActiveMdiChild -> Me 須為 MDI ,且須要有子視窗才能成立,請確認子視窗開啟時,是否有設:
    子視窗.MdiParent = Me
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月27日 上午 09:14
  • 感謝心冷大大.我在每個子視窗中均有放入這段程式語法

    Private Sub Form4_1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.MdiParent = Form4
            Me.Parent = Form4.Panel1
    End Sub

    而form4的屬性為: Form4.IsMdiContainer = True..

    就如大大說的!他會保留前次記錄的畫面~但是我按認一個畫面選擇鍵!他均會跳到form4_1這個!之後的情況就如同我敘述的~
    是否是程式在form4_load 這裡執行 載入form4_1 造成的影響 


    新手上路
    2009年7月27日 上午 09:37

  • 例:
    Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click
            Me.ActiveMdiChild.Close()  <-------error: 並未將物件參考設定為物件的執行個體
            Form4_2.Show()
     End Sub 

         Me.ActiveChild.Close的先決條件是至少要有一個 Chuld Form是Active狀態, 出現這問題, 通常是因為沒有ActiveChild Form存在

    請關心自己的問題,不要問了就放空;這是對別人與自己的尊重
    • 已標示為解答 Lolota Lee 2009年8月3日 上午 09:08
    2009年7月27日 下午 01:42
    版主
  • 是的!我也想過這個問題!所以我程式有做了變更!

    在Module 中宣告 :  Public activeChild As Form

    Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                If (activeChild Is Nothing) Then
                    Form4_1.Show()                activeChild = Me.ActiveMdiChild
                End If
    End Sub
     Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click
            Me.ActiveMdiChild.Close()
            Form4_2.Show()
            activeChild = Me.ActiveMdiChild
      End Sub



    用這樣來記錄目前開啟form..這樣測試結果中!是OK的
    不知各位大大對這有何看法!或是其他做法!提供小弟參考


    新手上路
    2009年7月28日 上午 08:47