Delphiのコンポーネント、これはVBとかのマイクロソフト系言語ではコントロールと呼ぶモノかも知れないが、いわゆるボタンとかのオブジェクトのこと。これを画面上に動的に配置するということをやってみた。


■ボタン1(Button1)を押すたび、Panel2というパネルにボタンを動的追加する。

procedure TSDIAppForm.Button1Click(Sender: TObject);
begin
with TButton.Create(Panel2) do begin //生成時にオーナーを指定
Parent :=Panel2; //親ウィンドウを指定
Left :=60 + panel2.ComponentCount * 10;
Top :=60 + panel2.ComponentCount * 10;
Width :=120;
Name :='てきとう' + IntToStr(panel2.ComponentCount);
Caption :='てきとう';
// OnClick :=Form1.ShowMsgBox; //イベントの動的割り当て
end;

end;

これで動的にボタンが(イベントは割り当てていないが)できる。
しかし、これを消すのに苦労した。結局はできたのだが、どうもサンプルもなさそうで、なんとなく作ったら動いたのが次のコードである。

■ボタン2(Button2)を押すと、Panel2に動的追加されたボタンを一気に削除する。

procedure TSDIAppForm.Button2Click(Sender: TObject);
var
LoopCnt: integer;
begin

For LoopCnt:= panel2.ComponentCount - 1 downto 0 do
begin

panel2.Components[LoopCnt].Destroy;
end;

end;


わかったこと
 ・For Each のようなループはない。
 ・For 分の Setp -1 に相当するのは downto である。
 ・オブジェクト等の要素番号は小カッコ()ではなく大カッコ[]を使う。