Вот набросал пример:
Код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Contnrs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
btCreate: TButton;
ScrollBox1: TScrollBox;
btGetChecked: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btCreateClick(Sender: TObject);
procedure btGetCheckedClick(Sender: TObject);
private
{ Private declarations }
FCheckListBoxControls : TObjectList;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btCreateClick(Sender: TObject);
var
I : Integer;
S : String;
iTop : Integer;
cCheckBox : TCheckBox;
cLabel : TLabel;
begin
FCheckListBoxControls.Clear;
iTop := 4; // Top position of first compenent in ScrollBox
for I := 0 to Memo1.Lines.Count-1 do
begin
S := Memo1.Lines[i];
if S[1] = '-' then
begin
Delete(S,1,1);
cLabel := TLabel.Create(Nil);
cLabel.Parent := ScrollBox1;
cLabel.Left := 4;
cLabel.Top := iTop;
cLabel.AutoSize := True;
cLabel.Caption := S;
FCheckListBoxControls.Add(cLabel);
end
else
begin
cCheckBox := TCheckBox.Create(Nil);
cCheckBox.Parent := ScrollBox1;
cCheckBox.Left := 12;
cCheckBox.Top := iTop;
cCheckBox.Caption := S;
FCheckListBoxControls.Add(cCheckBox);
end;
iTop := iTop + 12; // 8 for component + 4 for spacing
end;
end;
procedure TForm1.btGetCheckedClick(Sender: TObject);
var
I : Integer;
S : String;
begin
S := 'The following items are checked:'#13#10;
for I := 0 to FCheckListBoxControls.Count-1 do
if FCheckListBoxControls.Items[i] Is TCheckBox then
if (FCheckListBoxControls.Items[i] As TCheckBox).Checked then
S := S + ' ' + (FCheckListBoxControls.Items[i] As TCheckBox).Caption + #13#10;
ShowMessage(S);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FCheckListBoxControls := TObjectList.Create;
FCheckListBoxControls.OwnsObjects := True;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FCheckListBoxControls.Clear;
FCheckListBoxControls.Free;
end;
end.
В Memo1 находится список того, что надо создавать.
Заголовок помечен символом '-' на первом месте. Код убирает этот символ и остальное использует как заголовок.
Почему в ScrollBox - на случай, если кол-во элементов больше, чем размеры родительского компонента.
Зачем TObjectList - что бы потом 1) иметь доступ к компонентам и 2) их корректно удалять (FCheckListBoxControls.OwnsObjects := True делаем список владельцем его итемов, т.е. при удалении итема из списка будет вызван деструктор этого итема).
Дальше, надеюсь, сам разберешься.