如何在其事件处理程序中释放对象?

时间:2015-04-11 10:23:42

标签: delphi

我有TMyClass,一个派生自TObject的类。它有一个TTimer。每隔几分钟,从Timer.OnTimer我检查一个网页。当网页发生变化时,我就完成了,我想要释放MyClass。我如何释放它?

我的问题类似于this一个但我的控制'不是TControl。它是TObject的后代。所以,消息不会起作用。 显然,解决方案是从TControl或更高版本派生我的类。但是,让我们说我不想这样做。在这种情况下,解决方案是什么?

2 个答案:

答案 0 :(得分:6)

使用消息背后的基本思想是正确的:确保在以后调用它的任何代码完成后,稍后释放对象。

几年前,我写了一个Delayed Action单元,它为您提供了一种在没有TControl的情况下实现相同效果的简单方法。您只需调用DelayExec并向其传递一个将释放该对象的匿名方法,并在内部设置一条消息,以便在消息队列被抽取后立即生效。

答案 1 :(得分:5)

要接收消息,您需要有窗口句柄。您可以使用AllocateHWnd分配一个,例如

type
  TMyClass = class(TObject)
  private
    FHandle: HWND;
    procedure MyWndProc(var Msg: TMessage);
  public
    constructor Create; virtual;
    destructor Destroy; override;
  end;

constructor TMyClass.Create();
begin
  inherited Create();
  FHandle := AllocateHWnd(myWndProc);
end;

destructor TMyClass.Destroy;
begin
  DeallocateHWnd(FHandle);
  inherited;
end;

procedure TMyClass.MyWndProc(var Msg: TMessage);
begin
  case Msg.Msg of
    CM_RELEASE: begin
       Free;
    end;
    else Msg.Result := DefWindowProc(FHandle, Msg.Msg, Msg.WParam, Msg.LParam);
  end;
end;

现在,您可以使用FHandle将消息发布到对象,如您正在访问的帖子中所示。