6

我一直在使用以下代码来检查表单是否已经存在:

function FormExists(apForm: TObject): boolean;
var i: Word;
begin
  Result := False;
  for i := 0 to Application.ComponentCount-1 do
    if Application.Components[i] = apForm then begin
      Result := True;
      Break;
    end;
end;

几年前我从我参与的一个项目中得到它。这是我的第一个 Delphi 项目之一。

有用。

但是这周我在徘徊,如果有更好,更快的方法来做到这一点。

4

2 回答 2

13

您可以使用Screen.Forms代替。它减少了您正在迭代的项目:

function FormExists(apForm: TForm): boolean;
var 
  i: Word;
begin
  Result := False;
  for i := 0 to Screen.FormCount - 1 do
    if Screen.Forms[i] = apForm then 
    begin
      Result := True;
      Break;
    end;
end;

但是,值得注意的是,如果您已经拥有它,那么您就apForm知道它存在并且无需搜索它。

于 2012-08-13T23:33:00.400 回答
-4

我发现最好的方法是询问表单本身是否打开。您可以使用 CLASS 过程/函数来执行此操作。调用表单的类过程/函数是安全的,即使它不存在。

在表单的公共声明中添加一个类函数。

  type
    TForm2 = class(TForm)
      ...
    private
      { Private declarations }
      ...
    public
      { Public declarations }
      class function FormExists:  Boolean;
    end;

  class function TForm2.FormExists: Boolean;
  var
     F: TForm2;
     I: Integer;
  begin
     F := nil;
     for i := Screen.FormCount - 1 DownTo 0 do
      if (Screen.Forms[i].Name = 'Form2') then
      begin
         F := Screen.Forms[I] As TForm2;
         break;
      end;
     Result :=  F <> nil;
  end;

因此,从使用子句中有 Form2 的任何单元都可以调用

     if Form2.FormExists then
        ...
于 2012-08-14T01:40:25.320 回答