7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Delphi でコントロール配列 [小ネタ]

Last updated at Posted at 2020-05-08

はじめに

Delphi には (Classic) Visual Basic のようなコントロール配列はありませんが、コントロールの配列にコントロールを割り当てる事で似たような事ができました。

今回は動的配列でそれをやってみます。

コード

TButton の動的配列を作るコードとなります。
image.png
テストは VCL アプリケーションで行いますが、FireMonkey でも考え方は同じです。

Delphi 2005 以降

Delphi 2005 以降だと配列コンストラクタが使えるので、次のような書き方ができます。

procedure TForm1.FormShow(Sender: TObject);
type
  TBtnDynArray = array of TButton;
var
  BtnArr: TBtnDynArray;
  i: Integer;
begin
  OnShow := nil;

  BtnArr := TBtnDynArray.Create(
              TButton.Create(Self),
              TButton.Create(Self),
              TButton.Create(Self)
            );

  for i:=Low(BtnArr) to High(BtnArr) do
    with BtnArr[i] do
      begin
        Parent  := Self;
        Width   := 96;
        Height  := 24;
        Left    := 12;
        Top     := i * 32 + 12;
        Caption := Format('Button_%.2d', [Succ(i)]);
      end;
end;

See also:

Delphi XE7 以降

Delphi XE7 以降だと配列定数式が使えるので、次のような書き方ができます。

procedure TForm1.FormShow(Sender: TObject);
var
  BtnArr: array of TButton;
  i: Integer;
begin
  OnShow := nil;

  BtnArr := [
              TButton.Create(Self),
              TButton.Create(Self),
              TButton.Create(Self)
            ];

  for i:=Low(BtnArr) to High(BtnArr) do
    with BtnArr[i] do
      begin
        Parent  := Self;
        Width   := 96;
        Height  := 24;
        Left    := 12;
        Top     := i * 32 + 12;
        Caption := Format('Button_%.2d', [Succ(i)]);
      end;
end;

後でコントロールを足す事もできます。

  BtnArr := BtnArr + [TButton.Create(Self)];

  with BtnArr[High(BtnArr)] do
    begin
      Parent  := Self;
      Width   := 96;
      Height  := 24;
      Left    := 12;
      Top     := High(BtnArr) * 32 + 12;
      Caption := Format('Button_%.2d', [Length(BtnArr)]);
    end;

See also:

Delphi 10.3 Rio 以降

Delphi 10.3 Rio 以降だとインライン変数宣言型推論ができるので、次のような書き方ができます。

procedure TForm1.FormShow(Sender: TObject);
begin
  OnShow := nil;

  var BtnArr := [
                  TButton.Create(Self),
                  TButton.Create(Self),
                  TButton.Create(Self)
                ];

  for var i:=Low(BtnArr) to High(BtnArr) do
    with BtnArr[i] do
      begin
        Parent  := Self;
        Width   := 96;
        Height  := 24;
        Left    := 12;
        Top     := i * 32 + 12;
        Caption := Format('Button_%.2d', [Succ(i)]);
      end;
end;

See also:

おわりに

新しい機能を使うと便利な書き方ができるものですね。

See also:

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?