在每个放置表单的类中实现 IsBusy 属性(使用继承 - 在父表单中实现此属性)。在从托管面板中删除表单之前(无论是通过调用 Free 还是简单地从面板中移动),检查它的 IsBusy 是否不正确。如果您的托管表单正忙,请等到它完成,然后将其删除。您甚至可以添加一些方法来通知托管表单,它应该中止其长时间运行的任务。
它不仅可以帮助您解决当前的问题,而且您还可以清理表单中的一些业务逻辑。
因此,TreeView 中的表单更改代码应包含以下代码:
{FCurrentForm is a reference to currently placed form on panel}
if (FCurrentForm.IsBusy) do
begin
{remember some information that will be used to create new form}
FNewFormToBeAdded := ...
end
else
begin
FreeCurrentForm();
PlaceNewFormOnPanel();
end;
因此,您应该有一些例程,例如:
procedure THostForm.NotifyMeAboutTaskFinished;
begin
if FNewFormToBeAdded <> 0 than
begin
FreeCurrentForm();
PlaceNewFormOnPanel();
end;
end;
在您的托管形式中,您可以拥有
procedure TSomeHostedForm.btnDoLongTaskClick(Sender : TObject);
begin
IsBusy := true;
try
{... do some tikme taking task ...}
finally
IsBusy :=false;
NotifyHostingFormIAMNotBusyAnymore();
end;
end;