トップへ(mam-mam.net/)

実行時に動的にTButtonなどのコンポーネントを生成配置する ~Delphiソースコード集

検索:

実行時に動的にTButtonなどのコンポーネントを生成配置する ~Delphiソースコード集

IDE上でフォームにドラッグ&ドロップでコンポーネントを配置したり移動したりプロパティを設定するとビジュアルを確認しながら画面設計できます。
しかしながらプログラムからフォームにボタンなどのコンポーネント配置したい場合があります。
(TPageControl[VCL]やTTabControl[FMX]を使うと1つのフォーム上に複数の画面設計を行うことができますがここでは扱いません。)

画面設計

Delphi IDEを起動し、「ファイル」⇒「Windows VCLアプリケーション -Delphi」をクリックしてプロジェクトと初期フォームを作成します。
フォームが生成されたときのイベントプロシージャを記述するために
左下ペインの「オブジェクト インスペクタ」の「イベント」タブをクリックし「OnCreate」の右側の何もないところをダブルクリックします。
(Form1が生成された時に実行するソースコードを記述する為のひな形が準備されます)

以下のソースコードを記述します。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
    Button:TButton;
    ScrollBox:TScrollBox;
begin
  //スクロールボックスを生成し解放権限を持つコンポーネントをForm1に設定
  ScrollBox:=TScrollBox.Create(Form1);
  //スクロールボックスをForm1の上に配置
  ScrollBox.Parent:=Form1;
  //スクロールボックスをForm1の上での最大に広げる
  ScrollBox.Align:=TAlign.alClient;
  for i := 1 to 20 do
  begin
    //ボタンを生成し解放権限を持つコンポーネントをForm1に設定
    Button := TButton.Create(Form1);
    //ボタンの左上座標を設定
    Button.Left := 10;
    Button.Top := (i-1)*40+10;
    Button.Caption:='ボタン'+i.ToString;
    //ボタンをスクロールボックスの上に配置
    Button.Parent:=ScrollBox;
  end;
end;

end.

UsesにVcl.StdCtrlsを追加しているのは「TButton」クラスが使えるようにするためです。

ScrollBox:=TScrollBox.Create(Form1);
で「TScrollBox」クラスのオブジェクトを生成しています。
この時の引数Form1はTForm1クラスのインスタンスである「Form1」オブジェクトで、 「Form1」オブジェクトが破棄されるタイミングで「ScrollBox」を破棄してくれます。 ScrollBox:=TScrollBox.Create(nil);
とすると「ScrollBox」オブジェクトはプログラマー自身で破棄しなければならなくなります。

ScrollBox.Parent:=Form1;
でスクロールボックスをForm1の上に配置しています。

ボタンも同じようにして20個生成配置しています。

実行する

IDEの実行ボタンをクリックして実行します。
フォーム(ウィンドウ)が生成されるタイミングでスクロールボックスが生成され、 スクロールボックスの上にボタンが20個並びます。

動的に追加されたボタンにクリックイベントを追加する

追加されたボタンがクリックされた時のイベントプロシージャを設定する場合は以下ソースコードの赤字の箇所を参考にしてください。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    //ボタンがクリックされた時に呼び出されるプロシージャの宣言
    procedure BtnClick(Sender: TObject);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//ボタンがクリックされた時に呼び出されるプロシージャのソースコード
procedure TForm1.BtnClick(Sender: TObject);
begin
  ShowMessage(TButton(Sender).Caption);
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
    Button:TButton;
    ScrollBox:TScrollBox;
begin
  //スクロールボックスを生成し解放権限を持つコンポーネントをForm1に設定
  ScrollBox:=TScrollBox.Create(Form1);
  //スクロールボックスForm1の上に配置
  ScrollBox.Parent:=Form1;
  //スクロールボックスをForm1の上での最大に広げる
  ScrollBox.Align:=TAlign.alClient;
  for i := 1 to 20 do
  begin
    //ボタンを生成し解放権限を持つコンポーネントをForm1に設定
    Button := TButton.Create(Form1);
    //ボタンの左上座標を設定
    Button.Left := 10;
    Button.Top := (i-1)*40+10;
    Button.Caption:='ボタン'+i.ToString;
    //ボタンがクリックされたらBtnClickプロシージャを呼ぶ
    Button.OnClick:=BtnClick;
    //ボタンをスクロールボックスの上に配置
    Button.Parent:=ScrollBox;
  end;
end;

end.