鳥の巣箱

ネトゲしたり、機械いじったり、ソフト書いたり、山篭ったり、ギャンブルしたりする人

Delphiで複数のコンポーネントに対する操作をforループなどで処理する

Delphiで複数のコンポーネントに対して、同じような処理をする場合
for文などを使って一気に処理したい、記述したいという場面は結構あると思います。

ここでは私がよく使う方法を書いておきます。

コンポーネントを配列化する

やり方は単純で、コンポーネントを配列にすることです。
例えばこんな感じ。

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.Edit, FMX.StdCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
    Edit  : Array[1..5] of TEdit;
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  for I := 1 to Length(Edit) do
    begin
      Edit[I].Text  := IntToStr(I);
    end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Edit[I] := Edit1;
  Edit[I] := Edit2;
  Edit[I] := Edit3;
  Edit[I] := Edit4;
  Edit[I] := Edit5;
end;

end.

TEditコンポーネントがフォームに1~5まで配置してあります。
publicにTEdit型の配列を宣言しておき、FormのOnCreateで配列にそれぞれのコンポーネントを代入していきます。
こうすることで

  for I := 1 to Length(Edit) do
    begin
      Edit[I].Text  := IntToStr(I);
    end;

のように、複数のTEdit.Textプロパティに対して一括処理ができます。
記述の行数もぐっと減るのでコーディングも楽になります。

とはいえ。。。
今回の例では5つでしたが、これがもっと数が増えた時はいちいち代入式を書いてられなくなります。
なので自動的に配列に代入してほしくなってきます。

コンポーネント名から自動的にコンポーネント配列へ代入

ということで、先程のソースのFormCreateプロシージャを少し修正します。

procedure TForm2.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 1 to Length(Edit) do
    begin
      Edit[I] := TEdit(FindComponent('Edit'+IntToStr(I)));
    end;
end;

こんな具合です。
System.ClassesのFindComponentを使います。
FindComponentはTComponent型を返しますので、今回の場合はTEditでキャストしています。
対象となるTEditはEdit1~Edit5と共通名+連番の名前がついているので、

'Edit'+IntToStr(I)

コンポーネントを探します。あとはIのforループをするだけ。簡単です。

余談

この方法はFMXVCL問わずどちらにも使えます。
ですが、これはフォームデザイナであらかじめコンポーネントをフォーム上へ配置している場合に使う方法です。
極端な話、この方法で同じようなコンポーネントを100個とか使う場合、いちいちフォームデザイナから配置するのは面倒です。
この場合、配列だけ宣言しておいてコンポーネントの生成はプログラム上で行うやりかたがあります。(動的生成)
この方法は、VCLでもFMXでもほとんど同じ書き方ができますが、コンポーネントの性質が微妙に異なるので生成した後はそれに応じた書き方をすることになります。
なので、こちらはまた後日紹介するとします。