Не удается получить доступ к удаленному объекту в Delphi Prism

Я программирую под 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;

person ThN    schedule 22.07.2011    source источник


Ответы (1)


При просмотре документации System.Windows.Forms.Form.Close() вы заметите, что документировано, что форма освобождает все свои ресурсы и удаляет себя при закрытии.

На самом деле вам нужно Form.Hide(), чтобы скрыть форму от пользователя.

Обновление редактирования: вы должны вызывать .Close() в форме только тогда, когда вы вызываете Free/FreeAndNil в родном Delphi. Это вроде то же самое.

Для тех, кому действительно нужно знать, как это сделать, вот пример кода:

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;
person Sebastian P.R. Gingter    schedule 22.07.2011
comment
Я понимаю. Имеет смысл, но что, если вы нажмете кнопку системного меню с крестом на ней. Это в правом верхнем углу окна. Как вы запускаете на это? - person ThN; 22.07.2011
comment
Вы можете отреагировать на событие OnFormClosing. FormClosingEventArgs имеет возможность отменить событие, и вместо этого вы можете вызвать Hide там. Конечно, вы должны отменить событие только тогда, когда вы не хотите на самом деле закрывать и удалять окно. - person Sebastian P.R. Gingter; 23.07.2011
comment
@Sebastian: FWIW, в Delphi вы можете закрыть форму, не освобождая ее. Это настройка свойства. - person Rudy Velthuis; 24.07.2011
comment
Да, Руди, но Windows Forms — это не Delphi VCL ;-) - person Sebastian P.R. Gingter; 24.07.2011
comment
@Sebastian: я знаю, но я просто хотел исправить ваше мнение о том, что Close() делает то же самое в Delphi. - person Rudy Velthuis; 24.07.2011
comment
@Rudy И что это за настройка свойства? Просто напомню, что я работаю с Delphi Prism для Mono. Я думал, что смогу легко освоить программирование для Delphi 5 и 7 в течение многих лет, но теперь я обнаружил, что Delphi Prism почти так же, как изучение нового языка. - person ThN; 25.07.2011
comment
Дело не столько в языке. Когда вы привыкли к Delphi VCL, отличия от .NET Framework довольно велики, но общий способ работы с Windows.Forms остается прежним. Вы просто изучаете новый фреймворк. - person Sebastian P.R. Gingter; 25.07.2011