none
無法處理以處置過的物件 RRS feed

  • 問題

  • 各位大大您们好,我想請問一下,我設計一表單(form1)可以開多表單(form2,form3),一開始我再全域變數設
    private Form2 Close_UP = new Form2();
    private Form3 Setting_System = new Form3();
    而我再form1表單某一按鈕寫
            private void button1_Click(object sender, EventArgs e)
            {
                Close_UP.Owner = this;
                Close_UP.Show();
            } 
            private void button2_Click(object sender, EventArgs e)
            {
                Setting_System.Owner = this;
                Setting_System.Show();
            }

    第一次我按是可以低,但第二次程式即會出現"無法處理以處置過的物件",我有試著將Close_UP = new Form2();
    Setting_System = new Form3();寫入click裡面,可是因為一開始有些方法就會使用到Close_UP,Setting_System裡的方法,若寫變成區域變數,會變成類似沒有將物件實體化的問題,請問各位大大我該如何解決這個問題,謝謝
    2009年3月4日 上午 06:18

解答

  • 1.寫一支語言變換表單.
    2.主表單傳語言資訊至語言轉換表單.
    3.語言轉換表單傳回結果.
    4.主表單建立語言轉換事件.
    5.功能表單註冊此轉換事件.
    6.主表單接收轉換結果並發行此轉換事件.
    7.功能表單收到此事件,執行事件處理函式改變UI顯示
    • 已標示為解答 冰糖旋風 2009年3月5日 上午 09:46
    2009年3月5日 上午 07:25
  •  我這樣想不知道你適不適用
    你可以把語言選擇的參數視為一個共同變數
    假設叫 X好了
    你把這X放在一個Module裡
    然後在每個Form的建構函式中讀取這個X
    建構函式中並撰寫依據X值而需要改變的控制項文字
    於是每次 new Form就會以此X來改變...
    這樣就不用弄個全域的東西
    因為你用全域實體化一個Form以後,如果把這Form關閉
    除非你是把From Hide而不是Close
    不然它就Dispose了..所以就會出現"無法處理已處置過的物件"這個問題

    • 已標示為解答 冰糖旋風 2009年3月5日 上午 09:46
    2009年3月5日 上午 08:42
    版主

