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プロジェクトの1つでした。

できます。

しかし今週、これを行うためのより良い、より速い方法があれば、私はさまよった。

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;

したがって、uses句にForm2がある任意のユニットから、

     if Form2.FormExists then
        ...
于 2012-08-14T01:40:25.320 に答える