2011-07-22 84 views
0

我在Delphi Prism for Mono下編程。即使窗口窗體是在類中聲明並在構造函數中實例化的,如下所示,我仍然收到此錯誤,即「打開已打開和關閉的窗體窗體後無法訪問已釋放的對象」。無法訪問德爾福棱鏡中的處置對象

這裏是在其中它被聲明的類:

MainForm = partial class(System.Windows.Forms.Form) 
    private 
    method SignalBtn_Click(sender: System.Object; e: System.EventArgs); 
    method CommBtn_Click(sender: System.Object; e: System.EventArgs); 
    method button1_Click(sender: System.Object; e: System.EventArgs); 
    method button2_Click(sender: System.Object; e: System.EventArgs); 
    method button4_Click(sender: System.Object; e: System.EventArgs); 
    method button5_Click(sender: System.Object; e: System.EventArgs); 
    method MainForm_Load(sender: System.Object; e: System.EventArgs); 
    method ShutdownBtn_Click(sender: System.Object; e: System.EventArgs); 
    method MySerialData(sender: System.Object; e:SerialDataReceivedEventArgs); 
    method LoginBtn_Click(sender: System.Object; e: System.EventArgs); 
    protected 
    method Dispose(disposing: Boolean); override; 
    public 
    RX:Array[0..5] of byte; 
    TX:Array[0..6] of byte; 
    serialPort1:System.IO.Ports.SerialPort; 
    thr:Thread; 
    stoploop:Boolean; 
    mcommand:Byte; 
    thechannel:Integer; 
    fr : UnitForm;  <<<<<<<<<<<< Here is the form being declared. 
    constructor; 
    method FillTable; 
    method mythread; 
    end; 

這裏是被實例化或創建的構造器:

constructor MainForm; 
begin 
    // 
    // Required for Windows Form Designer support 
    // 
    InitializeComponent(); 

    mcommand:=$AA; 
    thechannel:=$01; 
    stoploop:=false; 
    thr:=nil; 
    fr := new UnitForm; <<<<<<<<<<<<<<<<<< fr is created as new. 
    // 
    // TODO: Add any constructor code after InitializeComponent call 

    // 
end; 

下面是如何的形式被示出或內的開按鈕事件:

method MainForm.UnitBtn_Click(sender: System.Object; e: System.EventArgs); 
begin 
    fr.Show; 
end; 

因爲fr是一個窗口窗體,它是類的一部分很像一個全局變量,爲什麼窗口窗體在打開後關閉它時會放置。它是否保存在內存中,直到整個程序關閉以方便訪問?

UPDATE: 在onFormClosing,我隱藏的形式和它似乎工作,但是當我再次嘗試重新打開窗體,它會引發同樣的異常像以前「無法訪問釋放的對象。」

method UnitForm.UnitForm_FormClosing(sender: System.Object; e: System.Windows.Forms.FormClosingEventArgs); 
begin 
    hide; 
end; 

回答

1

當你看着System.Windows.Forms.Form.Close的documentation(),你會發現,那它的記錄的形式釋放所有它的資源和關閉時處置本身。

你想要的其實是Form.Hide()來隱藏用戶的表單。

編輯更新:只有當您在本機Delphi中調用Free/FreeAndNil時,纔會在窗體上調用.Close()。這是一樣的事情。

對於那些誰需要真正知道如何做到這一點,這裏是示例代碼:

method Form2.Form2_FormClosing(sender: System.Object; e: System.Windows.Forms.FormClosingEventArgs); 
begin 
    e.Cancel:=true; //line prevents form resources being released 
    self.hide;  //line tells the form to disappear. 
end; 
+0

我明白了。有意義,但是如果你點擊系統菜單按鈕上的x就會發生什麼。這在窗口的右上角。你如何觸發? – ThN

+0

OnFormClosing事件是您可以反應的地方。 FormClosingEventArgs有可能取消該事件,您可以改爲在此處調用隱藏。當然,只有當你不想實際關閉和處理窗口時,你才應該取消事件。 –

+0

@塞巴斯蒂安:FWIW,在德爾福,你可以在沒有釋放它的情況下關閉表格。這是一個屬性設置。 –