所有回覆

  • 你所謂一開始用到的那些方法和Form2,Form3有絕對關係嗎?
    也就是那些方法會和Form2,Form3實體化的物件或屬性有關嗎?
    如果沒有,把那些方法拆到另一個自訂模組或類別就好了...

    2009年3月4日 上午 06:41
    版主
  • 有耶,因為那些方法就是,把他們個別表單物件的名字(可能會變動)放在一起,所以算有直接關係,謝謝
    2009年3月4日 上午 07:30
  • 我有個怪方法..
    在你的Form2及Form3中加入建構函式

    using System;  
    using System.Collections.Generic;  
    using System.ComponentModel;  
    using System.Data;  
    using System.Drawing;  
    using System.Text;  
    using System.Windows.Forms;  
     
    namespace xTest  
    {  
        public partial class Form2 : Form  
        {  
            public Form2(string strName)  
            {  
               base.Name = strName;  
                InitializeComponent();  
            }  
             
     
     
        }  
    以上是我在Form2的建構函式
    然後在Form1呼叫這個建構函式
    using System;  
    using System.Collections.Generic;  
    using System.ComponentModel;  
    using System.Data;  
    using System.Drawing;  
    using System.Text;  
    using System.Windows.Forms;  
     
    namespace xTest  
    {  
        public partial class Form1 : Form  
        {  
            
            private Form2 xform = new Form2("xx");  
            public Form1()  
            {  
                InitializeComponent();  
            }  
     
            private void Form1_Load(object sender, EventArgs e)  
            {  
     
            }  
     
            private void button1_Click(object sender, EventArgs e)  
            {  
                Form2 xform = new Form2("xx");  
                          xform.Show();  
     
            }  
        }  
    這樣試試看吧....
    2009年3月5日 上午 01:36
    版主
  • 一群人都有這種問題?
    為什麼大家都想用FormA去控制FormB的xxx控制項那?
    其實FormA 跟FormB只是資料參照的關係.
    由主表單Host資料,將資料送至子表單,處理完再傳回來主表單這麼簡單而已.
    2009年3月5日 上午 02:23
  • 所以我才說..怪方法..
    因為我自己也沒這樣搞過..
    很好奇,小綠兒可以解釋一下這樣做的目的為何嗎?
    2009年3月5日 上午 04:39
    版主
  •  這是因為有很多表單各有不同功能,而主表單上有那些表單的按鈕,在主表單上按了某個按鈕後,就顯示該表單出來,我單單只是要他們可以透過主表單顯示出來,所以不是要NEW新的那的表單嗎,如果不用這種方式,請問大大是否有更好的方式,謝謝
    2009年3月5日 上午 06:17
  • 小綠兒 表示:

    有耶,因為那些方法就是,把他們個別表單物件的名字(可能會變動)放在一起,所以算有直接關係,謝謝



    我們的問題應該不是New Form...而是直接關係這件事,
    如果你把那些方法講一下,也許有方法不需要在Form1一開始就出現
    private Form2 Close_UP = new Form2();
    private Form3 Setting_System = new Form3();

    2009年3月5日 上午 06:30
    版主
  • 就是壓,我在每一表單,把他們自己的物件(label,button)放在一個方法(假設 changeLag())裡,好讓我可以簡單變動他們的text名字(changeLag()),而因為我要做多國語言,假設是在form2可以切換語言,切換後我會透過form1去呼叫全部表單執行自己轉換語言的方法即changeLag(),你懂我說的嗎,所以各個表單的changeLag()一開始會寫再主表單裡,而又因為我要在主表單上,可以控制按哪個鈕,會出現哪個表單,故又把new 表單放在全域裡,大大謝謝您喔
    2009年3月5日 上午 07:02
  • 1.寫一支語言變換表單.
    2.主表單傳語言資訊至語言轉換表單.
    3.語言轉換表單傳回結果.
    4.主表單建立語言轉換事件.
    5.功能表單註冊此轉換事件.
    6.主表單接收轉換結果並發行此轉換事件.
    7.功能表單收到此事件,執行事件處理函式改變UI顯示
    • 已標示為解答 冰糖旋風 2009年3月5日 上午 09:46
    2009年3月5日 上午 07:25
  •  我這樣想不知道你適不適用
    你可以把語言選擇的參數視為一個共同變數
    假設叫 X好了
    你把這X放在一個Module裡
    然後在每個Form的建構函式中讀取這個X
    建構函式中並撰寫依據X值而需要改變的控制項文字
    於是每次 new Form就會以此X來改變...
    這樣就不用弄個全域的東西
    因為你用全域實體化一個Form以後,如果把這Form關閉
    除非你是把From Hide而不是Close
    不然它就Dispose了..所以就會出現"無法處理已處置過的物件"這個問題

    • 已標示為解答 冰糖旋風 2009年3月5日 上午 09:46
    2009年3月5日 上午 08:42
    版主
  • 謝謝大大的幫助,您们的方法我會自己在去試試看低,謝謝
    2009年3月5日 上午 09:46
  • To Bill Chung 你這跟全域變數有何不同?
    所為全域變數只是一個稱呼,一種區域大小的區分,Class 變數比方法變數範圍大,所以Class 變數對方法變數來說可以稱全域變數.
    應用程式的變數比Class變數範圍大所以也是全域變數.
    你的方法又比應用程式範圍大.
    放在檔案裡可以稱本機全域變數.
    我看把它放在資料庫裡做系統變數好了.
    2009年3月5日 下午 12:38
  • 好說兄...您誤會了
    我這種方法的變數的確是全域,而且在整個Apllication都會只有一份Copy
    我的意思主要是,不要把Form類別的東西拿來當全域
    因為Form會有開關的問題,會導致instance被Dispose
    所以用一般的變數來做全域才不會出現這種"無法處理已處置過的物件"的現象


    2009年3月6日 上午 12:20
    版主
  • MSDN 裡不是有多國語言的做法嗎?
    裡面會依語言設定去抓相關的Resource嗎?
    2009年3月6日 上午 12:54