我有很多程序可以在用户点击按钮时动态创建TButton。以下代码就是一个例子:
procedure TForm1.Button2Click(Sender: TObject);
begin
if not Assigned(FSeatButton) then begin
FSeatButton := TButton.Create(self);
FSeatButton.Parent := self;
FSeatButton.Left := 100;
FSeatButton.Top := 100;
FSeatButton.Width := 62;
FSeatButton.Height := 25;
FSeatButton.Caption := ('Seat');
FSeatButton.OnMouseDown := ButtonMouseDown;
FSeatButton.OnMouseMove := ButtonMouseMove;
FSeatButton.OnMouseUp := ButtonMouseUp;
end;
end;
这会创建一个Tbutton,用户可以通过底部3程序拖动它。每次用户点击button2时我都需要重复此过程但是如果我使用for / repeat循环id必须指定何时结束它,但我不知道用户需要生成多少个按钮。
另外(这可能是另一个问题的想法),如何保存使用自己的ID创建的每个按钮,如E.G Button1,Button2 ... ButtonN。我猜我需要某种变量,每当用户点击按钮时它就会增加,并且它以某种方式包含在名称E.G ButtonI
中答案 0 :(得分:5)
听起来您只需要跟踪已添加的所有按钮。使用容器来执行此操作:
在类型声明中添加一个容器:
uses
System.Generics.Collections;
....
FButtons: TList<TButton>;
在表单的构造函数中实例化它,并在析构函数中将其销毁。如果您愿意,也可以使用OnCreate
和OnDestroy
个活动。
然后,当您创建按钮时,将其添加到列表中:
procedure TForm1.Button2Click(Sender: TObject);
var
Button: TButton;
begin
Button := TButton.Create(self);
Button.Parent := Self;
Button.Left := 100;
// etc.
FButtons.Add(Button);
end;
如果您在创建按钮后不需要参考按钮,那么您不需要列表,您可以这样做:
procedure TForm1.Button2Click(Sender: TObject);
var
Button: TButton;
begin
Button := TButton.Create(self);
Button.Parent := Self;
Button.Left := 100;
end;
答案 1 :(得分:2)
声明FSeatButton : array of TButton;
这样,您就可以获得添加按钮的唯一实例,并可以按顺序命名。
每次点击Button2
时,都会向数组中添加一个新按钮:
procedure TForm1.Button2Click(Sender: TObject);
var
len: Integer;
begin
len := Length(FSeatButton);
SetLength(FSeatButton,len+1);
FSeatButton[len] := TButton.Create(self);
FSeatButton[len].Name := 'SeatButton'+IntToStr(len);
etc...
end;