我一直在使用以下代码检查表单是否已存在:
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项目之一。
有效。
但是如果有更好,更快的方法,本周我就会徘徊。
答案 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
...