2011-07-22 9 views
0

私はDelphi Prism for Monoでプログラミングしています。ウィンドウフォームがクラス内で宣言され、コンストラクターでインスタンス化されているにもかかわらず、すでに開いて閉じたウィンドウフォームを開いた後に、このエラー「取り消し済みオブジェクトにアクセスできません」が表示され続けます。ここでDelphi Prismの配置オブジェクトにアクセスできない

は、それが宣言されたクラスです。

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にイベントをキャンセルする可能性があります。代わりにHideを呼び出すことができます。もちろん、実際にウィンドウを閉じて廃棄する必要がない場合にのみ、イベントを取り消す必要があります。 –

+0

@セバスチャン:FWIW、Delphiでは、フォームを閉じることなく、それ自体を解放することができます。これはプロパティの設定です。 –

関連する問題