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ループをするだけ。簡単です。