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 である。
・オブジェクト等の要素番号は小カッコ()ではなく大カッコ[]を使う。
■ボタン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 である。
・オブジェクト等の要素番号は小カッコ()ではなく大カッコ[]を使う。