今回はクラスを利用したコンポーネントの応用操作をご紹介します。
一括してコンポーネントに同じ操作を加えるとき、
例えばフォーム上の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
begin
(Components[i] as TEdit).Text := '';
end
else
if (Components[i].ClassType = TMemo) then
begin
(Components[i] as TMemo).Text := '';
end;
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
if (Panel1.Controls[i].ClassType = TMemo) then
begin
(Panel1.Controls[i] as TMemo).Text := '';
end;
end;
※今回のロジック中の (~~[i].ClassType = TMemo) という記法は、(~~[i] is TMemo) でも代用可能です。
※今回ご紹介した方法では、指定したコンテナ上(今回の例ではフォーム上やPanel上)の
すべてのコンポーネントに添え字を回してアクセスします。数によっては
レスポンスが遅くなることもありますので、全体の数と操作対象コンポーネント数を考慮して活用ください。