Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】同じクラスのコンポーネントをまとめて操作

一括してコンポーネントに同じ操作を加えるとき、
例えばフォーム上の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上の子コントロールを取得するには、ControlsControlCountプロパティを使用します。

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月号より)