0

我在 Delphi Prism 下为 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 是一个窗口窗体,它是类的一部分,很像一个全局变量,为什么在打开它后关闭它时会释放窗口窗体。它不是一直保存在内存中,直到整个程序关闭以便于访问?

更新: 在 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 在关闭时释放它的所有资源并自行处理。

你想要的实际上是 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 回答