Не удается получить доступ к удаленному объекту в Delphi Prism - PullRequest
0 голосов
/ 22 июля 2011

Я программирую под 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 является оконной формой, которая является частью класса, очень похожа на глобальную переменную, почему оконная форма располагается, когда вы закрываете ее после открытия. Разве он не сохраняется в памяти до тех пор, пока вся программа не будет закрыта для легкого доступа?

UPDATE: Внутри onFormClosing я скрываю форму, и она, кажется, работает, но когда я пытаюсь снова открыть форму, она вызывает то же исключение, что и раньше: «Не удается получить доступ к удаленному объекту».

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

1 Ответ

1 голос
/ 22 июля 2011

Когда вы заглянете в документацию 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...