如何释放TMessage

时间:2019-06-21 20:37:56

标签: delphi messaging

我正在使用Delphi 10.2,为移动设备编写代码,但在Windows上进行测试。尝试通过以下代码删除消息(使用Free或DisposeOf)时出现“无效的指针操作”错误:

procedure TViewmodelAuthentication.HandleSignUp;
var
    lTarget: TFrameSetupRecord;
    lMsg: TMessage;
begin
    lTarget.Frame := ftSignUp;
    lTarget.Direction := TTabTransitionDirection.Normal;
    lMsg := TGoToMessage<TFrameSetupRecord>.Create(lTarget);
    TMessageManager.DefaultManager.SendMessage(self, lMsg);
    lMsg.DisposeOf;  //Error: Invalid pointer operation
end;

我注意到在此Embarcadero代码示例中未删除该消息:

procedure TForm1.Button1Click(Sender: TObject);
var
  MessageManager: TMessageManager;
  Message: TMessage;
begin
  MessageManager := TMessageManager.DefaultManager;
  Message := TMessage<UnicodeString>.Create(Edit1.Text);
  MessageManager.SendMessage(Sender, Message, True);
end;

但是TMessage上的文档似乎说应该删除该消息:

  

但是,当您创建一个以对象为值的TMessage时,TMessage   不拥有对象的所有权;您必须删除对象   自己,并确保首先删除了邮件。

我应该如何删除邮件?

谢谢

1 个答案:

答案 0 :(得分:-1)

您不删除TMessage。它是一条记录,而不是对象或指针。编译器和整数或字节以相同的方式对待TMessage,后者是根据需要移动并复制的内存块。 它不是地址或参考。文档告诉您的是,如果TMessage包含对另一个单独对象的引用,则您有责任确保将其释放。