Динамічне створення компонентів

Сьогодні поговоримо про те, як створювати компоненти під час роботи програми.

Іноді заздалегідь не відомо кількість компонентів. Тому в Delphi є можливість створити їх з програми. Для цього досить викликати конструктор Create, встановити потрібні властивості і події. А для появи компонента на екран потрібно встановити властивість Parent.

При натисканні на ліву кнопку миші ця програма створює Button, а при натисканні на праву - Panel. Причому компоненти створюються там, де знаходиться миша. Якщо Ви натиснули на Panel1, то компонент з'явиться на Panel1.
.
public
procedure OnButtonClick (Sender: TObject);
end;

var
Form1: TForm1;

uses stdctrls, extctrls;

procedure TForm1.OnButtonClick (Sender: TObject);
begin
if Sender is TButton then
with (Sender as TButton) do
Caption: = Caption + '1';
end;

procedure TForm1.FormMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var b: TButton;
p: TPanel;
begin
if Button = mbRight then
begin
p: = TPanel.Create (nil);
p.Caption: = 'Panel' + IntToStr (random (100));
p.Left: = X;
p.Top: = Y;
p.Width: = random (200) + 100;
p.Height: = random (200) + 100;
p.OnMouseDown: = Form1.OnMouseDown;
p.Parent: = Sender as TWinControl;
end else
begin
b: = TButton.Create (nil);
b.Caption: = 'Button' + IntToStr (random (100));
b.ShowHint: = true;
b.Hint: = 'Hint for' + b.Caption;
b.Left: = X;
b.Top: = Y;
b.OnClick: = OnButtonClick;
b.Parent: = Sender as TWinControl;
end;
end;

Але може знадобитися щось робити з компонентами після їх створення. В цьому випадку потрібно створити масив, в якому будуть лежати ці компоненти. Ця програма зберігає в масиві 100 кнопок. При зміні розміру вікна кнопки перегрупуються.

var
b: array [0..99] of TButton;

procedure TForm1.FormCreate (Sender: TObject);
var i: integer;
c: integer;
begin
c: = Form1.ClientWidth div 52;
for i: = low (b) to high (b) do
begin
b [i]: = TButton.Create (nil);
b [i] .Caption: = IntToStr (i + 1);
b [i] .Width: = 50;
b [i] .Height: = 20;
b [i] .Left: = 52 * (i mod c);
b [i] .Top: = 22 * ​​(i div c);
b [i] .Parent: = Form1;
end;
end;

procedure TForm1.FormResize (Sender: TObject);
var i: integer;
c: integer;
begin
c: = Form1.ClientWidth div 52;
for i: = low (b) to high (b) do
begin
b [i] .Left: = 52 * (i mod c);
b [i] .Top: = 22 * ​​(i div c);
end;
end;

Схожі статті