Migaro. 技術Tips

                       

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


Delphi フォーム上のコンポーネントを一括処理

今回はDelphi/400でフォーム上のコンポーネントを一括処理する
プログラミングテクニックをご紹介いたします。


一括してコンポーネントに同じ操作を加えるとき
(例えばフォーム上の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」という名前のPanelコンポーネント上の各Editを
クリアしたい場合、Panelに対してはComponents及びComponentCountの
プロパティは使用できません。

Components及びComponentCountは、コンポーネントが所有するコンポーネントを
表すためで、Panel上にある子コントロールを取得するには、
代わりにControlsControlCountプロパティを使用します。

Panel1上のEditとMemoコンポーネントのTextプロパティをクリアする場合、
次のようなコードになります。

 

  var
    i  :  integer;
  begin
    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;
  end;

 


 

今回ご紹介した方法では、指定したコンテナ上(今回の例ではフォーム上やPanel上)の
すべてのコンポーネントに添え字を回してアクセスします。

数によっては、レスポンスが遅くなることもありますので、
全体のコンポーネント数と操作対象コンポーネント数を考慮してご活用ください。

 

 

 

(ミガロ.情報マガジン「MIGARO News!!」Vol.197 2017年4月号より)