表格是否已经公开?

时间:2012-08-13 23:29:55

标签: delphi

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

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项目之一。

有效。

但是如果有更好,更快的方法,本周我就会徘徊。

2 个答案:

答案 0 :(得分:12)

您可以使用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,那么您知道它存在,并且无需搜索它。

答案 1 :(得分:-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;

因此,在uses子句中具有Form2的任何单元都可以调用

     if Form2.FormExists then
        ...