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
    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上の子コントロールを取得するには、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
    if (Panel1.Controls[i].ClassType = TMemo) then
    begin
      (Panel1.Controls[i] as TMemo).Text := '';
    end;
  end;

 

※今回のロジック中の (~~[i].ClassType = TMemo) という記法は、(~~[i] is TMemo) でも代用可能です。

※今回ご紹介した方法では、指定したコンテナ上(今回の例ではフォーム上やPanel上)の
 すべてのコンポーネントに添え字を回してアクセスします。数によっては
 レスポンスが遅くなることもありますので、全体の数と操作対象コンポーネント数を考慮して活用ください。

 

 

(ミガロ.情報マガジン「MIGARO News!!」Vol.215 2018年10月号より)