Щелчок по первой кнопке должен создавать группу элементов управления - надпись, поле ввода и кнопку (вторая кнопка служит для удаления группы элементов). Желательно установить для размещенных кнопок выравнивание по нижнему краю.
Щелчок по кнопке из группы должен приводить к увеличению значения в соответствующем поле ввода. Элементы в группах должны размещаться слева направо - сначала надпись, затем поле ввода, затем кнопка для увеличения значения. Сами группы должны размещаться сверху вниз по всей ширине формы.
Алгоритм:
Описываем структуру, включающую в себя элементы управления (в моем примере это надпись, поле ввода и кнопка) с заданным выравниванием и панель , на которой они будут сгруппированы.
Описываем массив элементов этой структуры.
Ставим в соответствие щелчку по первой кнопке создание нового элемента, а щелчку по второй удаление элемента интерфейса.
Создание нового элемента проводим в следующем порядке: вызов конструктора, установка выравнивания. Подключаем элемент управления к циклу событий родителя, сначала группу контролов к панели, затем панель стыкуем с формой. Удаление элемента проводим в обратном порядке.
У вас должен получится примерно такой код:
- Код: Выделить всё
unit udynelems;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, ExtCtrls;
type
{ TForm1 }
groupElems = record
gB : TButton;
gL : TLabel;
gI : TEdit;
gP : TPanel;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
G : array[1..255] of groupElems;
cntBtn : byte;
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
cntBtn:=cntBtn+1;
with G[cntBtn] do
begin
gP:=TPanel.Create(Self);
gB:=TButton.Create(Self);
gI:=TEdit.Create(Self);
gL:=TLabel.Create(Self);
gP.Caption:='';
gI.Text:='0';
gL.Caption:='Подпись '+IntToStr(cntBtn);
gB.Caption:='Кнопка '+IntToStr(cntBtn);
gI.Align:=alLeft;
gI.Parent:=gP;
gL.Align:=alLeft;
gL.Parent:=gP;
gB.Align:=alClient;
gB.Parent:=gP;
gP.Align:=alTop;
gP.Height:=24;
gP.Parent:=Form1;
gB.OnClick:=Form1.OnClick;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if cntBtn=0 then exit;
with G[cntBtn] do
begin
gB.Parent:=NIL;
gI.Parent:=NIL;
gL.Parent:=NIL;
gB.Free;
gI.Free;
gL.Free;
gP.Parent:=NIL;
gP.Free;
end;
dec(cntBtn);
end;
procedure TForm1.FormClick(Sender: TObject);
var i : byte;
begin
if Sender = Form1 then exit;
for i:=1 to cntBtn do
if g[i].gB = Sender then
g[i].gI.Text:=IntToStr(1+StrToInt(g[i].gI.Text));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
cntBtn:=0;
end;
initialization
{$I udynelems.lrs}
end.
Откомпилированный бинарник: http://narod.ru/disk/3712250001/dynelems.exe.html
P.S. По многочисленным просьбам доброжелателей убрал рекламу. Не нравится, не имеет смысла, не работает - удаляйте thread, mrOk?