Как освободить TMessage - PullRequest
       27

Как освободить TMessage

0 голосов
/ 21 июня 2019

Я использую 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 голосов
/ 24 июня 2019

Вы не удаляете сообщение TMessage.Это запись, а не объект или указатель.TMessage обрабатывается так же, как компилятор и Integer или Byte - кусок памяти, который перемещается и реплицируется по мере необходимости.Это не адрес или ссылка.Документы говорят вам, что если TMessage содержит ссылку на другой отдельный объект, вы несете ответственность за его освобождение.

...