0

私はDelphiPrismforMonoでプログラミングしています。ウィンドウフォームがクラス内で宣言され、次のようにコンストラクターでインスタンス化されているにもかかわらず、既に開いているウィンドウフォームと閉じているウィンドウフォームを開いた後、このエラー「破棄されたオブジェクトにアクセスできません」が表示され続けます。

宣言されているクラスは次のとおりです。

  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はグローバル変数によく似たクラスの一部であるウィンドウフォームであるため、ウィンドウフォームを開いた後に閉じるとウィンドウフォームが破棄されるのはなぜですか。簡単にアクセスできるようにプログラム全体がシャットダウンされるまで、メモリに保持されませんか?

更新: onFormClosing内で、フォームを非表示にして機能しているように見えますが、フォームを再度開こうとすると、以前と同じ例外が発生します。「破棄されたオブジェクトにアクセスできません」。

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

1 に答える 1

1

System.Windows.Forms.Form.Close()のドキュメントを見ると、フォームがすべてのリソースを解放し、閉じたときにそれ自体を破棄することがドキュメント化されていることがわかります。

必要なのは、実際には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;
于 2011-07-22T16:05:43.340 に答える