今回は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上にある子コントロールを取得するには、
代わりにControlsとControlCountプロパティを使用します。
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月号より)