在 Delphi 中检查对象是否已创建

11

我正在使用Delphi 7构建一个应用程序。在主窗体上添加了一个按钮。当用户点击该按钮时,我想显示另一个窗体。我尝试只在用户第一次点击该按钮时创建第二个窗体。如果用户再次点击该按钮,则应该显示已经创建的窗体。Form对象是否有任何属性可以直接检查它是否已经创建?

我正在使用Delphi 7开发应用程序。我在主窗体上添加了一个按钮。当用户单击该按钮时,我想要显示另一个窗体。我尝试仅在用户首次单击该按钮时创建第二个窗体。如果用户再次单击该按钮,则应显示已经创建的窗体。是否有任何属性可以直接检查Form对象是否已经创建?请保留HTML标记。
4个回答

15
if Assigned(Form1) then
begin
  //form is created
end;

但是如果你的表单是在本地声明的,你必须确保将其初始化为nil


4

您需要一个成员字段来存储表单的引用。然后检查该引用是否已分配。像这样:

function TMainForm.GetOtherForm: TMyForm;
begin
  if not Assigned(FOtherForm) then
    FOtherForm := TMyForm.Create(Self);
  Result := FOtherForm;
end;

3
请确保在销毁 TOtherForm 时将变量重置为 nil,例如在 TOtherForm 的 OnDestroy 中加入 TOtherForm:= nil。除此之外,请仅翻译所提供的内容,不要添加其他信息。 - Hasan S
@Hasan 如果另一个表单被删除了。我的印象是,一旦创建了表单,它就应该是永久存在的。 - David Heffernan
为了保证代码的稳定性,即使表单在未来被显式或其他原因销毁,也要确保代码能够正常运行,以避免引入新的错误。 - Hasan S

3
有时候表单已经被释放,但不是空的。 这种情况下,Assigned检查就不太好用了。 因此,一种选择是在OnClose表单上释放表单并将MyForm:=nil设置为零。 另一种选择是使用以下过程:
function TMyForm.IsFormCreated: bool;
var i: Integer;
begin
  Result := False;
  for i := 0 to Screen.FormCount - 1 do
  begin
    if Screen.Forms[i] is TMyForm then
    begin
      Result := True;
      Break;
    end;
  end;
end;

3

即使你使用"Obj.free"释放一个已分配的对象,Assigned(Obj)仍然可能返回True。 为了确保你的对象已释放,最好使用"FreeAndNil(Obj)"来替代使用Assigned(obj)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接