我有TMyClass,一个派生自TObject的类.它有一个TTimer.每隔几分钟,从Timer.OnTimer我检查一个网页.当网页发生变化时,我就完成了,我想要释放MyClass.我如何释放它?
我的问题与此类似,但我的"控制"不是TControl.它是TObject的后代.因此,消息将无法正常工作.显然,解决方案是从TControl或更高版本派生我的类.但是,让我说我不想这样做.在这种情况下,解决方案是什么?
使用消息背后的基本思想是正确的:确保在当前调用它完成的任何代码之后,稍后释放对象.
几年前,我编写了一个Delayed Action单元,它为您提供了一种在没有TControl的情况下实现相同效果的简单方法.您只需调用DelayExec并向其传递一个将释放该对象的匿名方法,并在内部设置一条消息,以便在消息队列被抽取后立即执行.
要接收消息,您需要有窗口句柄.您可以使用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;
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用在FHandle您受到攻击的帖子中演示的消息向对象发布消息.