0

コンポーネントがタイプであるTMachineTLabel どうかをチェックしようとしています。

これORif Components[I] is (TMachine) or (TLabel) then修正する方法はありますか?

    procedure TfDeptLayout.FormClose(Sender: TObject; var Action: TCloseAction);
var
  I: Integer;
begin
     for I := ComponentCount -1 downto 0 do
      begin
          if Components[I] is (TMachine) or (TLabel) then
              if Components[I].Name <> Label2.Name then
                if Components[I].Name <> label3.Name then
                  components[I].Free;
      end;
end;
4

1 に答える 1

3

そのように使用することはできません。同様orに「繰り返す」必要があります。is

また、Components[I].Name を使用する必要はありません。Components[I] 参照を Label1 および Label2 参照と単純に比較するだけで十分です。

procedure TfDeptLayout.FormClose(Sender: TObject; var Action: TCloseAction);
var
  I: Integer;
begin
     for I := ComponentCount -1 downto 0 do
     begin
       if (Components[I] is TMachine) or (Components[I] is TLabel) then
         if Components[I] <> Label2 then
           if Components[I] <> label3 then
             components[I].Free;
      end;
end;

すべての条件を組み合わせることも可能です (ただし、読みにくいかもしれません)。

procedure TfDeptLayout.FormClose(Sender: TObject; var Action: TCloseAction);
var
  I: Integer;
  comp: TComponent;
begin
     for I := ComponentCount -1 downto 0 do
     begin
       Comp := Components[I];
       if (Comp is TMachine) then
         Comp.Free
       else if (Comp is TLabel) and (Comp <> Label2) and (Comp <> Label3) then
         Comp.Free;
     end;
end;

余談ですが、コード内で参照されるコンポーネントには、デフォルトの Label1、Label2... の名前を使用するのではなく、意味のある名前を付けるのが最善です。

于 2013-02-12T06:56:54.837 に答える