Сегодня поговорим о том, как создавать компоненты во время работы программы.
Иногда заранее не известно количество компонентов. Поэтому в Delphi есть возможность создать их из программы. Для этого достаточно вызвать конструктор Create, установить нужные свойства и события. А для появления компонента на экран нужно установить свойство Parent.
При нажатии на левую кнопку мыши эта программа создает Button, а при нажатии на правую - Panel. Причем компоненты создаются там, где находится мышь. Если Вы нажали на Panel1, то компонент появится на Panel1. ... public procedure OnButtonClick(Sender: TObject); end;
var Form1: TForm1;
implementation
{$R *.DFM}
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;
|