Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Can';免费呼叫组件_Delphi_Delphi 7 - Fatal编程技术网

Delphi Can';免费呼叫组件

Delphi Can';免费呼叫组件,delphi,delphi-7,Delphi,Delphi 7,我试图在单击某个组件时释放它。因此,我编写了我能想象到的最简单的代码来实现这一点:一个释放发送者的过程。但在Delphi7上(在DelphiXE10上试用过,没有错误),它有时会随机抛出访问冲突或抽象错误。复制这一点最简单的方法是插入30个按钮,并用下面的代码分配一个onclick过程,然后单击它们 我在onclick上尝试了以下两种代码: procedure FreeMe(Sender: TObject); begin TButton(Sender).Free; end; 或 您需要

我试图在单击某个组件时释放它。因此,我编写了我能想象到的最简单的代码来实现这一点:一个释放发送者的过程。但在Delphi7上(在DelphiXE10上试用过,没有错误),它有时会随机抛出访问冲突或抽象错误。复制这一点最简单的方法是插入30个按钮,并用下面的代码分配一个onclick过程,然后单击它们

我在onclick上尝试了以下两种代码:

procedure FreeMe(Sender: TObject);
begin
    TButton(Sender).Free;
end;


您需要将释放延迟到按钮的
OnClick
事件处理程序完全退出之后。重要的是,当被释放的对象空闲时,释放发生,而不是在处理任何东西的过程中。 一种方法是使用
PostMessage()
,例如:

var
MyReleaseWnd:HWND;
程序tmymainformcreate(发送方:TObject);
开始
MyReleaseWnd:=AllocateHWnd(MyReleaseWndProc);
结束;
程序TMyMainForm.表格销毁(发送方:TObject);
开始
解除分配HWND(MyReleaseWnd);
结束;
程序TMyMainForm.MyReleaseWndProc(var消息:TMessage);
开始
如果Message.Msg=CM\u释放,则
TObject(Msg.LParam).免费
其他的
Message.Result:=deffwindowproc(MyReleaseWnd,Message.Msg,Message.WParam,Message.LParam);
结束;
程序延迟FreeMe(发送方:TObject);
开始
PostMessage(MyReleaseWnd,CM_RELEASE,0,lpram(发送方));
结束;
或者,在10.2及更高版本中,您可以使用
TThread.ForceQueue()

procedure DelayFreeMe(发送方:TObject);
开始
ForceQueue(nil,Sender.Free);
结束;
无论哪种方式,您都可以执行以下操作:

procedure TSomeForm.button单击(发送方:TObject);
开始
延迟释放我(发送者);
结束;

底线是您不能这样做,因为按钮对象调用了事件处理程序,当事件处理程序返回时,执行返回到按钮对象的方法。你刚刚杀了他。因此,现在您已经有了执行的方法,
Self
对于这些方法无效,它们已被销毁。感谢David的建议。我看到了你的建议,也许我可以试试邮件后的。如何使用post消息释放按钮?取决于按钮类型、VCL或FMX等。这是标准的VCL@DavidHeffernan你可以想怎么辩论就怎么辩论,上面提到的DUP与这个问题相似,但不是完全重复。不同的场景,有不同的答案。这就是我重新提出这个问题的原因。这就是我想说的。
procedure FreeMe(Sender: TObject);
begin
    (Sender as TButton).Free;
end;