我有许多程序,当用户点击按钮时动态创建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创建的每个按钮,例如EG Button1,Button2 ... ButtonN.我猜我需要某种变量,每当用户点击按钮时它就会增加,并且它以某种方式包含在名称EG ButtonI中
听起来你只需要跟踪已经添加的所有按钮.使用容器来执行此操作:
在类型声明中添加一个容器:
uses System.Generics.Collections; .... FButtons: TList;
在窗体的构造函数中实例化它,并在析构函数中将其销毁.或者如果您愿意,可以使用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;