由于工作需要,动态创建控件,包括文本,图片,GIF动图,按钮等控件,并根据不同的值,显示不能的内容,需要在运行时来改变状态,由此只能使用动态创建控件来实现功能上的要求。
动态创建控件还是比较管理,但动态管理与赋值还是相对比较麻烦,原来是使用FindComponent来实现,但是可能是创建在不同的组件下面,无法循环还实现,现有利用 List 泛型来实现。
首先引用:
System.Generics.Collections
定义类型:
type
TControlPakage = record
name: string;
control: TObject;
end;
//申明变量
var
ControlList: TList<TControlPakage>;
其它操作:
procedure TForm1.FormCreate(Sender: TObject);
begin
//创建
ControlList := TList<TControlPakage>.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
//释放
ControlList.Free;
end;
//动态创建控件
procedure TForm1.Button1Click(Sender: TObject);
var i, x, y, t: integer;
txtLabel: TLabel;
ctrObj: TControlPakage;
begin
t := 0;
for i := 0 to 20 do
begin
txtLabel := TLabel.Create(Panel1);
with txtLabel do
begin
if y <> ((i div 10) + 1) * 40 then
begin
y := ((i div 10) + 1) * 40;
t := 0;
end;
Inc(t);
x := (t - 1) * 40 + 10;
Position.X := x;
Position.Y := y;
Width := 35;
Height := 30;
Text := IntToStr(i);
Parent := Panel1;
Visible := True;
end;
ctrObj.name := 'txt';
ctrObj.control := txtLabel;
ControlList.Add(ctrObj);
end;
end;
//动态赋值
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
txt: string;
begin
for i := 0 to ControlList.Count - 1 do
begin
if ControlList[i].name = 'txt' then
begin
txt := (ControlList[i].control as TLabel).Text;
(ControlList[i].control as TLabel).Text := IntToStr(StrToInt(txt) + 1);
end;
end;
end;