一括してコンポーネントに同じ操作を加えるとき、
例えばフォーム上のTEditの内容をクリアするなどどのようにされているでしょうか。
ひとつひとつのコンポーネントのTextプロパティをクリアする方法がよく行われていると思いますが、
フォームのComponentsおよびComponentCountプロパティを使用すると
フォーム上のすべてのコントロールを調べることができます。
Componentsはそのフォームが所有するすべてのコンポーネントリストで、
添え字を使うと、各コンポーネントにアクセスできます。
ComponentCountはそのフォームが所有するコンポーネントの数を取得できます。
例えばフォーム上のすべてのEditとMemoコンポーネントの
Textプロパティをクリアしたい場合、次のようになります。
var
i : integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[i].ClassType = TEdit then
(Components[i] as TEdit).Text := ''
else
if Components[i].ClassType = TMemo then
(Components[i] as TMemo).Text := '';
end;
end;
この応用として「Panel1」という名前のTPanel上のTEditをクリアしたい場合には、
Panelに対してはComponents及びComponentCountプロパティは使用しません。
これはComponents及びComponentCountは、フォームが所有するコンポーネントを表すためで、
Panel1上の子コントロールを取得するには、ControlsとControlCountプロパティを使用します。
Panel1上のEditとMemoコンポーネントのTextプロパティをクリアする場合、次のコードになります。
for i := 0 to Panel1.ControlCount - 1 do
begin
if Panel1.Controls[i].ClassType = TEdit then
begin
(Panel1.Controls[i] as TEdit).Text := '';
end
else
begin
if Panel1.Controls[i].ClassType = TMemo then
begin
(Panel1.Controls[i] as TMemo).Text := '';
end;
end;
end;
ただしこの方法ですと、指定したコンテナ上(今回の例ではフォーム上やPanel上)の
すべてのコンポーネントに添え字を回してアクセスします。
数によっては、レスポンスが遅くなることもありますので、
全体の数と操作対象コンポーネント数を考慮して下さい。
(ミガロ.情報マガジン「MIGARO News!!」Vol.109 2009年12月号より)